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); }
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); }
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; }