internal override void Emit(EmitContext ec) { TypeManager.BeginScope(); ILGenerator old_ig = ec.ig; ec.ig = this.ig; ((ICanModifyContext)func_obj.body).EmitDecls(ec); func_obj.body.Emit(ec); string func_name = func_obj.name; if (SemanticAnalyser.MethodContainsEval(func_name)) { CodeGenerator.load_local_vars(ec.ig, true); } else { VariableDeclaration decl = SemanticAnalyser.OutterScopeVar(func_name); if (decl == null) { decl = SemanticAnalyser.VarUsedNested(func_name); if (decl != null) { CodeGenerator.load_local_vars(ec.ig, InFunction); } } else { CodeGenerator.locals_to_stack_frame(ec.ig, decl.lexical_depth, lexical_depth - decl.lexical_depth, true); } } this.ig.Emit(OpCodes.Ret); ec.ig = old_ig; TypeManager.EndScope(); }
internal override void Emit(EmitContext ec) { TypeManager.BeginScope(); string name = func_obj.name; string full_name; TypeBuilder type = ec.type_builder; ILGenerator ig = ec.ig; if (prefix == null || prefix == String.Empty) { if (name == String.Empty) { full_name = SemanticAnalyser.NextAnonymousMethod; } else { full_name = name; } } else { if (name == String.Empty) { full_name = prefix + "." + SemanticAnalyser.NextAnonymousMethod; } else { full_name = prefix + "." + name; } } MethodBuilder method_builder = type.DefineMethod(full_name, func_obj.attr, HandleReturnType, func_obj.params_types()); MethodBuilder tmp = (MethodBuilder)TypeManager.Get(name); if (tmp == null) { TypeManager.Add(name, method_builder); } else { TypeManager.Set(name, method_builder); } set_custom_attr(method_builder); EmitContext new_ec = new EmitContext(ec.type_builder, ec.mod_builder, method_builder.GetILGenerator()); if (InFunction) { local_script_func = ig.DeclareLocal(typeof(ScriptFunction)); local_func = ig.DeclareLocal(typeof(FunctionObject)); } else { if (name != String.Empty) { field = type.DefineField(name, typeof(object), FieldAttributes.Public | FieldAttributes.Static); local_func = ig.DeclareLocal(typeof(FunctionObject)); } else { local_func = ig.DeclareLocal(typeof(FunctionObject)); } } build_closure(ec, full_name, func_obj.source); func_obj.body.Emit(new_ec); new_ec.ig.Emit(OpCodes.Ret); TypeManager.EndScope(); }