Reviewers: Michael Starzinger,

Message:
first attempt: PTAL

Description:
Handlify JSObject::SetObserved

BUG=

Please review this at https://codereview.chromium.org/27070002/

SVN Base: https://v8.googlecode.com/svn/branches/bleeding_edge

Affected files (+30, -22 lines):
  M src/objects.h
  M src/objects.cc
  M src/runtime.cc


Index: src/objects.cc
diff --git a/src/objects.cc b/src/objects.cc
index f39b760402e1f05a937dbaac7d278aa277ca2855..45769be661709351cc7bb5237007f6947992817e 100644
--- a/src/objects.cc
+++ b/src/objects.cc
@@ -5571,37 +5571,34 @@ Handle<Object> JSObject::Freeze(Handle<JSObject> object) {
 }


-MUST_USE_RESULT MaybeObject* JSObject::SetObserved(Isolate* isolate) {
-  if (map()->is_observed())
-    return isolate->heap()->undefined_value();
+void JSObject::SetObserved(Handle<JSObject> 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<Map> 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);
 }


@@ -6829,6 +6826,13 @@ MaybeObject* Map::CopyAsElementsKind(ElementsKind kind, TransitionFlag flag) {
 }


+Handle<Map> Map::CopyForObserved(Handle<Map> map) {
+  CALL_HEAP_FUNCTION(map->GetIsolate(),
+                     map->CopyForObserved(),
+                     Map);
+}
+
+
 MaybeObject* Map::CopyForObserved() {
   ASSERT(!is_observed());

Index: src/objects.h
diff --git a/src/objects.h b/src/objects.h
index 0d1b2510cdde6539967242941ad0f320165e9920..eb063cb6990e4d1fc242a246d2e9231bfea51c48 100644
--- a/src/objects.h
+++ b/src/objects.h
@@ -2538,7 +2538,7 @@ class JSObject: public JSReceiver {
   static Handle<Object> Freeze(Handle<JSObject> object);

   // Called the first time an object is observed with ES7 Object.observe.
-  MUST_USE_RESULT MaybeObject* SetObserved(Isolate* isolate);
+  static void SetObserved(Handle<JSObject> object);

   // Copy object.
   static Handle<JSObject> Copy(Handle<JSObject> object);
@@ -5880,6 +5880,8 @@ class Map: public HeapObject {

   MUST_USE_RESULT MaybeObject* CopyAsElementsKind(ElementsKind kind,
                                                   TransitionFlag flag);
+
+  static Handle<Map> CopyForObserved(Handle<Map> map);
   MUST_USE_RESULT MaybeObject* CopyForObserved();

   static Handle<Map> CopyNormalized(Handle<Map> map,
Index: src/runtime.cc
diff --git a/src/runtime.cc b/src/runtime.cc
index 77014b1771c054e1ec8da1c400b2c2533dc421b0..d133ebef41c18234465abc75614be48e7cca8d19 100644
--- a/src/runtime.cc
+++ b/src/runtime.cc
@@ -14559,7 +14559,7 @@ 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);
   if (obj->IsJSGlobalProxy()) {
@@ -14574,7 +14574,9 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_SetIsObserved) {
   ASSERT(!(obj->map()->is_observed() && obj->IsJSObject() &&
            JSObject::cast(obj)->HasFastElements()));
   ASSERT(obj->IsJSObject());
-  return JSObject::cast(obj)->SetObserved(isolate);
+  Handle<JSObject> js_object(JSObject::cast(obj));
+  JSObject::SetObserved(js_object);
+  return isolate->heap()->undefined_value();
 }




--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
--- You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to