Index: src/objects.cc |
diff --git a/src/objects.cc b/src/objects.cc |
index 724a734a2145d6b682725a6b9b7e9d5b7c2f26af..12bda591c82421266895ef4ab4fe7b6cec7b2403 100644 |
--- a/src/objects.cc |
+++ b/src/objects.cc |
@@ -134,24 +134,22 @@ Object* Object::ToBoolean() { |
void Object::Lookup(String* name, LookupResult* result) { |
Object* holder = NULL; |
if (IsSmi()) { |
- Heap* heap = Isolate::Current()->heap(); |
- Context* global_context = heap->isolate()->context()->global_context(); |
+ Context* global_context = Isolate::Current()->context()->global_context(); |
holder = global_context->number_function()->instance_prototype(); |
} else { |
HeapObject* heap_object = HeapObject::cast(this); |
if (heap_object->IsJSObject()) { |
return JSObject::cast(this)->Lookup(name, result); |
} |
- Heap* heap = heap_object->GetHeap(); |
+ Context* global_context = Isolate::Current()->context()->global_context(); |
if (heap_object->IsString()) { |
- Context* global_context = heap->isolate()->context()->global_context(); |
holder = global_context->string_function()->instance_prototype(); |
} else if (heap_object->IsHeapNumber()) { |
- Context* global_context = heap->isolate()->context()->global_context(); |
holder = global_context->number_function()->instance_prototype(); |
} else if (heap_object->IsBoolean()) { |
- Context* global_context = heap->isolate()->context()->global_context(); |
holder = global_context->boolean_function()->instance_prototype(); |
+ } else if (heap_object->IsJSProxy()) { |
+ return result->NotFound(); // For now... |
} |
} |
ASSERT(holder != NULL); // Cannot handle null or undefined. |
@@ -494,12 +492,13 @@ MaybeObject* Object::GetProperty(Object* receiver, |
Heap* heap = name->GetHeap(); |
// Traverse the prototype chain from the current object (this) to |
- // the holder and check for access rights. This avoid traversing the |
+ // the holder and check for access rights. This avoids traversing the |
// objects more than once in case of interceptors, because the |
// holder will always be the interceptor holder and the search may |
// only continue with a current object just after the interceptor |
// holder in the prototype chain. |
Object* last = result->IsProperty() ? result->holder() : heap->null_value(); |
+ ASSERT(this != this->GetPrototype()); |
for (Object* current = this; true; current = current->GetPrototype()) { |
if (current->IsAccessCheckNeeded()) { |
// Check if we're allowed to read from the current object. Note |
@@ -575,6 +574,8 @@ MaybeObject* Object::GetElementWithReceiver(Object* receiver, uint32_t index) { |
holder = global_context->number_function()->instance_prototype(); |
} else if (heap_object->IsBoolean()) { |
holder = global_context->boolean_function()->instance_prototype(); |
+ } else if (heap_object->IsJSProxy()) { |
+ return heap->undefined_value(); // For now... |
} else { |
// Undefined and null have no indexed properties. |
ASSERT(heap_object->IsUndefined() || heap_object->IsNull()); |
@@ -595,9 +596,10 @@ Object* Object::GetPrototype() { |
HeapObject* heap_object = HeapObject::cast(this); |
- // The object is either a number, a string, a boolean, or a real JS object. |
- if (heap_object->IsJSObject()) { |
- return JSObject::cast(this)->map()->prototype(); |
+ // The object is either a number, a string, a boolean, |
+ // a real JS object, or a Harmony proxy. |
+ if (heap_object->IsJSObject() || heap_object->IsJSProxy()) { |
+ return heap_object->map()->prototype(); |
} |
Heap* heap = heap_object->GetHeap(); |
Context* context = heap->isolate()->context()->global_context(); |
@@ -1154,6 +1156,9 @@ void HeapObject::IterateBody(InstanceType type, int object_size, |
case ODDBALL_TYPE: |
Oddball::BodyDescriptor::IterateBody(this, v); |
break; |
+ case JS_PROXY_TYPE: |
+ JSProxy::BodyDescriptor::IterateBody(this, v); |
+ break; |
case PROXY_TYPE: |
reinterpret_cast<Proxy*>(this)->ProxyIterateBody(v); |
break; |