Index: src/contexts.cc |
diff --git a/src/contexts.cc b/src/contexts.cc |
index cb5e852d7d669c07c8d8b950016defff1572f49c..53851db7b61dc0bfd1ff95af04934f9761dc679b 100644 |
--- a/src/contexts.cc |
+++ b/src/contexts.cc |
@@ -71,6 +71,50 @@ void Context::set_global_proxy(JSObject* object) { |
} |
+static PropertyAttributes GetWithContextAttributes(Isolate* isolate, |
+ Handle<String> name, |
+ Handle<JSReceiver> object) { |
+ Handle<Symbol> unscopables_symbol( |
+ isolate->native_context()->unscopables_symbol(), isolate); |
+ |
+ while (true) { |
arv (Not doing code reviews)
2014/07/10 23:13:11
I'll switch to use the new PrototypeIterator.
rossberg
2014/07/11 11:59:06
Yes, that would be better.
arv (Not doing code reviews)
2014/07/11 21:47:28
Waiting for that CL to land...
|
+ PropertyAttributes name_attrs = |
+ JSReceiver::GetOwnPropertyAttributes(object, name); |
+ |
+ if (name_attrs != ABSENT) { |
+ PropertyAttributes unscopables_attrs = |
+ JSReceiver::GetOwnPropertyAttributes(object, unscopables_symbol); |
+ PropertyAttributes blocked_attrs = ABSENT; |
+ if (unscopables_attrs != ABSENT) { |
+ Handle<Object> unscopables_object; |
+ ASSIGN_RETURN_ON_EXCEPTION_VALUE( |
+ isolate, unscopables_object, |
+ Object::GetProperty(object, unscopables_symbol), name_attrs); |
+ |
+ if (unscopables_object->IsSpecObject()) { |
+ blocked_attrs = JSReceiver::GetOwnPropertyAttributes( |
+ Handle<JSReceiver>::cast(unscopables_object), name); |
+ } |
+ } |
+ |
+ if (blocked_attrs == ABSENT) { |
+ return name_attrs; |
+ } |
+ } |
+ |
+ Object* prototype = object->GetPrototype(); |
+ if (prototype->IsNull()) { |
+ return ABSENT; |
+ } |
+ ASSERT(prototype->IsSpecObject()); |
+ object = handle(JSReceiver::cast(prototype), isolate); |
+ } |
+ |
+ UNREACHABLE(); |
+ return ABSENT; |
+} |
+ |
+ |
Handle<Object> Context::Lookup(Handle<String> name, |
ContextLookupFlags flags, |
int* index, |
@@ -109,9 +153,12 @@ Handle<Object> Context::Lookup(Handle<String> name, |
if ((flags & FOLLOW_PROTOTYPE_CHAIN) == 0 || |
object->IsJSContextExtensionObject()) { |
*attributes = JSReceiver::GetOwnPropertyAttributes(object, name); |
+ } else if (FLAG_harmony_unscopables && context->IsWithContext()) { |
+ *attributes = GetWithContextAttributes(isolate, name, object); |
} else { |
*attributes = JSReceiver::GetPropertyAttributes(object, name); |
} |
+ |
if (isolate->has_pending_exception()) return Handle<Object>(); |
if (*attributes != ABSENT) { |