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);
            }
        }
Esempio n. 3
0
        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();
        }