| Index: src/runtime.cc
|
| diff --git a/src/runtime.cc b/src/runtime.cc
|
| index 0b91d9958f7424e1d19bdcf44dc20fb6c7eb74dc..838681f589140db6af40c61a5274c417f07c9530 100644
|
| --- a/src/runtime.cc
|
| +++ b/src/runtime.cc
|
| @@ -1034,7 +1034,7 @@ static AccessCheckResult CheckPropertyAccess(
|
| }
|
|
|
| LookupResult lookup(obj->GetIsolate());
|
| - obj->LocalLookup(name, &lookup);
|
| + obj->LocalLookup(name, &lookup, true);
|
|
|
| if (!lookup.IsProperty()) return ACCESS_ABSENT;
|
| if (CheckGenericAccess<Object*>(
|
| @@ -1290,13 +1290,7 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_DeclareGlobals) {
|
| // Do the lookup locally only, see ES5 erratum.
|
| LookupResult lookup(isolate);
|
| if (FLAG_es52_globals) {
|
| - Object* obj = *global;
|
| - do {
|
| - JSObject::cast(obj)->LocalLookup(*name, &lookup);
|
| - if (lookup.IsFound()) break;
|
| - obj = obj->GetPrototype();
|
| - } while (obj->IsJSObject() &&
|
| - JSObject::cast(obj)->map()->is_hidden_prototype());
|
| + global->LocalLookup(*name, &lookup, true);
|
| } else {
|
| global->Lookup(*name, &lookup);
|
| }
|
| @@ -1320,7 +1314,7 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_DeclareGlobals) {
|
| }
|
|
|
| LookupResult lookup(isolate);
|
| - global->LocalLookup(*name, &lookup);
|
| + global->LocalLookup(*name, &lookup, true);
|
|
|
| // Compute the property attributes. According to ECMA-262,
|
| // the property must be non-configurable except in eval.
|
| @@ -1499,27 +1493,20 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_InitializeVarGlobal) {
|
| // the whole chain of hidden prototypes to do a 'local' lookup.
|
| Object* object = global;
|
| LookupResult lookup(isolate);
|
| - while (object->IsJSObject() &&
|
| - JSObject::cast(object)->map()->is_hidden_prototype()) {
|
| - JSObject* raw_holder = JSObject::cast(object);
|
| - raw_holder->LocalLookup(*name, &lookup);
|
| - if (lookup.IsInterceptor()) {
|
| - HandleScope handle_scope(isolate);
|
| - Handle<JSObject> holder(raw_holder);
|
| - PropertyAttributes intercepted = holder->GetPropertyAttribute(*name);
|
| - // Update the raw pointer in case it's changed due to GC.
|
| - raw_holder = *holder;
|
| - if (intercepted != ABSENT && (intercepted & READ_ONLY) == 0) {
|
| - // Found an interceptor that's not read only.
|
| - if (assign) {
|
| - return raw_holder->SetProperty(
|
| - &lookup, *name, args[2], attributes, strict_mode_flag);
|
| - } else {
|
| - return isolate->heap()->undefined_value();
|
| - }
|
| + JSObject::cast(object)->LocalLookup(*name, &lookup, true);
|
| + if (lookup.IsInterceptor()) {
|
| + HandleScope handle_scope(isolate);
|
| + PropertyAttributes intercepted =
|
| + lookup.holder()->GetPropertyAttribute(*name);
|
| + if (intercepted != ABSENT && (intercepted & READ_ONLY) == 0) {
|
| + // Found an interceptor that's not read only.
|
| + if (assign) {
|
| + return lookup.holder()->SetProperty(
|
| + &lookup, *name, args[2], attributes, strict_mode_flag);
|
| + } else {
|
| + return isolate->heap()->undefined_value();
|
| }
|
| }
|
| - object = raw_holder->GetPrototype();
|
| }
|
|
|
| // Reload global in case the loop above performed a GC.
|
|
|