From: yangguo@chromium.org Date: Mon, 14 Apr 2014 19:38:29 +0000 (+0000) Subject: Reland "Handlify DebugLookupResultValue." X-Git-Tag: upstream/4.7.83~9626 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=af1272cf78333ba2a8411d9518beb3294c3f91e7;p=platform%2Fupstream%2Fv8.git Reland "Handlify DebugLookupResultValue." R=jarin@chromium.org Review URL: https://codereview.chromium.org/237013003 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@20739 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- diff --git a/src/objects.cc b/src/objects.cc index 76d2709..3342a5f 100644 --- a/src/objects.cc +++ b/src/objects.cc @@ -793,8 +793,8 @@ MaybeHandle Object::GetProperty(Handle object, Handle value; switch (result->type()) { case NORMAL: { - DisallowHeapAllocation no_gc; - value = handle(result->holder()->GetNormalizedProperty(result), isolate); + value = JSObject::GetNormalizedProperty( + handle(result->holder(), isolate), result); break; } case FIELD: diff --git a/src/runtime.cc b/src/runtime.cc index 6c1ff6b..e2dcd89 100644 --- a/src/runtime.cc +++ b/src/runtime.cc @@ -10714,63 +10714,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 DebugLookupResultValue(Isolate* isolate, + Handle receiver, + Handle name, + LookupResult* result, + bool* has_caught = NULL) { + Handle 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 structure(result->GetCallbackObject(), isolate); if (structure->IsForeign() || structure->IsAccessorInfo()) { - Isolate* isolate = heap->isolate(); - HandleScope scope(isolate); - MaybeHandle maybe_value = JSObject::GetPropertyWithCallback( - handle(result->holder(), isolate), - handle(receiver, isolate), - handle(structure, isolate), - handle(name, isolate)); - Handle 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 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::cast(isolate->factory()->undefined_value()) : value; } @@ -10844,29 +10830,23 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugGetPropertyDetails) { result_callback_obj = Handle(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 value(raw_value, isolate); + + + bool has_caught = false; + Handle 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 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)); } @@ -10892,10 +10872,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); }