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
This commit is contained in:
parent
cb1a32885c
commit
623f2371eb
11
include/v8.h
11
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 <typename S>
|
||||
V8_INLINE void Set(S* whatever);
|
||||
|
||||
private:
|
||||
template<class F> friend class ReturnValue;
|
||||
template<class F> friend class FunctionCallbackInfo;
|
||||
@ -5973,6 +5977,13 @@ Isolate* ReturnValue<T>::GetIsolate() {
|
||||
return *reinterpret_cast<Isolate**>(&value_[-2]);
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
template<typename S>
|
||||
void ReturnValue<T>::Set(S* whatever) {
|
||||
// Uncompilable to prevent inadvertent misuse.
|
||||
TYPE_CHECK(S*, Primitive);
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
internal::Object* ReturnValue<T>::GetDefaultValue() {
|
||||
// Default value is always the pointer below value_ on the stack.
|
||||
|
Loading…
Reference in New Issue
Block a user