EncodedJSValue doCallToJavaScript(void* executableAddress, ProtoCallFrame* protoCallFrame) { CodeBlock* codeBlock = protoCallFrame->codeBlock(); JSScope* scope = protoCallFrame->scope(); JSObject* callee = protoCallFrame->callee(); int argCountIncludingThis = protoCallFrame->argumentCountIncludingThis(); int argCount = protoCallFrame->argumentCount(); JSValue thisValue = protoCallFrame->thisValue(); JSStack& stack = scope->vm()->interpreter->stack(); CallFrame* newCallFrame = stack.pushFrame(codeBlock, scope, argCountIncludingThis, callee); if (UNLIKELY(!newCallFrame)) { JSGlobalObject* globalObject = scope->globalObject(); ExecState* exec = globalObject->globalExec(); return JSValue::encode(throwStackOverflowError(exec)); } // Set the arguments for the callee: newCallFrame->setThisValue(thisValue); for (int i = 0; i < argCount; ++i) newCallFrame->setArgument(i, protoCallFrame->argument(i)); JSValue result = execute(newCallFrame, executableAddress); stack.popFrame(newCallFrame); return JSValue::encode(result); }
JSObject* JSScope::resolve(ExecState* exec, JSScope* scope, const Identifier& ident) { VM& vm = exec->vm(); auto throwScope = DECLARE_THROW_SCOPE(vm); ScopeChainIterator end = scope->end(); ScopeChainIterator it = scope->begin(); while (1) { JSScope* scope = it.scope(); JSObject* object = it.get(); // Global scope. if (++it == end) { JSScope* globalScopeExtension = scope->globalObject(vm)->globalScopeExtension(); if (UNLIKELY(globalScopeExtension)) { bool hasProperty = object->hasProperty(exec, ident); RETURN_IF_EXCEPTION(throwScope, nullptr); if (hasProperty) return object; JSObject* extensionScopeObject = JSScope::objectAtScope(globalScopeExtension); hasProperty = extensionScopeObject->hasProperty(exec, ident); RETURN_IF_EXCEPTION(throwScope, nullptr); if (hasProperty) return extensionScopeObject; } return object; } bool hasProperty = object->hasProperty(exec, ident); RETURN_IF_EXCEPTION(throwScope, nullptr); if (hasProperty) { bool unscopable = isUnscopable(exec, scope, object, ident); ASSERT(!throwScope.exception() || !unscopable); if (!unscopable) return object; } } }