OLD | NEW |
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 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
78 Context* Context::script_context() { | 78 Context* Context::script_context() { |
79 Context* current = this; | 79 Context* current = this; |
80 while (!current->IsScriptContext()) { | 80 while (!current->IsScriptContext()) { |
81 current = current->previous(); | 81 current = current->previous(); |
82 } | 82 } |
83 return current; | 83 return current; |
84 } | 84 } |
85 | 85 |
86 | 86 |
87 Context* Context::native_context() { | 87 Context* Context::native_context() { |
88 // Fast case: the global object for this context has been set. In | 88 // Fast case: the receiver context is already a native context. |
89 // that case, the global object has a direct pointer to the global | 89 if (IsNativeContext()) return this; |
90 // context. | 90 // The global object has a direct pointer to the native context. If the |
91 if (global_object()->IsGlobalObject()) { | 91 // following DCHECK fails, the native context is probably being accessed |
92 return global_object()->native_context(); | 92 // indirectly during bootstrapping. This is unsupported. |
93 } | 93 DCHECK(global_object()->IsGlobalObject()); |
94 | 94 return global_object()->native_context(); |
95 // During bootstrapping, the global object might not be set and we | |
96 // have to search the context chain to find the native context. | |
97 DCHECK(this->GetIsolate()->bootstrapper()->IsActive()); | |
98 Context* current = this; | |
99 while (!current->IsNativeContext()) { | |
100 JSFunction* closure = JSFunction::cast(current->closure()); | |
101 current = Context::cast(closure->context()); | |
102 } | |
103 return current; | |
104 } | 95 } |
105 | 96 |
106 | 97 |
107 JSObject* Context::global_proxy() { | 98 JSObject* Context::global_proxy() { |
108 return native_context()->global_proxy_object(); | 99 return native_context()->global_proxy_object(); |
109 } | 100 } |
110 | 101 |
111 | 102 |
112 void Context::set_global_proxy(JSObject* object) { | 103 void Context::set_global_proxy(JSObject* object) { |
113 native_context()->set_global_proxy_object(object); | 104 native_context()->set_global_proxy_object(object); |
(...skipping 384 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
498 // During bootstrapping we allow all objects to pass as global | 489 // During bootstrapping we allow all objects to pass as global |
499 // objects. This is necessary to fix circular dependencies. | 490 // objects. This is necessary to fix circular dependencies. |
500 return isolate->heap()->gc_state() != Heap::NOT_IN_GC || | 491 return isolate->heap()->gc_state() != Heap::NOT_IN_GC || |
501 isolate->bootstrapper()->IsActive() || | 492 isolate->bootstrapper()->IsActive() || |
502 object->IsGlobalObject(); | 493 object->IsGlobalObject(); |
503 } | 494 } |
504 #endif | 495 #endif |
505 | 496 |
506 } // namespace internal | 497 } // namespace internal |
507 } // namespace v8 | 498 } // namespace v8 |
OLD | NEW |