Exemplo n.º 1
0
        internal void build_closure(EmitContext ec, string full_name, string encodedSource)
        {
            ILGenerator ig   = ec.ig;
            string      name = func_obj.name;
            Type        t    = ec.mod_builder.GetType(CodeGenerator.GetTypeName(Location.SourceName));

            ig.Emit(OpCodes.Ldtoken, t);
            ig.Emit(OpCodes.Ldstr, name);
            ig.Emit(OpCodes.Ldstr, full_name);

            func_obj.parameters.Emit(ec);
            build_local_fields(ig);

            //
            // If we have en eval method call, we have to
            // save the loca vars in the stack
            //
            if (SemanticAnalyser.MethodContainsEval(name) ||
                SemanticAnalyser.MethodVarsUsedNested(name))
            {
                ig.Emit(OpCodes.Ldc_I4_1);
            }
            else
            {
                ig.Emit(OpCodes.Ldc_I4_0);
            }

            ig.Emit(OpCodes.Ldc_I4_0);            // FIXME: this hard coded for now.
            ig.Emit(OpCodes.Ldstr, Decompiler.Decompile(encodedSource, 0, 0).Trim());
            ig.Emit(OpCodes.Ldnull);              // FIXME: this hard coded for now.

            CodeGenerator.load_engine(InFunction, ig);

            ig.Emit(OpCodes.Call, typeof(FunctionDeclaration).GetMethod("JScriptFunctionDeclaration"));

            if (parent == null || parent.GetType() == typeof(ScriptBlock))
            {
                ig.Emit(OpCodes.Stsfld, t.GetField(name));
            }
            else
            {
                ig.Emit(OpCodes.Stloc, local_func);
            }
        }
Exemplo n.º 2
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();
        }