JSObject* JSScope::resolve(ExecState* exec, JSScope* scope, const Identifier& ident) { ScopeChainIterator end = scope->end(); ScopeChainIterator it = scope->begin(); while (1) { JSScope* scope = it.scope(); JSObject* object = it.get(); if (++it == end) // Global scope. return object; if (object->hasProperty(exec, ident)) { if (!isUnscopable(exec, scope, object, ident)) return object; ASSERT_WITH_MESSAGE(!exec->hadException(), "When an exception occurs, the result of isUnscopable becomes false"); } } }
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; } } }