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();
}