Revision: 12474
Author:   [email protected]
Date:     Mon Sep 10 06:38:21 2012
Log:      Add more checks for native callback results.

[email protected]
BUG=

Review URL: https://chromiumcodereview.appspot.com/10928083
http://code.google.com/p/v8/source/detail?r=12474

Modified:
 /branches/bleeding_edge/src/builtins.cc
 /branches/bleeding_edge/src/handles.cc
 /branches/bleeding_edge/src/objects-inl.h
 /branches/bleeding_edge/src/objects.cc
 /branches/bleeding_edge/src/objects.h
 /branches/bleeding_edge/src/stub-cache.cc

=======================================
--- /branches/bleeding_edge/src/builtins.cc     Fri Sep  7 02:01:54 2012
+++ /branches/bleeding_edge/src/builtins.cc     Mon Sep 10 06:38:21 2012
@@ -1149,6 +1149,7 @@
       result = heap->undefined_value();
     } else {
       result = *reinterpret_cast<Object**>(*value);
+      result->VerifyApiCallResultType();
     }

     RETURN_IF_SCHEDULED_EXCEPTION(isolate);
@@ -1225,6 +1226,7 @@
       result = heap->undefined_value();
     } else {
       result = *reinterpret_cast<Object**>(*value);
+      result->VerifyApiCallResultType();
     }
   }
   // Check for exceptions and return result.
=======================================
--- /branches/bleeding_edge/src/handles.cc      Mon Sep  3 08:15:32 2012
+++ /branches/bleeding_edge/src/handles.cc      Mon Sep 10 06:38:21 2012
@@ -561,6 +561,9 @@
       result = enum_fun(info);
     }
   }
+#if ENABLE_EXTRA_CHECKS
+  CHECK(result.IsEmpty() || v8::Utils::OpenHandle(*result)->IsJSObject());
+#endif
   return result;
 }

@@ -581,6 +584,9 @@
       // Leaving JavaScript.
       VMState state(isolate, EXTERNAL);
       result = enum_fun(info);
+#if ENABLE_EXTRA_CHECKS
+ CHECK(result.IsEmpty() || v8::Utils::OpenHandle(*result)->IsJSObject());
+#endif
     }
   }
   return result;
=======================================
--- /branches/bleeding_edge/src/objects-inl.h   Tue Aug 28 04:25:08 2012
+++ /branches/bleeding_edge/src/objects-inl.h   Mon Sep 10 06:38:21 2012
@@ -1662,6 +1662,23 @@

   return true;
 }
+
+
+
+void Object::VerifyApiCallResultType() {
+#if ENABLE_EXTRA_CHECKS
+  if (!(IsSmi() ||
+        IsString() ||
+        IsSpecObject() ||
+        IsHeapNumber() ||
+        IsUndefined() ||
+        IsTrue() ||
+        IsFalse() ||
+        IsNull())) {
+    FATAL("API call returned invalid object");
+  }
+#endif  // ENABLE_EXTRA_CHECKS
+}


 FixedArrayBase* FixedArrayBase::cast(Object* object) {
=======================================
--- /branches/bleeding_edge/src/objects.cc      Mon Sep 10 01:35:26 2012
+++ /branches/bleeding_edge/src/objects.cc      Mon Sep 10 06:38:21 2012
@@ -211,18 +211,7 @@
       return isolate->heap()->undefined_value();
     }
     Object* return_value = *v8::Utils::OpenHandle(*result);
-#if ENABLE_EXTRA_CHECKS
-    if (!(return_value->IsSmi() ||
-          return_value->IsString() ||
-          return_value->IsSpecObject() ||
-          return_value->IsHeapNumber() ||
-          return_value->IsUndefined() ||
-          return_value->IsTrue() ||
-          return_value->IsFalse() ||
-          return_value->IsNull())) {
-      FATAL("API call returned invalid object");
-    }
-#endif
+    return_value->VerifyApiCallResultType();
     return return_value;
   }

