Index: src/objects.cc |
diff --git a/src/objects.cc b/src/objects.cc |
index 5f83f736ae0c33753b76f855e5a299d94bc2c9a9..8be7be32879115e7656a0fabc5708b439f04be32 100644 |
--- a/src/objects.cc |
+++ b/src/objects.cc |
@@ -135,7 +135,7 @@ void Object::Lookup(String* name, LookupResult* result) { |
if (IsJSReceiver()) { |
holder = this; |
} else { |
- Context* native_context = Isolate::Current()->context()->native_context(); |
+ Context* native_context = result->isolate()->context()->native_context(); |
if (IsNumber()) { |
holder = native_context->number_function()->instance_prototype(); |
} else if (IsString()) { |
@@ -613,7 +613,8 @@ MaybeObject* Object::GetProperty(Object* receiver, |
// Make sure that the top context does not change when doing |
// callbacks or interceptor calls. |
AssertNoContextChange ncc; |
- Heap* heap = name->GetHeap(); |
+ Isolate* isolate = name->GetIsolate(); |
+ Heap* heap = isolate->heap(); |
// Traverse the prototype chain from the current object (this) to |
// the holder and check for access rights. This avoids traversing the |
@@ -626,8 +627,10 @@ MaybeObject* Object::GetProperty(Object* receiver, |
Object* last = result->IsProperty() |
? result->holder() |
: Object::cast(heap->null_value()); |
- ASSERT(this != this->GetPrototype()); |
- for (Object* current = this; true; current = current->GetPrototype()) { |
+ ASSERT(this != this->GetPrototype(isolate)); |
+ for (Object* current = this; |
+ true; |
+ current = current->GetPrototype(isolate)) { |
if (current->IsAccessCheckNeeded()) { |
// Check if we're allowed to read from the current object. Note |
// that even though we may not actually end up loading the named |
@@ -687,18 +690,18 @@ MaybeObject* Object::GetProperty(Object* receiver, |
MaybeObject* Object::GetElementWithReceiver(Object* receiver, uint32_t index) { |
- Heap* heap = IsSmi() |
- ? Isolate::Current()->heap() |
- : HeapObject::cast(this)->GetHeap(); |
+ Isolate* isolate = IsSmi() |
+ ? Isolate::Current() |
+ : HeapObject::cast(this)->GetIsolate(); |
+ Heap* heap = isolate->heap(); |
Object* holder = this; |
// Iterate up the prototype chain until an element is found or the null |
// prototype is encountered. |
for (holder = this; |
holder != heap->null_value(); |
- holder = holder->GetPrototype()) { |
+ holder = holder->GetPrototype(isolate)) { |
if (!holder->IsJSObject()) { |
- Isolate* isolate = heap->isolate(); |
Context* native_context = isolate->context()->native_context(); |
if (holder->IsNumber()) { |
holder = native_context->number_function()->instance_prototype(); |
@@ -744,10 +747,9 @@ MaybeObject* Object::GetElementWithReceiver(Object* receiver, uint32_t index) { |
} |
-Object* Object::GetPrototype() { |
+Object* Object::GetPrototype(Isolate* isolate) { |
if (IsSmi()) { |
- Heap* heap = Isolate::Current()->heap(); |
- Context* context = heap->isolate()->context()->native_context(); |
+ Context* context = isolate->context()->native_context(); |
return context->number_function()->instance_prototype(); |
} |
@@ -758,8 +760,7 @@ Object* Object::GetPrototype() { |
if (heap_object->IsJSReceiver()) { |
return heap_object->map()->prototype(); |
} |
- Heap* heap = heap_object->GetHeap(); |
- Context* context = heap->isolate()->context()->native_context(); |
+ Context* context = isolate->context()->native_context(); |
if (heap_object->IsHeapNumber()) { |
return context->number_function()->instance_prototype(); |
@@ -770,7 +771,7 @@ Object* Object::GetPrototype() { |
if (heap_object->IsBoolean()) { |
return context->boolean_function()->instance_prototype(); |
} else { |
- return heap->null_value(); |
+ return isolate->heap()->null_value(); |
} |
} |
@@ -2100,10 +2101,10 @@ MaybeObject* JSObject::SetElementWithCallbackSetterInPrototypes( |
Heap* heap = GetHeap(); |
for (Object* pt = GetPrototype(); |
pt != heap->null_value(); |
- pt = pt->GetPrototype()) { |
+ pt = pt->GetPrototype(GetIsolate())) { |
if (pt->IsJSProxy()) { |
String* name; |
- MaybeObject* maybe = GetHeap()->Uint32ToString(index); |
+ MaybeObject* maybe = heap->Uint32ToString(index); |
if (!maybe->To<String>(&name)) { |
*found = true; // Force abort |
return maybe; |
@@ -2503,10 +2504,11 @@ void JSObject::LookupRealNamedProperty(String* name, LookupResult* result) { |
void JSObject::LookupRealNamedPropertyInPrototypes(String* name, |
LookupResult* result) { |
- Heap* heap = GetHeap(); |
+ Isolate* isolate = GetIsolate(); |
+ Heap* heap = isolate->heap(); |
for (Object* pt = GetPrototype(); |
pt != heap->null_value(); |
- pt = pt->GetPrototype()) { |
+ pt = pt->GetPrototype(isolate)) { |
if (pt->IsJSProxy()) { |
return result->HandlerResult(JSProxy::cast(pt)); |
} |
@@ -8149,13 +8151,14 @@ bool SharedFunctionInfo::CanGenerateInlineConstructor(Object* prototype) { |
return false; |
} |
- Heap* heap = GetHeap(); |
+ Isolate* isolate = GetIsolate(); |
+ Heap* heap = isolate->heap(); |
// Traverse the proposed prototype chain looking for properties of the |
// same names as are set by the inline constructor. |
for (Object* obj = prototype; |
obj != heap->null_value(); |
- obj = obj->GetPrototype()) { |
+ obj = obj->GetPrototype(isolate)) { |
JSReceiver* receiver = JSReceiver::cast(obj); |
for (int i = 0; i < this_property_assignments_count(); i++) { |
LookupResult result(heap->isolate()); |
@@ -9611,7 +9614,8 @@ MaybeObject* JSReceiver::SetPrototype(Object* value, |
int size = Size(); |
#endif |
- Heap* heap = GetHeap(); |
+ Isolate* isolate = GetIsolate(); |
+ Heap* heap = isolate->heap(); |
// Silently ignore the change if value is not a JSObject or null. |
// SpiderMonkey behaves this way. |
if (!value->IsJSReceiver() && !value->IsNull()) return value; |
@@ -9625,22 +9629,24 @@ MaybeObject* JSReceiver::SetPrototype(Object* value, |
// or [[Extensible]] must not violate the invariants defined in the preceding |
// paragraph. |
if (!this->map()->is_extensible()) { |
- HandleScope scope(heap->isolate()); |
- Handle<Object> handle(this, heap->isolate()); |
- return heap->isolate()->Throw( |
- *FACTORY->NewTypeError("non_extensible_proto", |
- HandleVector<Object>(&handle, 1))); |
+ HandleScope scope(isolate); |
+ Handle<Object> handle(this, isolate); |
+ return isolate->Throw( |
+ *isolate->factory()->NewTypeError("non_extensible_proto", |
+ HandleVector<Object>(&handle, 1))); |
} |
// Before we can set the prototype we need to be sure |
// prototype cycles are prevented. |
// It is sufficient to validate that the receiver is not in the new prototype |
// chain. |
- for (Object* pt = value; pt != heap->null_value(); pt = pt->GetPrototype()) { |
+ for (Object* pt = value; |
+ pt != heap->null_value(); |
+ pt = pt->GetPrototype(isolate)) { |
if (JSReceiver::cast(pt) == this) { |
// Cycle detected. |
- HandleScope scope(heap->isolate()); |
- return heap->isolate()->Throw( |
+ HandleScope scope(isolate); |
+ return isolate->Throw( |
*FACTORY->NewError("cyclic_proto", HandleVector<Object>(NULL, 0))); |
} |
} |
@@ -9654,7 +9660,7 @@ MaybeObject* JSReceiver::SetPrototype(Object* value, |
while (current_proto->IsJSObject() && |
JSReceiver::cast(current_proto)->map()->is_hidden_prototype()) { |
real_receiver = JSReceiver::cast(current_proto); |
- current_proto = current_proto->GetPrototype(); |
+ current_proto = current_proto->GetPrototype(isolate); |
} |
} |