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