public ASTNodeVisitor_JITCompiler(TypeBuilder parentTypeBuilder, ASTNode_Lambda node) { mLambdaNode = node; TypeBuilder = parentTypeBuilder.DefineNestedType(JITInterpreter_DS2.Instance().GenernateUniqueString("closure"), TypeAttributes.NestedPublic); ConstructorBuilder = TypeBuilder.DefineDefaultConstructor(MethodAttributes.Public); FieldBuilders = new Dictionary <FreeAddress, FieldBuilder>(); foreach (var address in mLambdaNode.GetFreeAddresses()) { FieldBuilders[address] = TypeBuilder.DefineField(address.ToString(), typeof(SharedValue), FieldAttributes.Public); } if (HasThisArgument()) { MethodBuilder = TypeBuilder.DefineMethod( "Invoke", MethodAttributes.Public, CallingConventions.HasThis, typeof(object), Enumerable.Repeat(typeof(object), mLambdaNode.formalCount).ToArray()); } else { MethodBuilder = TypeBuilder.DefineMethod( "Invoke", MethodAttributes.Static | MethodAttributes.Public, CallingConventions.Standard, typeof(object), Enumerable.Repeat(typeof(object), mLambdaNode.formalCount).ToArray()); } mILGenerator = MethodBuilder.GetILGenerator(); DeclareLocals(); mTaillCallFlags.Push(true); mLambdaNode.bodyNode.AcceptVisitor(this); mTaillCallFlags.Pop(); mILGenerator.Emit(OpCodes.Ret); TypeBuilder.CreateType(); }
public void Visit(ASTNode_Lambda node) { var childCompiler = new ASTNodeVisitor_JITCompiler(TypeBuilder, node); if (childCompiler.MethodBuilder.IsStatic) { mILGenerator.Emit(OpCodes.Ldnull); mILGenerator.Emit(OpCodes.Ldftn, childCompiler.MethodBuilder); mILGenerator.Emit(OpCodes.Newobj, JITInterpreter_DS2.Instance().GetDelegateType(node.formalCount). GetConstructor(new Type[] { typeof(object), typeof(IntPtr) })); } else { mILGenerator.Emit(OpCodes.Newobj, childCompiler.ConstructorBuilder); foreach (var address in node.GetFreeAddresses()) { mILGenerator.Emit(OpCodes.Dup); if (address.envIndex == 1) { JITInterpreter_DS2.EmitLoadLocal(mILGenerator, (LocalBuilder)mLocalBuilders[address.index]); } else { JITInterpreter_DS2.EmitLoadThis(mILGenerator); mILGenerator.Emit(OpCodes.Ldfld, FieldBuilders[address.GetOuterAddress()]); } mILGenerator.Emit(OpCodes.Stfld, childCompiler.FieldBuilders[address]); } mILGenerator.Emit(OpCodes.Ldftn, childCompiler.MethodBuilder); mILGenerator.Emit(OpCodes.Newobj, JITInterpreter_DS2.Instance().GetDelegateType(node.formalCount) .GetConstructor(new Type[] { typeof(object), typeof(IntPtr) })); } }
public void Visit(ASTNode_Lambda node) { ChildrenFreeAddresses.UnionWith(node.GetFreeAddresses().Select( address => address.GetOuterAddress())); }
public ASTNodeVisitor_JITCompiler(TypeBuilder parentTypeBuilder, ASTNode_Lambda node) { mLambdaNode = node; TypeBuilder = parentTypeBuilder.DefineNestedType(JITInterpreter_DS2.Instance().GenernateUniqueString("closure"), TypeAttributes.NestedPublic); ConstructorBuilder = TypeBuilder.DefineDefaultConstructor(MethodAttributes.Public); FieldBuilders = new Dictionary<FreeAddress, FieldBuilder>(); foreach (var address in mLambdaNode.GetFreeAddresses()) { FieldBuilders[address] = TypeBuilder.DefineField(address.ToString(), typeof(SharedValue), FieldAttributes.Public); } if (HasThisArgument()) { MethodBuilder = TypeBuilder.DefineMethod( "Invoke", MethodAttributes.Public, CallingConventions.HasThis, typeof(object), Enumerable.Repeat(typeof(object), mLambdaNode.formalCount).ToArray()); } else { MethodBuilder = TypeBuilder.DefineMethod( "Invoke", MethodAttributes.Static | MethodAttributes.Public, CallingConventions.Standard, typeof(object), Enumerable.Repeat(typeof(object), mLambdaNode.formalCount).ToArray()); } mILGenerator = MethodBuilder.GetILGenerator(); DeclareLocals(); mTaillCallFlags.Push(true); mLambdaNode.bodyNode.AcceptVisitor(this); mTaillCallFlags.Pop(); mILGenerator.Emit(OpCodes.Ret); TypeBuilder.CreateType(); }