From 2268defb84c6e60e3c35409109fce72f333acc7d Mon Sep 17 00:00:00 2001 From: "rafaelw@chromium.org" Date: Tue, 15 Oct 2013 19:28:11 +0000 Subject: [PATCH] Handlify JSObject::SetObserved BUG= R=mstarzinger@chromium.org Review URL: https://codereview.chromium.org/27070002 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@17224 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/objects.cc | 42 +++++++++++++++++++++++------------------- src/objects.h | 4 +++- src/runtime.cc | 11 ++++++----- 3 files changed, 32 insertions(+), 25 deletions(-) diff --git a/src/objects.cc b/src/objects.cc index 26cb3c53dc..b3700dc2ca 100644 --- a/src/objects.cc +++ b/src/objects.cc @@ -5581,37 +5581,34 @@ Handle JSObject::Freeze(Handle object) { } -MUST_USE_RESULT MaybeObject* JSObject::SetObserved(Isolate* isolate) { - if (map()->is_observed()) - return isolate->heap()->undefined_value(); +void JSObject::SetObserved(Handle object) { + Isolate* isolate = object->GetIsolate(); - Heap* heap = isolate->heap(); + if (object->map()->is_observed()) + return; - if (!HasExternalArrayElements()) { + if (!object->HasExternalArrayElements()) { // Go to dictionary mode, so that we don't skip map checks. - MaybeObject* maybe = NormalizeElements(); - if (maybe->IsFailure()) return maybe; - ASSERT(!HasFastElements()); + NormalizeElements(object); + ASSERT(!object->HasFastElements()); } LookupResult result(isolate); - map()->LookupTransition(this, heap->observed_symbol(), &result); + object->map()->LookupTransition(*object, + isolate->heap()->observed_symbol(), + &result); - Map* new_map; + Handle new_map; if (result.IsTransition()) { - new_map = result.GetTransitionTarget(); + new_map = handle(result.GetTransitionTarget()); ASSERT(new_map->is_observed()); - } else if (map()->CanHaveMoreTransitions()) { - MaybeObject* maybe_new_map = map()->CopyForObserved(); - if (!maybe_new_map->To(&new_map)) return maybe_new_map; + } else if (object->map()->CanHaveMoreTransitions()) { + new_map = Map::CopyForObserved(handle(object->map())); } else { - MaybeObject* maybe_copy = map()->Copy(); - if (!maybe_copy->To(&new_map)) return maybe_copy; + new_map = Map::Copy(handle(object->map())); new_map->set_is_observed(true); } - set_map(new_map); - - return heap->undefined_value(); + object->set_map(*new_map); } @@ -6839,6 +6836,13 @@ MaybeObject* Map::CopyAsElementsKind(ElementsKind kind, TransitionFlag flag) { } +Handle Map::CopyForObserved(Handle map) { + CALL_HEAP_FUNCTION(map->GetIsolate(), + map->CopyForObserved(), + Map); +} + + MaybeObject* Map::CopyForObserved() { ASSERT(!is_observed()); diff --git a/src/objects.h b/src/objects.h index 2925c54f18..add032eb1f 100644 --- a/src/objects.h +++ b/src/objects.h @@ -2541,7 +2541,7 @@ class JSObject: public JSReceiver { static Handle Freeze(Handle object); // Called the first time an object is observed with ES7 Object.observe. - MUST_USE_RESULT MaybeObject* SetObserved(Isolate* isolate); + static void SetObserved(Handle object); // Copy object. static Handle Copy(Handle object); @@ -5977,6 +5977,8 @@ class Map: public HeapObject { MUST_USE_RESULT MaybeObject* CopyAsElementsKind(ElementsKind kind, TransitionFlag flag); + + static Handle CopyForObserved(Handle map); MUST_USE_RESULT MaybeObject* CopyForObserved(); static Handle CopyNormalized(Handle map, diff --git a/src/runtime.cc b/src/runtime.cc index be0281b846..d54a9f9ea5 100644 --- a/src/runtime.cc +++ b/src/runtime.cc @@ -14566,22 +14566,23 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_IsObserved) { RUNTIME_FUNCTION(MaybeObject*, Runtime_SetIsObserved) { - SealHandleScope shs(isolate); + HandleScope scope(isolate); ASSERT(args.length() == 1); - CONVERT_ARG_CHECKED(JSReceiver, obj, 0); + CONVERT_ARG_HANDLE_CHECKED(JSReceiver, obj, 0); if (obj->IsJSGlobalProxy()) { Object* proto = obj->GetPrototype(); if (proto->IsNull()) return isolate->heap()->undefined_value(); ASSERT(proto->IsJSGlobalObject()); - obj = JSReceiver::cast(proto); + obj = handle(JSReceiver::cast(proto)); } if (obj->IsJSProxy()) return isolate->heap()->undefined_value(); ASSERT(!(obj->map()->is_observed() && obj->IsJSObject() && - JSObject::cast(obj)->HasFastElements())); + Handle::cast(obj)->HasFastElements())); ASSERT(obj->IsJSObject()); - return JSObject::cast(obj)->SetObserved(isolate); + JSObject::SetObserved(Handle::cast(obj)); + return isolate->heap()->undefined_value(); }