Пример #1
0
        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();
        }
Пример #2
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();
        }