| 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/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  Loading... | 
| 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  Loading... | 
| 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  Loading... | 
| 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 | 
| OLD | NEW | 
|---|