Exemple #1
0
        private void BuildHook(MethodBuilder methodBuilder, CompiledPeg peg, MethodBuilder[] methodBuilders, FieldBuilder[] memoizationFields)
        {
            var generator = methodBuilder.GetILGenerator();

            if (EmitErrorInfo)
            {
                generator.Emit(OpCodes.Ldarg_0);
                generator.Emit(OpCodes.Ldc_I4, peg.Methods.Count);
                generator.Emit(OpCodes.Newarr, typeof(char *));
                generator.Emit(OpCodes.Stfld, entryPointsField);

                generator.Emit(OpCodes.Ldarg_0);
                generator.Emit(OpCodes.Ldc_I4, peg.Methods.Count);
                generator.Emit(OpCodes.Newarr, typeof(char *));
                generator.Emit(OpCodes.Stfld, exitPointsField);
            }

            if (EnableMemoization)
            {
                foreach (var field in memoizationFields)
                {
                    if (field != null)
                    {
                        generator.Emit(OpCodes.Ldarg_0);
                        generator.Emit(OpCodes.Ldarg_0);
                        generator.Emit(OpCodes.Ldfld, dataSizeField);
                        generator.Emit(OpCodes.Ldc_I4_1);
                        generator.Emit(OpCodes.Add);
                        generator.Emit(OpCodes.Newarr, typeof(UnsafePatternResult));
                        generator.Emit(OpCodes.Stfld, field);
                    }
                }
            }

            generator.BeginScope();
            generator.Emit(OpCodes.Ldarg_0);
            generator.Emit(OpCodes.Ldarg_1);
            generator.EmitCall(OpCodes.Call, methodBuilders[peg.StartPatternIndex], null);
            generator.Emit(OpCodes.Ret);

            generator.EndScope();
        }
Exemple #2
0
        private Type CompileInternal(CompiledPeg peg)
        {
            var methods       = peg.Methods;
            var moduleBuilder = CreateModuleBuilder();
            var typeBuilder   = moduleBuilder.DefineType("InternalType", TypeAttributes.Public | TypeAttributes.Class, typeof(BaseJittedRunner));

            var hookAttributes = MethodAttributes.Public | MethodAttributes.ReuseSlot | MethodAttributes.Virtual | MethodAttributes.HideBySig;
            var hook           = typeBuilder.DefineMethod("RunInternal", hookAttributes, typeof(UnsafePatternResult), new[] { typeof(char *) });
            var methodBuilders = methods
                                 .Select((method, i) => typeBuilder.DefineMethod($"Pattern_{method}_{i}", MethodAttributes.Private | MethodAttributes.HideBySig, typeof(UnsafePatternResult), new[] { typeof(char *) }))
                                 .ToArray();
            var memoizationFields = EnableMemoization ? methods.Select((method, i) => typeBuilder.DefineField($"memoization_{method}_{i}", typeof(UnsafePatternResult[]), FieldAttributes.Private)).ToArray() : null;

            BuildHook(hook, peg, methodBuilders, memoizationFields);
            BuildConstructor(typeBuilder.DefineConstructor(MethodAttributes.Public, CallingConventions.Standard, new Type[] { typeof(List <Method>) }));

            for (var i = 0; i < methodBuilders.Length; i++)
            {
                CompileSinglePattern(i, methods, methodBuilders, memoizationFields);
            }

            return(typeBuilder.CreateTypeInfo().UnderlyingSystemType);
        }
Exemple #3
0
 public CompiledPeg Optimize(CompiledPeg peg)
 {
     return(new CompiledPeg(peg.Methods.Select(method => OptimizeSingleMethod(method)).ToList(), peg.StartPatternIndex));
 }
Exemple #4
0
 public IRunnerFactory CompileAsFactory(CompiledPeg peg)
 {
     return(new ILRunnerFactory(CompileInternal(peg), peg.Methods));
 }
Exemple #5
0
 public IRunner Compile(CompiledPeg peg)
 {
     return((IRunner)Activator.CreateInstance(CompileInternal(peg), new object[] { peg.Methods }));
 }
Exemple #6
0
        public IRunnerFactory CompileAsFactory(CompiledPeg compiledPeg)
        {
            var labelPositions = compiledPeg.Methods.Select(item => CalculateLabelPositions(item)).ToArray();

            return(new InterpreterFactory(compiledPeg.StartPatternIndex, compiledPeg.Methods, labelPositions));
        }