internal void create_closure(EmitContext ec) { string name = func_obj.name; string full_name; TypeBuilder type = ec.type_builder; ILGenerator ig = ec.ig; if (prefix == String.Empty) { full_name = name; } 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); this.ig = method_builder.GetILGenerator(); if (parent == null || parent.GetType() == typeof(ScriptBlock)) { type.DefineField(name, typeof(Microsoft.JScript.ScriptFunction), FieldAttributes.Public | FieldAttributes.Static); } else { local_func = ig.DeclareLocal(typeof(Microsoft.JScript.ScriptFunction)); TypeManager.AddLocalScriptFunction(name, local_func); } build_closure(ec, full_name, func_obj.source); }
void ICanModifyContext.EmitDecls(EmitContext ec) { object var; if ((var = CodeGenerator.variable_defined_in_current_scope(id)) != null) { Type t = var.GetType(); if (t == typeof(FieldBuilder)) { field_info = (FieldBuilder)var; } else if (t == typeof(LocalBuilder)) { local_builder = (LocalBuilder)var; } return; } ILGenerator ig = ec.ig; if (parent == null || (parent.GetType() != typeof(FunctionDeclaration) && parent.GetType() != typeof(FunctionExpression))) { FieldBuilder field_builder; TypeBuilder type_builder = ec.type_builder; field_builder = type_builder.DefineField(id, this.type, FieldAttributes.Public | FieldAttributes.Static); TypeManager.Add(id, field_builder); field_info = field_builder; } else { local_builder = ig.DeclareLocal(type); TypeManager.Add(id, local_builder); } }
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(); }