internal ScriptFunction Construct(Object[] args, VsaEngine engine)
        {
            StringBuilder func_string = new StringBuilder("function anonymous(");

            for (int i = 0, n = args.Length - 2; i < n; i++)
            {
                func_string.Append(Convert.ToString(args[i]));
                func_string.Append(", ");
            }
            if (args.Length > 1)
            {
                func_string.Append(Convert.ToString(args[args.Length - 2]));
            }
            func_string.Append(") {\n");
            if (args.Length > 0)
            {
                func_string.Append(Convert.ToString(args[args.Length - 1]));
            }
            func_string.Append("\n}");
            Context  context = new Context(new DocumentContext("anonymous", engine), func_string.ToString());
            JSParser p       = new JSParser(context);

            engine.PushScriptObject(((IActivationObject)engine.ScriptObjectStackTop()).GetGlobalScope());
            try{
                return((ScriptFunction)p.ParseFunctionExpression().PartiallyEvaluate().Evaluate());
            }finally{
                engine.PopScriptObject();
            }
        }
示例#2
0
        // Perform a call on this object.
        internal override Object Call
            (VsaEngine engine, Object thisob, Object[] args)
        {
            // Create a new scope object and initialize the parameters.
            ScriptObject scope;

            if (thisob is JSObject)
            {
                scope = new FunctionScope
                            ((JSObject)thisob, defn.fparams, thisob, args);
            }
            else
            {
                scope = new FunctionScope
                            (declaringScope, defn.fparams, thisob, args);
            }

            // Push the scope onto the stack.
            engine.PushScriptObjectChecked(scope);

            // Call the function and pop the scope afterwards.
            Object result = Empty.Value;

            try
            {
                if (defn.body != null)
                {
                    defn.body.Eval(engine);
                }
            }
            catch (ReturnJumpOut r)
            {
                return(r.value);
            }
            finally
            {
                engine.PopScriptObject();
            }

            // Return the function result to the caller.
            return(result);
        }
示例#3
0
 private static Object DoEvaluate(Object source, VsaEngine engine, bool isUnsafe)
 {
     if (engine.doFast)
     {
         engine.PushScriptObject(new BlockScope(engine.ScriptObjectStackTop()));
     }
     try{
         Context  context = new Context(new DocumentContext("eval code", engine), ((IConvertible)source).ToString());
         JSParser p       = new JSParser(context);
         if (!isUnsafe)
         {
             new SecurityPermission(SecurityPermissionFlag.Execution).PermitOnly();
         }
         return(((Completion)p.ParseEvalBody().PartiallyEvaluate().Evaluate()).value);
     }finally{
         if (engine.doFast)
         {
             engine.PopScriptObject();
         }
     }
 }
示例#4
0
 public static Object JScriptEvaluate(Object source, VsaEngine engine)
 {
     if (Convert.GetTypeCode(source) != TypeCode.String)
     {
         return(source);
     }
     if (engine.doFast)
     {
         engine.PushScriptObject(new BlockScope(engine.ScriptObjectStackTop()));
     }
     try{
         Context  context = new Context(new DocumentContext("eval code", engine), ((IConvertible)source).ToString());
         JSParser p       = new JSParser(context);
         return(((Completion)p.ParseEvalBody().PartiallyEvaluate().Evaluate()).value);
     }finally{
         if (engine.doFast)
         {
             engine.PopScriptObject();
         }
     }
 }
            public override bool Eval(object context)
            {
                VsaEngine engine = Engine;

                //
                // Following is equivalent to calling eval in JScript,
                // with the value of the context variable established at the
                // global scope in order for it to be available to the
                // expression source.
                //

                _contextField.SetValue(_scope, context);

                try
                {
                    With.JScriptWith(context, engine);
                    return(Convert.ToBoolean(Microsoft.JScript.Eval.JScriptEvaluate(_expression, engine)));
                }
                finally
                {
                    engine.PopScriptObject(/* with */);
                }
            }
