Ejemplo n.º 1
0
        private static object JsConstructor(Context cx, IScriptable scope, object [] args)
        {
            int arglen = args.Length;
            System.Text.StringBuilder sourceBuf = new System.Text.StringBuilder ();

            sourceBuf.Append ("function ");
            /* version != 1.2 Function constructor behavior -
            * print 'anonymous' as the function name if the
            * version (under which the function was compiled) is
            * less than 1.2... or if it's greater than 1.2, because
            * we need to be closer to ECMA.
            */
            if (cx.Version != Context.Versions.JS1_2) {
                sourceBuf.Append ("anonymous");
            }
            sourceBuf.Append ('(');

            // Append arguments as coma separated strings
            for (int i = 0; i < arglen - 1; i++) {
                if (i > 0) {
                    sourceBuf.Append (',');
                }
                sourceBuf.Append (ScriptConvert.ToString (args [i]));
            }
            sourceBuf.Append (") {");
            if (arglen != 0) {
                // append function body
                string funBody = ScriptConvert.ToString (args [arglen - 1]);
                sourceBuf.Append (funBody);
            }
            sourceBuf.Append ('}');
            string source = sourceBuf.ToString ();

            int [] linep = new int [1];
            string filename = Context.GetSourcePositionFromStack (linep);
            if (filename == null) {
                filename = "<eval'ed string>";
                linep [0] = 1;
            }

            string sourceURI = ScriptRuntime.makeUrlForGeneratedScript (false, filename, linep [0]);

            IScriptable global = ScriptableObject.GetTopLevelScope (scope);

            ErrorReporter reporter;
            reporter = DefaultErrorReporter.ForEval (cx.ErrorReporter);

            // Compile with explicit interpreter instance to force interpreter
            // mode.
            return cx.CompileFunction (global, source, new Interpreter (), reporter, sourceURI, 1, (object)null);
        }