@@ -3805,7 +3794,9 @@
     RETURN_IF_SCHEDULED_EXCEPTION(isolate);
     if (!result.IsEmpty()) {
       ASSERT(result->IsBoolean());
-      return *v8::Utils::OpenHandle(*result);
+      Handle<Object> result_internal = v8::Utils::OpenHandle(*result);
+      result_internal->VerifyApiCallResultType();
+      return *result_internal;
     }
   }
   MaybeObject* raw_result =
@@ -3840,7 +3831,9 @@
   RETURN_IF_SCHEDULED_EXCEPTION(isolate);
   if (!result.IsEmpty()) {
     ASSERT(result->IsBoolean());
-    return *v8::Utils::OpenHandle(*result);
+    Handle<Object> result_internal = v8::Utils::OpenHandle(*result);
+    result_internal->VerifyApiCallResultType();
+    return *result_internal;
   }
   MaybeObject* raw_result = this_handle->GetElementsAccessor()->Delete(
       *this_handle,
@@ -9133,7 +9126,9 @@
     }
     RETURN_IF_SCHEDULED_EXCEPTION(isolate);
     if (result.IsEmpty()) return isolate->heap()->undefined_value();
-    return *v8::Utils::OpenHandle(*result);
+    Handle<Object> result_internal = v8::Utils::OpenHandle(*result);
+    result_internal->VerifyApiCallResultType();
+    return *result_internal;
   }

   // __defineGetter__ callback
@@ -9952,7 +9947,11 @@
       result = getter(index, info);
     }
     RETURN_IF_SCHEDULED_EXCEPTION(isolate);
-    if (!result.IsEmpty()) return *v8::Utils::OpenHandle(*result);
+    if (!result.IsEmpty()) {
+      Handle<Object> result_internal = v8::Utils::OpenHandle(*result);
+      result_internal->VerifyApiCallResultType();
+      return *result_internal;
+    }
   }

   Heap* heap = holder_handle->GetHeap();
@@ -10254,7 +10253,9 @@
     RETURN_IF_SCHEDULED_EXCEPTION(isolate);
     if (!result.IsEmpty()) {
       *attributes = NONE;
-      return *v8::Utils::OpenHandle(*result);
+      Handle<Object> result_internal = v8::Utils::OpenHandle(*result);
+      result_internal->VerifyApiCallResultType();
+      return *result_internal;
     }
   }

=======================================
--- /branches/bleeding_edge/src/objects.h       Mon Sep 10 01:35:26 2012
+++ /branches/bleeding_edge/src/objects.h       Mon Sep 10 06:38:21 2012
@@ -970,6 +970,8 @@
   static void VerifyPointer(Object* p);
 #endif

+  inline void VerifyApiCallResultType();
+
   // Prints this object without details.
   inline void ShortPrint() {
     ShortPrint(stdout);
=======================================
--- /branches/bleeding_edge/src/stub-cache.cc   Tue Aug 28 23:12:46 2012
+++ /branches/bleeding_edge/src/stub-cache.cc   Mon Sep 10 06:38:21 2012
@@ -1005,7 +1005,9 @@
   }
   RETURN_IF_SCHEDULED_EXCEPTION(isolate);
   if (result.IsEmpty()) return HEAP->undefined_value();
-  return *v8::Utils::OpenHandle(*result);
+  Handle<Object> result_internal = v8::Utils::OpenHandle(*result);
+  result_internal->VerifyApiCallResultType();
+  return *result_internal;
 }


@@ -1070,6 +1072,8 @@
     }
     RETURN_IF_SCHEDULED_EXCEPTION(isolate);
     if (!r.IsEmpty()) {
+      Handle<Object> result = v8::Utils::OpenHandle(*r);
+      result->VerifyApiCallResultType();
       return *v8::Utils::OpenHandle(*r);
     }
   }
@@ -1126,7 +1130,9 @@
     RETURN_IF_SCHEDULED_EXCEPTION(isolate);
     if (!r.IsEmpty()) {
       *attrs = NONE;
-      return *v8::Utils::OpenHandle(*r);
+      Handle<Object> result = v8::Utils::OpenHandle(*r);
+      result->VerifyApiCallResultType();
+      return *result;
     }
   }

--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev

Reply via email to