| Index: src/runtime.cc
|
| diff --git a/src/runtime.cc b/src/runtime.cc
|
| index 7ce8b79c3011ed3730e2290138f56952264c729e..3c5d1c6f9f852aef453b0fdbeb03bdb391db7759 100644
|
| --- a/src/runtime.cc
|
| +++ b/src/runtime.cc
|
| @@ -10718,63 +10718,49 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_Break) {
|
| }
|
|
|
|
|
| -static MaybeObject* DebugLookupResultValue(Heap* heap,
|
| - Object* receiver,
|
| - Name* name,
|
| - LookupResult* result,
|
| - bool* caught_exception) {
|
| - Object* value;
|
| - if (result->IsTransition()) return heap->undefined_value();
|
| +static Handle<Object> DebugLookupResultValue(Isolate* isolate,
|
| + Handle<Object> receiver,
|
| + Handle<Name> name,
|
| + LookupResult* result,
|
| + bool* has_caught = NULL) {
|
| + Handle<Object> value = isolate->factory()->undefined_value();
|
| + if (!result->IsFound()) return value;
|
| switch (result->type()) {
|
| case NORMAL:
|
| - value = result->holder()->GetNormalizedProperty(result);
|
| - if (value->IsTheHole()) {
|
| - return heap->undefined_value();
|
| - }
|
| - return value;
|
| - case FIELD: {
|
| - Object* value;
|
| - MaybeObject* maybe_value =
|
| - JSObject::cast(result->holder())->FastPropertyAt(
|
| - result->representation(),
|
| - result->GetFieldIndex().field_index());
|
| - if (!maybe_value->To(&value)) return maybe_value;
|
| - if (value->IsTheHole()) {
|
| - return heap->undefined_value();
|
| - }
|
| - return value;
|
| - }
|
| + value = JSObject::GetNormalizedProperty(
|
| + handle(result->holder(), isolate), result);
|
| + break;
|
| + case FIELD:
|
| + value = JSObject::FastPropertyAt(handle(result->holder(), isolate),
|
| + result->representation(),
|
| + result->GetFieldIndex().field_index());
|
| + break;
|
| case CONSTANT:
|
| - return result->GetConstant();
|
| + return handle(result->GetConstant(), isolate);
|
| case CALLBACKS: {
|
| - Object* structure = result->GetCallbackObject();
|
| + Handle<Object> structure(result->GetCallbackObject(), isolate);
|
| if (structure->IsForeign() || structure->IsAccessorInfo()) {
|
| - Isolate* isolate = heap->isolate();
|
| - HandleScope scope(isolate);
|
| - MaybeHandle<Object> maybe_value = JSObject::GetPropertyWithCallback(
|
| - handle(result->holder(), isolate),
|
| - handle(receiver, isolate),
|
| - handle(structure, isolate),
|
| - handle(name, isolate));
|
| - Handle<Object> value;
|
| - if (maybe_value.ToHandle(&value)) return *value;
|
| - Object* exception = heap->isolate()->pending_exception();
|
| - heap->isolate()->clear_pending_exception();
|
| - if (caught_exception != NULL) *caught_exception = true;
|
| - return exception;
|
| - } else {
|
| - return heap->undefined_value();
|
| + MaybeHandle<Object> obj = JSObject::GetPropertyWithCallback(
|
| + handle(result->holder(), isolate), receiver, structure, name);
|
| + if (!obj.ToHandle(&value)) {
|
| + value = handle(isolate->pending_exception(), isolate);
|
| + isolate->clear_pending_exception();
|
| + if (has_caught != NULL) *has_caught = true;
|
| + return value;
|
| + }
|
| }
|
| + break;
|
| }
|
| case INTERCEPTOR:
|
| - return heap->undefined_value();
|
| + break;
|
| case HANDLER:
|
| case NONEXISTENT:
|
| UNREACHABLE();
|
| - return heap->undefined_value();
|
| + break;
|
| }
|
| - UNREACHABLE(); // keep the compiler happy
|
| - return heap->undefined_value();
|
| + ASSERT(!value->IsTheHole() || result->IsReadOnly());
|
| + return value->IsTheHole()
|
| + ? Handle<Object>::cast(isolate->factory()->undefined_value()) : value;
|
| }
|
|
|
|
|
| @@ -10848,29 +10834,23 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugGetPropertyDetails) {
|
| result_callback_obj = Handle<Object>(result.GetCallbackObject(),
|
| isolate);
|
| }
|
| - Smi* property_details = result.GetPropertyDetails().AsSmi();
|
| - // DebugLookupResultValue can cause GC so details from LookupResult needs
|
| - // to be copied to handles before this.
|
| - bool caught_exception = false;
|
| - Object* raw_value;
|
| - { MaybeObject* maybe_raw_value =
|
| - DebugLookupResultValue(isolate->heap(), *obj, *name,
|
| - &result, &caught_exception);
|
| - if (!maybe_raw_value->ToObject(&raw_value)) return maybe_raw_value;
|
| - }
|
| - Handle<Object> value(raw_value, isolate);
|
| +
|
| +
|
| + bool has_caught;
|
| + Handle<Object> value = DebugLookupResultValue(
|
| + isolate, obj, name, &result, &has_caught);
|
|
|
| // If the callback object is a fixed array then it contains JavaScript
|
| // getter and/or setter.
|
| - bool hasJavaScriptAccessors = result.IsPropertyCallbacks() &&
|
| - result_callback_obj->IsAccessorPair();
|
| + bool has_js_accessors = result.IsPropertyCallbacks() &&
|
| + result_callback_obj->IsAccessorPair();
|
| Handle<FixedArray> details =
|
| - isolate->factory()->NewFixedArray(hasJavaScriptAccessors ? 5 : 2);
|
| + isolate->factory()->NewFixedArray(has_js_accessors ? 5 : 2);
|
| details->set(0, *value);
|
| - details->set(1, property_details);
|
| - if (hasJavaScriptAccessors) {
|
| + details->set(1, result.GetPropertyDetails().AsSmi());
|
| + if (has_js_accessors) {
|
| AccessorPair* accessors = AccessorPair::cast(*result_callback_obj);
|
| - details->set(2, isolate->heap()->ToBoolean(caught_exception));
|
| + details->set(2, isolate->heap()->ToBoolean(has_caught));
|
| details->set(3, accessors->GetComponent(ACCESSOR_GETTER));
|
| details->set(4, accessors->GetComponent(ACCESSOR_SETTER));
|
| }
|
| @@ -10896,10 +10876,7 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugGetProperty) {
|
|
|
| LookupResult result(isolate);
|
| obj->Lookup(*name, &result);
|
| - if (result.IsFound()) {
|
| - return DebugLookupResultValue(isolate->heap(), *obj, *name, &result, NULL);
|
| - }
|
| - return isolate->heap()->undefined_value();
|
| + return *DebugLookupResultValue(isolate, obj, name, &result);
|
| }
|
|
|
|
|
|
|