Index: src/prototype.h |
diff --git a/src/prototype.h b/src/prototype.h |
index c5e954554ca88cf6f76f2a06e03be2710b52a383..465e4d24b3069126cf685cca3c9c166b873518a8 100644 |
--- a/src/prototype.h |
+++ b/src/prototype.h |
@@ -29,6 +29,8 @@ class PrototypeIterator { |
enum WhereToEnd { END_AT_NULL, END_AT_NON_HIDDEN }; |
+ enum WhenToCallProxyTrap { TRAP_CALL_ALWAYS, STOP_EARLY }; |
+ |
const int kProxyPrototypeLimit = 100 * 1000; |
PrototypeIterator(Isolate* isolate, Handle<JSReceiver> receiver, |
@@ -125,7 +127,8 @@ class PrototypeIterator { |
// Returns false iff a call to JSProxy::GetPrototype throws. |
// TODO(neis): This should probably replace Advance(). |
- bool AdvanceFollowingProxies() { |
+ bool AdvanceFollowingProxies( |
+ WhenToCallProxyTrap when_to_call_trap = TRAP_CALL_ALWAYS) { |
DCHECK(!(handle_.is_null() && object_->IsJSProxy())); |
if (!HasAccess()) { |
// Abort the lookup if we do not have access to the current object. |
@@ -137,6 +140,13 @@ class PrototypeIterator { |
AdvanceIgnoringProxies(); |
return true; |
} |
+ |
+ // Proxies can never have hidden protoypes |
+ if (where_to_end_ == END_AT_NON_HIDDEN) { |
+ is_at_end_ = true; |
+ if (when_to_call_trap == STOP_EARLY) return true; |
+ } |
+ |
// Due to possible __proto__ recursion limit the number of Proxies |
// we visit to an arbitrarily chosen large number. |
seen_proxies_++; |
@@ -148,7 +158,7 @@ class PrototypeIterator { |
MaybeHandle<Object> proto = |
JSProxy::GetPrototype(Handle<JSProxy>::cast(handle_)); |
if (!proto.ToHandle(&handle_)) return false; |
- is_at_end_ = where_to_end_ == END_AT_NON_HIDDEN || handle_->IsNull(); |
+ if (handle_->IsNull()) is_at_end_ = true; |
return true; |
} |