Index: src/runtime.cc |
=================================================================== |
--- src/runtime.cc (revision 1100) |
+++ src/runtime.cc (working copy) |
@@ -4536,32 +4536,49 @@ |
} |
-static Object* DebugLookupResultValue(Object* obj, String* name, |
- LookupResult* result, |
+static Object* DebugLookupResultValue(Object* receiver, LookupResult* result, |
bool* caught_exception) { |
+ Object* value; |
switch (result->type()) { |
- case NORMAL: |
+ case NORMAL: { |
+ Dictionary* dict = |
+ JSObject::cast(result->holder())->property_dictionary(); |
+ value = dict->ValueAt(result->GetDictionaryEntry()); |
+ if (value->IsTheHole()) { |
+ return Heap::undefined_value(); |
+ } |
+ return value; |
+ } |
case FIELD: |
+ value = |
+ JSObject::cast( |
+ result->holder())->FastPropertyAt(result->GetFieldIndex()); |
+ if (value->IsTheHole()) { |
+ return Heap::undefined_value(); |
+ } |
+ return value; |
case CONSTANT_FUNCTION: |
- return obj->GetProperty(name); |
+ return result->GetConstantFunction(); |
case CALLBACKS: { |
- // Get the property value. If there is an exception it must be thrown from |
- // a JavaScript getter. |
- Object* value; |
- value = obj->GetProperty(name); |
- if (value->IsException()) { |
- if (caught_exception != NULL) { |
- *caught_exception = true; |
+ Object* structure = result->GetCallbackObject(); |
+ if (structure->IsProxy()) { |
+ AccessorDescriptor* callback = |
+ reinterpret_cast<AccessorDescriptor*>( |
+ Proxy::cast(structure)->proxy()); |
+ value = (callback->getter)(receiver, callback->data); |
+ if (value->IsFailure()) { |
+ value = Top::pending_exception(); |
+ Top::clear_pending_exception(); |
+ if (caught_exception != NULL) { |
+ *caught_exception = true; |
+ } |
} |
- value = Top::pending_exception(); |
- Top::optional_reschedule_exception(true); |
+ return value; |
+ } else { |
+ return Heap::undefined_value(); |
} |
- ASSERT(!Top::has_pending_exception()); |
- ASSERT(!Top::external_caught_exception()); |
- return value; |
} |
case INTERCEPTOR: |
- return obj->GetProperty(name); |
case MAP_TRANSITION: |
case CONSTANT_TRANSITION: |
case NULL_DESCRIPTOR: |
@@ -4609,7 +4626,7 @@ |
obj->LocalLookup(*name, &result); |
if (result.IsProperty()) { |
bool caught_exception = false; |
- Handle<Object> value(DebugLookupResultValue(*obj, *name, &result, |
+ Handle<Object> value(DebugLookupResultValue(*obj, &result, |
&caught_exception)); |
// If the callback object is a fixed array then it contains JavaScript |
// getter and/or setter. |
@@ -4643,7 +4660,7 @@ |
LookupResult result; |
obj->Lookup(*name, &result); |
if (result.IsProperty()) { |
- return DebugLookupResultValue(*obj, *name, &result, NULL); |
+ return DebugLookupResultValue(*obj, &result, NULL); |
} |
return Heap::undefined_value(); |
} |