示例#1
0
        public JSFunction NewFunction(VariableScope outerScope, CompiledFunction compiledFunction)
        {
            Contract.Requires <ArgumentNullException>(outerScope != null, "outerScope");
            Contract.Requires <ArgumentNullException>(compiledFunction != null, "compiledFunction");
            if (string.IsNullOrEmpty(compiledFunction.Name))
            {
                return(new JSManagedFunction(this, outerScope, compiledFunction, Function));
            }
            var functionScope = new NamedFunctionVariableScope(outerScope);
            var function      = new JSManagedFunction(this, functionScope, compiledFunction, Function);

            functionScope.Bind(function);
            return(function);
        }
示例#2
0
 internal ExecutionThread(VirtualMachine vm, CompiledFunction globalFunction, JSValue[] globalArguments)
 {
     Contract.Requires(vm != null);
     Contract.Requires(globalFunction != null);
     VM             = vm;
     GlobalScope    = new GlobalVariableScope(vm.GlobalObject);
     GlobalFunction = new JSManagedFunction(VM, GlobalScope, globalFunction, VM.Function);
     CurrentFrame   = new CallStackFrame(
         null,
         VM,
         GlobalFunction,
         vm.GlobalObject,
         GlobalScope,
         globalArguments ?? JSFunction.EmptyArgumentList);
 }
示例#3
0
        internal CallStackFrame(
            CallStackFrame caller,
            VirtualMachine vm,
            JSManagedFunction function,
            JSObject context,
            VariableScope localScope,
            JSValue[] parameterValues,
            bool copyResult           = false,
            Action onCompleteCallback = null)
        {
            Contract.Requires(vm != null);
            Contract.Requires(function != null);
            Contract.Requires(context != null);
            Contract.Requires(localScope != null);
            Contract.Requires(parameterValues != null);

            Caller     = caller;
            CopyResult = copyResult;
            Function   = function;
            Context    = context;
            LocalScope = localScope;

            _evalStack = new Stack <JSValue>(4);

            CodeReader = new ByteCodeReader(Function.CompiledFunction.CompiledCode);

            OnCompleteCallback = onCompleteCallback;

            // Создать привязки для параметров
            var parameterNames = function.CompiledFunction.ParameterNames;
            var n = Math.Min(parameterNames.Length, parameterValues.Length);

            for (var i = 0; i < n; i++)
            {
                LocalScope.DeclareVariable(parameterNames[i], parameterValues[i]);
            }
            for (var i = n; i < parameterNames.Length; i++)
            {
                LocalScope.DeclareVariable(parameterNames[i], JSValue.Undefined);
            }

            // Создать привязку для arguments
            LocalScope.DeclareVariable("arguments", vm.NewArguments(parameterValues));

            // Создать привязки для объявленных функций
            for (var i = 0; i < Function.CompiledFunction.DeclaredFunctionCount; i++)
            {
                var declaredFunction = Function.CompiledFunction.NestedFunctions[i];
                if (!LocalScope.ContainsVariable(declaredFunction.Name))
                {
                    LocalScope.DeclareVariable(
                        declaredFunction.Name, vm.NewFunction(LocalScope, declaredFunction));
                }
            }

            // Создать привязки для объявленных переменных
            foreach (var variableName in Function.CompiledFunction.DeclaredVariables)
            {
                LocalScope.DeclareVariableIfNotExists(variableName, JSValue.Undefined);
            }
        }
 internal void Bind(JSManagedFunction function)
 {
     Contract.Requires(function != null);
     Function = function;
 }