Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(323)

Side by Side Diff: src/contexts.cc

Issue 1097283003: Resolve references to "this" the same way as normal variables (Closed) Base URL: https://chromium.googlesource.com/v8/v8@master
Patch Set: Add tests for "this" scoping in arrow functions Created 5 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2011 the V8 project authors. All rights reserved. 1 // Copyright 2011 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/v8.h" 5 #include "src/v8.h"
6 6
7 #include "src/bootstrapper.h" 7 #include "src/bootstrapper.h"
8 #include "src/debug.h" 8 #include "src/debug.h"
9 #include "src/scopeinfo.h" 9 #include "src/scopeinfo.h"
10 10
(...skipping 240 matching lines...) Expand 10 before | Expand all | Expand 10 after
251 } 251 }
252 252
253 // Context extension objects needs to behave as if they have no 253 // Context extension objects needs to behave as if they have no
254 // prototype. So even if we want to follow prototype chains, we need 254 // prototype. So even if we want to follow prototype chains, we need
255 // to only do a local lookup for context extension objects. 255 // to only do a local lookup for context extension objects.
256 Maybe<PropertyAttributes> maybe = Nothing<PropertyAttributes>(); 256 Maybe<PropertyAttributes> maybe = Nothing<PropertyAttributes>();
257 if ((flags & FOLLOW_PROTOTYPE_CHAIN) == 0 || 257 if ((flags & FOLLOW_PROTOTYPE_CHAIN) == 0 ||
258 object->IsJSContextExtensionObject()) { 258 object->IsJSContextExtensionObject()) {
259 maybe = JSReceiver::GetOwnPropertyAttributes(object, name); 259 maybe = JSReceiver::GetOwnPropertyAttributes(object, name);
260 } else if (context->IsWithContext()) { 260 } else if (context->IsWithContext()) {
261 LookupIterator it(object, name); 261 // A with context will never bind "this".
262 maybe = UnscopableLookup(&it); 262 if (name->Equals(*isolate->factory()->this_string())) {
263 maybe = Just(ABSENT);
264 } else {
265 LookupIterator it(object, name);
266 maybe = UnscopableLookup(&it);
267 }
263 } else { 268 } else {
264 maybe = JSReceiver::GetPropertyAttributes(object, name); 269 maybe = JSReceiver::GetPropertyAttributes(object, name);
265 } 270 }
266 271
267 if (!maybe.IsJust()) return Handle<Object>(); 272 if (!maybe.IsJust()) return Handle<Object>();
268 DCHECK(!isolate->has_pending_exception()); 273 DCHECK(!isolate->has_pending_exception());
269 *attributes = maybe.FromJust(); 274 *attributes = maybe.FromJust();
270 275
271 if (maybe.FromJust() != ABSENT) { 276 if (maybe.FromJust() != ABSENT) {
272 if (FLAG_trace_contexts) { 277 if (FLAG_trace_contexts) {
(...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after
488 bool Context::IsBootstrappingOrGlobalObject(Isolate* isolate, Object* object) { 493 bool Context::IsBootstrappingOrGlobalObject(Isolate* isolate, Object* object) {
489 // During bootstrapping we allow all objects to pass as global 494 // During bootstrapping we allow all objects to pass as global
490 // objects. This is necessary to fix circular dependencies. 495 // objects. This is necessary to fix circular dependencies.
491 return isolate->heap()->gc_state() != Heap::NOT_IN_GC || 496 return isolate->heap()->gc_state() != Heap::NOT_IN_GC ||
492 isolate->bootstrapper()->IsActive() || 497 isolate->bootstrapper()->IsActive() ||
493 object->IsGlobalObject(); 498 object->IsGlobalObject();
494 } 499 }
495 #endif 500 #endif
496 501
497 } } // namespace v8::internal 502 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/compiler/ast-graph-builder.cc ('k') | src/heap/heap.h » ('j') | src/scopes.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698