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

Side by Side Diff: src/contexts.cc

Issue 2314483002: Store the ScopeInfo in WithContexts (Closed)
Patch Set: updates Created 4 years, 3 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
« no previous file with comments | « src/compiler/js-operator.cc ('k') | src/debug/debug-evaluate.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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/contexts.h" 5 #include "src/contexts.h"
6 6
7 #include "src/bootstrapper.h" 7 #include "src/bootstrapper.h"
8 #include "src/debug/debug.h" 8 #include "src/debug/debug.h"
9 #include "src/isolate-inl.h" 9 #include "src/isolate-inl.h"
10 10
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
94 if (object->IsTheHole(GetIsolate())) return nullptr; 94 if (object->IsTheHole(GetIsolate())) return nullptr;
95 if (IsBlockContext()) { 95 if (IsBlockContext()) {
96 if (!object->IsContextExtension()) return nullptr; 96 if (!object->IsContextExtension()) return nullptr;
97 object = JSObject::cast(ContextExtension::cast(object)->extension()); 97 object = JSObject::cast(ContextExtension::cast(object)->extension());
98 } 98 }
99 DCHECK(object->IsJSContextExtensionObject() || 99 DCHECK(object->IsJSContextExtensionObject() ||
100 (IsNativeContext() && object->IsJSGlobalObject())); 100 (IsNativeContext() && object->IsJSGlobalObject()));
101 return JSObject::cast(object); 101 return JSObject::cast(object);
102 } 102 }
103 103
104
105 JSReceiver* Context::extension_receiver() { 104 JSReceiver* Context::extension_receiver() {
106 DCHECK(IsNativeContext() || IsWithContext() || 105 DCHECK(IsNativeContext() || IsWithContext() ||
107 IsFunctionContext() || IsBlockContext()); 106 IsFunctionContext() || IsBlockContext());
108 return IsWithContext() ? JSReceiver::cast(extension()) : extension_object(); 107 return IsWithContext() ? JSReceiver::cast(
108 ContextExtension::cast(extension())->extension())
109 : extension_object();
109 } 110 }
110 111
111
112 ScopeInfo* Context::scope_info() { 112 ScopeInfo* Context::scope_info() {
113 DCHECK(IsModuleContext() || IsScriptContext() || IsBlockContext() || 113 DCHECK(IsModuleContext() || IsScriptContext() || IsBlockContext() ||
114 IsCatchContext()); 114 IsCatchContext() || IsWithContext() || IsDebugEvaluateContext());
115 HeapObject* object = extension(); 115 HeapObject* object = extension();
116 if (object->IsContextExtension()) { 116 if (object->IsContextExtension()) {
117 DCHECK(IsBlockContext() || IsCatchContext()); 117 DCHECK(IsBlockContext() || IsCatchContext() || IsWithContext() ||
118 IsDebugEvaluateContext());
118 object = ContextExtension::cast(object)->scope_info(); 119 object = ContextExtension::cast(object)->scope_info();
119 } 120 }
120 return ScopeInfo::cast(object); 121 return ScopeInfo::cast(object);
121 } 122 }
122 123
123 124
124 String* Context::catch_name() { 125 String* Context::catch_name() {
125 DCHECK(IsCatchContext()); 126 DCHECK(IsCatchContext());
126 return String::cast(ContextExtension::cast(extension())->extension()); 127 return String::cast(ContextExtension::cast(extension())->extension());
127 } 128 }
(...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after
333 PrintF("=> found in catch context\n"); 334 PrintF("=> found in catch context\n");
334 } 335 }
335 *index = Context::THROWN_OBJECT_INDEX; 336 *index = Context::THROWN_OBJECT_INDEX;
336 *attributes = NONE; 337 *attributes = NONE;
337 *init_flag = kCreatedInitialized; 338 *init_flag = kCreatedInitialized;
338 *variable_mode = VAR; 339 *variable_mode = VAR;
339 return context; 340 return context;
340 } 341 }
341 } else if (context->IsDebugEvaluateContext()) { 342 } else if (context->IsDebugEvaluateContext()) {
342 // Check materialized locals. 343 // Check materialized locals.
343 Object* obj = context->get(EXTENSION_INDEX); 344 Object* ext = context->get(EXTENSION_INDEX);
344 if (obj->IsJSReceiver()) { 345 if (ext->IsContextExtension()) {
345 Handle<JSReceiver> extension(JSReceiver::cast(obj)); 346 Object* obj = ContextExtension::cast(ext)->extension();
346 LookupIterator it(extension, name, extension); 347 if (obj->IsJSReceiver()) {
347 Maybe<bool> found = JSReceiver::HasProperty(&it); 348 Handle<JSReceiver> extension(JSReceiver::cast(obj));
348 if (found.FromMaybe(false)) { 349 LookupIterator it(extension, name, extension);
349 *attributes = NONE; 350 Maybe<bool> found = JSReceiver::HasProperty(&it);
350 return extension; 351 if (found.FromMaybe(false)) {
352 *attributes = NONE;
353 return extension;
354 }
351 } 355 }
352 } 356 }
353 // Check the original context, but do not follow its context chain. 357 // Check the original context, but do not follow its context chain.
354 obj = context->get(WRAPPED_CONTEXT_INDEX); 358 Object* obj = context->get(WRAPPED_CONTEXT_INDEX);
355 if (obj->IsContext()) { 359 if (obj->IsContext()) {
356 Handle<Object> result = 360 Handle<Object> result =
357 Context::cast(obj)->Lookup(name, DONT_FOLLOW_CHAINS, index, 361 Context::cast(obj)->Lookup(name, DONT_FOLLOW_CHAINS, index,
358 attributes, init_flag, variable_mode); 362 attributes, init_flag, variable_mode);
359 if (!result.is_null()) return result; 363 if (!result.is_null()) return result;
360 } 364 }
361 // Check whitelist. Names that do not pass whitelist shall only resolve 365 // Check whitelist. Names that do not pass whitelist shall only resolve
362 // to with, script or native contexts up the context chain. 366 // to with, script or native contexts up the context chain.
363 obj = context->get(WHITE_LIST_INDEX); 367 obj = context->get(WHITE_LIST_INDEX);
364 if (obj->IsStringSet()) { 368 if (obj->IsStringSet()) {
(...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after
556 560
557 int previous_value = errors_thrown()->value(); 561 int previous_value = errors_thrown()->value();
558 set_errors_thrown(Smi::FromInt(previous_value + 1)); 562 set_errors_thrown(Smi::FromInt(previous_value + 1));
559 } 563 }
560 564
561 565
562 int Context::GetErrorsThrown() { return errors_thrown()->value(); } 566 int Context::GetErrorsThrown() { return errors_thrown()->value(); }
563 567
564 } // namespace internal 568 } // namespace internal
565 } // namespace v8 569 } // namespace v8
OLDNEW
« no previous file with comments | « src/compiler/js-operator.cc ('k') | src/debug/debug-evaluate.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698