From 623f2371eba0096cfbac4283af6b7c6e32c13d30 Mon Sep 17 00:00:00 2001 From: "vogelheim@chromium.org" Date: Fri, 9 May 2014 15:36:51 +0000 Subject: [PATCH] Prevent calls to ReturnValue::Set with pointer-valued types. [2nd try, after the previous version broke the build] Currently, this code will compile: SomePointer* p = ...; ReturnValue r = ...; r.Set(p); What happens is that ReturnValue::Set has no pointer-ish overloads, but a bool one, and hence C++ will convert the pointer to a bool and use the Set(bool) overload. In other words, the example above is equivalent to: r.Set(p ? true : false); Which probably isn't what the author had in mind. This change adds a Set(void*) overload whose body forces a compile error, to prevent this from happening inadvertently. The only use of this indeed turned out to be an error. (Said error was fixed/removed in crrev.com/267393002.) Why was crrev.com/240013004 reverted? The orginal version compiled fine on gcc (+ MSVC), but not on clang. There's no clang try-bots, but the ASAN-based buildbots used clang and hence the build broke. I'm slightly unsure on why, but clang - unlike those other compilers - eagerly compiled the non-compilable setter, which predictably broke. Now, the non-compilable setter uses the same template logic that all other, comparable cases use. I've tried 'make qc' with both gcc and clang versions. BUG= R=dcarney@chromium.org Review URL: https://codereview.chromium.org/279883002 git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@21228 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- include/v8.h | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/include/v8.h b/include/v8.h index 72dc75d42a..f4ae71d43c 100644 --- a/include/v8.h +++ b/include/v8.h @@ -2429,6 +2429,10 @@ class ReturnValue { // Convenience getter for Isolate V8_INLINE Isolate* GetIsolate(); + // Pointer setter: Uncompilable to prevent inadvertent misuse. + template + V8_INLINE void Set(S* whatever); + private: template friend class ReturnValue; template friend class FunctionCallbackInfo; @@ -5973,6 +5977,13 @@ Isolate* ReturnValue::GetIsolate() { return *reinterpret_cast(&value_[-2]); } +template +template +void ReturnValue::Set(S* whatever) { + // Uncompilable to prevent inadvertent misuse. + TYPE_CHECK(S*, Primitive); +} + template internal::Object* ReturnValue::GetDefaultValue() { // Default value is always the pointer below value_ on the stack.