示例#6
0
        private static object DoEvaluate(object source, VsaEngine engine, bool isUnsafe)
        {
            object obj2;

            if (engine.doFast)
            {
                engine.PushScriptObject(new BlockScope(engine.ScriptObjectStackTop()));
            }
            try
            {
                Context  context = new Context(new DocumentContext("eval code", engine), ((IConvertible)source).ToString());
                JSParser parser  = new JSParser(context);
                obj2 = ((Completion)parser.ParseEvalBody().PartiallyEvaluate().Evaluate()).value;
            }
            finally
            {
                if (engine.doFast)
                {
                    engine.PopScriptObject();
                }
            }
            return(obj2);
        }
        internal ScriptFunction Construct(object[] args, VsaEngine engine)
        {
            ScriptFunction function;
            StringBuilder  builder = new StringBuilder("function anonymous(");
            int            index   = 0;
            int            num2    = args.Length - 2;

            while (index < num2)
            {
                builder.Append(Microsoft.JScript.Convert.ToString(args[index]));
                builder.Append(", ");
                index++;
            }
            if (args.Length > 1)
            {
                builder.Append(Microsoft.JScript.Convert.ToString(args[args.Length - 2]));
            }
            builder.Append(") {\n");
            if (args.Length > 0)
            {
                builder.Append(Microsoft.JScript.Convert.ToString(args[args.Length - 1]));
            }
            builder.Append("\n}");
            Context  context = new Context(new DocumentContext("anonymous", engine), builder.ToString());
            JSParser parser  = new JSParser(context);

            engine.PushScriptObject(((IActivationObject)engine.ScriptObjectStackTop()).GetGlobalScope());
            try
            {
                function = (ScriptFunction)parser.ParseFunctionExpression().PartiallyEvaluate().Evaluate();
            }
            finally
            {
                engine.PopScriptObject();
            }
            return(function);
        }
示例#8
0
        public Object CreateInstance(params Object [] args)
        {
            Type t = this.GetType();

            // Built-in constructor?
            if (t != typeof(FunctionObject))
            {
                MethodInfo method = t.GetMethod("CreateInstance");
                return(method.Invoke(this, new object [] { args }));
            }

            Type prototype = SemanticAnalyser.map_to_prototype(this.prototype);

            MemberInfo []  members = prototype.GetMember("constructor");
            PropertyInfo   field   = members [0] as PropertyInfo;
            ScriptFunction ctr     = field.GetValue(prototype, null) as ScriptFunction;

            if (ctr == null)
            {
                Console.WriteLine("No constructor for {0}", this);
            }
            ScriptObject new_obj = ctr.CreateInstance(args) as ScriptObject;

            new_obj._proto = this.prototype;

            vsa_engine.PushScriptObject(new_obj);
            Invoke(new_obj, args);
            //
            // NOTE: I think the result of calling an user function as a constructor
            // should not be the return value of the user function. I think it should
            // always be the newly constructed object.
            //
            // TODO: This has yet to be verified.
            //
            return(vsa_engine.PopScriptObject());
        }
示例#9
0
文件: Eval.cs 项目: ForNeVeR/pnet
        // Evaluate a JScript expression in the context of a specific engine.
        public static Object JScriptEvaluate(Object source, VsaEngine engine)
        {
            Object value = null;

            // Bail out if we weren't supplied a string.
            if (!(source is String))
            {
                return(source);
            }

            // Parse the "eval" statement.
            Context context = new Context((String)source);

            context.codebase = new CodeBase("eval code", null);
            JSParser parser = new JSParser(context);
            JNode    node   = parser.ParseSource(true);

            // Push a scope for use during evaluation.
            engine.PushScriptObject
                (new BlockScope(engine.ScriptObjectStackTop(),
                                new JSObject(null, engine)));

            // Evaluate the statement.
            try
            {
                value = node.Eval(engine);
                if (value == Empty.Value)
                {
                    value = null;
                }
            }
            catch (JScriptException e)
            {
                // Attach the context information to low-level exceptions.
                if (e.context == null)
                {
                    e.context = context;
                }
                throw;
            }
            catch (BreakJumpOut brk)
            {
                // "break" used incorrectly.
                throw new JScriptException(JSError.BadBreak, brk.context);
            }
            catch (ContinueJumpOut cont)
            {
                // "continue" used incorrectly.
                throw new JScriptException(JSError.BadContinue,
                                           cont.context);
            }
            catch (ReturnJumpOut ret)
            {
                // "return" used incorrectly.
                throw new JScriptException(JSError.BadReturn, ret.context);
            }
            finally
            {
                // Pop the script scope.
                engine.PopScriptObject();
            }

            // Return the result of the evaluation to the caller.
            return(value);
        }