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

Side by Side Diff: src/contexts.cc

Issue 716833002: Various clean-ups after top-level lexical declarations are done. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Patch for landing Created 6 years, 1 month 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 | Annotate | Revision Log
« no previous file with comments | « src/contexts.h ('k') | src/factory.h » ('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/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
11 namespace v8 { 11 namespace v8 {
12 namespace internal { 12 namespace internal {
13 13
14 14
15 Handle<GlobalContextTable> GlobalContextTable::Extend( 15 Handle<ScriptContextTable> ScriptContextTable::Extend(
16 Handle<GlobalContextTable> table, Handle<Context> global_context) { 16 Handle<ScriptContextTable> table, Handle<Context> script_context) {
17 Handle<GlobalContextTable> result; 17 Handle<ScriptContextTable> result;
18 int used = table->used(); 18 int used = table->used();
19 int length = table->length(); 19 int length = table->length();
20 CHECK(used >= 0 && length > 0 && used < length); 20 CHECK(used >= 0 && length > 0 && used < length);
21 if (used + 1 == length) { 21 if (used + 1 == length) {
22 CHECK(length < Smi::kMaxValue / 2); 22 CHECK(length < Smi::kMaxValue / 2);
23 result = Handle<GlobalContextTable>::cast( 23 result = Handle<ScriptContextTable>::cast(
24 FixedArray::CopySize(table, length * 2)); 24 FixedArray::CopySize(table, length * 2));
25 } else { 25 } else {
26 result = table; 26 result = table;
27 } 27 }
28 result->set_used(used + 1); 28 result->set_used(used + 1);
29 29
30 DCHECK(global_context->IsGlobalContext()); 30 DCHECK(script_context->IsScriptContext());
31 result->set(used + 1, *global_context); 31 result->set(used + 1, *script_context);
32 return result; 32 return result;
33 } 33 }
34 34
35 35
36 bool GlobalContextTable::Lookup(Handle<GlobalContextTable> table, 36 bool ScriptContextTable::Lookup(Handle<ScriptContextTable> table,
37 Handle<String> name, LookupResult* result) { 37 Handle<String> name, LookupResult* result) {
38 for (int i = 0; i < table->used(); i++) { 38 for (int i = 0; i < table->used(); i++) {
39 Handle<Context> context = GetContext(table, i); 39 Handle<Context> context = GetContext(table, i);
40 DCHECK(context->IsGlobalContext()); 40 DCHECK(context->IsScriptContext());
41 Handle<ScopeInfo> scope_info(ScopeInfo::cast(context->extension())); 41 Handle<ScopeInfo> scope_info(ScopeInfo::cast(context->extension()));
42 int slot_index = ScopeInfo::ContextSlotIndex( 42 int slot_index = ScopeInfo::ContextSlotIndex(
43 scope_info, name, &result->mode, &result->init_flag, 43 scope_info, name, &result->mode, &result->init_flag,
44 &result->maybe_assigned_flag); 44 &result->maybe_assigned_flag);
45 45
46 if (slot_index >= 0) { 46 if (slot_index >= 0) {
47 result->context_index = i; 47 result->context_index = i;
48 result->slot_index = slot_index; 48 result->slot_index = slot_index;
49 return true; 49 return true;
50 } 50 }
(...skipping 16 matching lines...) Expand all
67 GlobalObject* object = global_object(); 67 GlobalObject* object = global_object();
68 if (object->IsJSGlobalObject()) { 68 if (object->IsJSGlobalObject()) {
69 return JSGlobalObject::cast(object)->builtins(); 69 return JSGlobalObject::cast(object)->builtins();
70 } else { 70 } else {
71 DCHECK(object->IsJSBuiltinsObject()); 71 DCHECK(object->IsJSBuiltinsObject());
72 return JSBuiltinsObject::cast(object); 72 return JSBuiltinsObject::cast(object);
73 } 73 }
74 } 74 }
75 75
76 76
77 Context* Context::global_context() { 77 Context* Context::script_context() {
78 Context* current = this; 78 Context* current = this;
79 while (!current->IsGlobalContext()) { 79 while (!current->IsScriptContext()) {
80 current = current->previous(); 80 current = current->previous();
81 } 81 }
82 return current; 82 return current;
83 } 83 }
84 84
85 85
86 Context* Context::native_context() { 86 Context* Context::native_context() {
87 // Fast case: the global object for this context has been set. In 87 // Fast case: the global object for this context has been set. In
88 // that case, the global object has a direct pointer to the global 88 // that case, the global object has a direct pointer to the global
89 // context. 89 // context.
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
207 207
208 if (FLAG_trace_contexts) { 208 if (FLAG_trace_contexts) {
209 PrintF("Context::Lookup("); 209 PrintF("Context::Lookup(");
210 name->ShortPrint(); 210 name->ShortPrint();
211 PrintF(")\n"); 211 PrintF(")\n");
212 } 212 }
213 213
214 do { 214 do {
215 if (FLAG_trace_contexts) { 215 if (FLAG_trace_contexts) {
216 PrintF(" - looking in context %p", reinterpret_cast<void*>(*context)); 216 PrintF(" - looking in context %p", reinterpret_cast<void*>(*context));
217 if (context->IsGlobalContext()) PrintF(" (global context)"); 217 if (context->IsScriptContext()) PrintF(" (script context)");
218 if (context->IsNativeContext()) PrintF(" (native context)"); 218 if (context->IsNativeContext()) PrintF(" (native context)");
219 PrintF("\n"); 219 PrintF("\n");
220 } 220 }
221 221
222 222
223 // 1. Check global objects, subjects of with, and extension objects. 223 // 1. Check global objects, subjects of with, and extension objects.
224 if (context->IsNativeContext() || 224 if (context->IsNativeContext() ||
225 context->IsWithContext() || 225 context->IsWithContext() ||
226 (context->IsFunctionContext() && context->has_extension())) { 226 (context->IsFunctionContext() && context->has_extension())) {
227 Handle<JSReceiver> object( 227 Handle<JSReceiver> object(
228 JSReceiver::cast(context->extension()), isolate); 228 JSReceiver::cast(context->extension()), isolate);
229 229
230 if (context->IsNativeContext()) { 230 if (context->IsNativeContext()) {
231 if (FLAG_trace_contexts) { 231 if (FLAG_trace_contexts) {
232 PrintF(" - trying other global contexts\n"); 232 PrintF(" - trying other script contexts\n");
233 } 233 }
234 // Try other global contexts. 234 // Try other script contexts.
235 Handle<GlobalContextTable> global_contexts( 235 Handle<ScriptContextTable> script_contexts(
236 context->global_object()->native_context()->global_context_table()); 236 context->global_object()->native_context()->script_context_table());
237 GlobalContextTable::LookupResult r; 237 ScriptContextTable::LookupResult r;
238 if (GlobalContextTable::Lookup(global_contexts, name, &r)) { 238 if (ScriptContextTable::Lookup(script_contexts, name, &r)) {
239 if (FLAG_trace_contexts) { 239 if (FLAG_trace_contexts) {
240 Handle<Context> c = GlobalContextTable::GetContext(global_contexts, 240 Handle<Context> c = ScriptContextTable::GetContext(script_contexts,
241 r.context_index); 241 r.context_index);
242 PrintF("=> found property in global context %d: %p\n", 242 PrintF("=> found property in script context %d: %p\n",
243 r.context_index, reinterpret_cast<void*>(*c)); 243 r.context_index, reinterpret_cast<void*>(*c));
244 } 244 }
245 *index = r.slot_index; 245 *index = r.slot_index;
246 GetAttributesAndBindingFlags(r.mode, r.init_flag, attributes, 246 GetAttributesAndBindingFlags(r.mode, r.init_flag, attributes,
247 binding_flags); 247 binding_flags);
248 return GlobalContextTable::GetContext(global_contexts, 248 return ScriptContextTable::GetContext(script_contexts,
249 r.context_index); 249 r.context_index);
250 } 250 }
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; 256 Maybe<PropertyAttributes> maybe;
257 if ((flags & FOLLOW_PROTOTYPE_CHAIN) == 0 || 257 if ((flags & FOLLOW_PROTOTYPE_CHAIN) == 0 ||
258 object->IsJSContextExtensionObject()) { 258 object->IsJSContextExtensionObject()) {
(...skipping 13 matching lines...) Expand all
272 if (FLAG_trace_contexts) { 272 if (FLAG_trace_contexts) {
273 PrintF("=> found property in context object %p\n", 273 PrintF("=> found property in context object %p\n",
274 reinterpret_cast<void*>(*object)); 274 reinterpret_cast<void*>(*object));
275 } 275 }
276 return object; 276 return object;
277 } 277 }
278 } 278 }
279 279
280 // 2. Check the context proper if it has slots. 280 // 2. Check the context proper if it has slots.
281 if (context->IsFunctionContext() || context->IsBlockContext() || 281 if (context->IsFunctionContext() || context->IsBlockContext() ||
282 (FLAG_harmony_scoping && context->IsGlobalContext())) { 282 (FLAG_harmony_scoping && context->IsScriptContext())) {
283 // Use serialized scope information of functions and blocks to search 283 // Use serialized scope information of functions and blocks to search
284 // for the context index. 284 // for the context index.
285 Handle<ScopeInfo> scope_info; 285 Handle<ScopeInfo> scope_info;
286 if (context->IsFunctionContext()) { 286 if (context->IsFunctionContext()) {
287 scope_info = Handle<ScopeInfo>( 287 scope_info = Handle<ScopeInfo>(
288 context->closure()->shared()->scope_info(), isolate); 288 context->closure()->shared()->scope_info(), isolate);
289 } else { 289 } else {
290 scope_info = Handle<ScopeInfo>( 290 scope_info = Handle<ScopeInfo>(
291 ScopeInfo::cast(context->extension()), isolate); 291 ScopeInfo::cast(context->extension()), isolate);
292 } 292 }
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after
473 473
474 474
475 #ifdef DEBUG 475 #ifdef DEBUG
476 bool Context::IsBootstrappingOrValidParentContext( 476 bool Context::IsBootstrappingOrValidParentContext(
477 Object* object, Context* child) { 477 Object* object, Context* child) {
478 // During bootstrapping we allow all objects to pass as 478 // During bootstrapping we allow all objects to pass as
479 // contexts. This is necessary to fix circular dependencies. 479 // contexts. This is necessary to fix circular dependencies.
480 if (child->GetIsolate()->bootstrapper()->IsActive()) return true; 480 if (child->GetIsolate()->bootstrapper()->IsActive()) return true;
481 if (!object->IsContext()) return false; 481 if (!object->IsContext()) return false;
482 Context* context = Context::cast(object); 482 Context* context = Context::cast(object);
483 return context->IsNativeContext() || context->IsGlobalContext() || 483 return context->IsNativeContext() || context->IsScriptContext() ||
484 context->IsModuleContext() || !child->IsModuleContext(); 484 context->IsModuleContext() || !child->IsModuleContext();
485 } 485 }
486 486
487 487
488 bool Context::IsBootstrappingOrGlobalObject(Isolate* isolate, Object* object) { 488 bool Context::IsBootstrappingOrGlobalObject(Isolate* isolate, Object* object) {
489 // During bootstrapping we allow all objects to pass as global 489 // During bootstrapping we allow all objects to pass as global
490 // objects. This is necessary to fix circular dependencies. 490 // objects. This is necessary to fix circular dependencies.
491 return isolate->heap()->gc_state() != Heap::NOT_IN_GC || 491 return isolate->heap()->gc_state() != Heap::NOT_IN_GC ||
492 isolate->bootstrapper()->IsActive() || 492 isolate->bootstrapper()->IsActive() ||
493 object->IsGlobalObject(); 493 object->IsGlobalObject();
494 } 494 }
495 #endif 495 #endif
496 496
497 } } // namespace v8::internal 497 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/contexts.h ('k') | src/factory.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698