Index: include/v8.h |
diff --git a/include/v8.h b/include/v8.h |
index 68f2de0c4aeddeb15fe979e1a4f6ffe68d075560..e99c6d9a98035d9b6abe7d26705c7ae1b02a280e 100644 |
--- a/include/v8.h |
+++ b/include/v8.h |
@@ -2852,6 +2852,7 @@ class ReturnValue { |
template<class F> friend class ReturnValue; |
template<class F> friend class FunctionCallbackInfo; |
template<class F> friend class PropertyCallbackInfo; |
+ V8_INLINE(internal::Object* GetDefaultValue()); |
V8_INLINE(explicit ReturnValue(internal::Object** slot)); |
internal::Object** value_; |
}; |
@@ -2876,16 +2877,17 @@ class FunctionCallbackInfo { |
V8_INLINE(Isolate* GetIsolate() const); |
V8_INLINE(ReturnValue<T> GetReturnValue() const); |
// This shouldn't be public, but the arm compiler needs it. |
- static const int kArgsLength = 5; |
+ static const int kArgsLength = 6; |
protected: |
friend class internal::FunctionCallbackArguments; |
friend class internal::CustomArguments<FunctionCallbackInfo>; |
static const int kReturnValueIndex = 0; |
- static const int kIsolateIndex = -1; |
- static const int kDataIndex = -2; |
- static const int kCalleeIndex = -3; |
- static const int kHolderIndex = -4; |
+ static const int kReturnValueDefaultValueIndex = -1; |
+ static const int kIsolateIndex = -2; |
+ static const int kDataIndex = -3; |
+ static const int kCalleeIndex = -4; |
+ static const int kHolderIndex = -5; |
V8_INLINE(FunctionCallbackInfo(internal::Object** implicit_args, |
internal::Object** values, |
@@ -2920,7 +2922,7 @@ class PropertyCallbackInfo { |
V8_INLINE(Local<Object> Holder() const); |
V8_INLINE(ReturnValue<T> GetReturnValue() const); |
// This shouldn't be public, but the arm compiler needs it. |
- static const int kArgsLength = 5; |
+ static const int kArgsLength = 6; |
protected: |
friend class MacroAssembler; |
@@ -2930,7 +2932,8 @@ class PropertyCallbackInfo { |
static const int kHolderIndex = -1; |
static const int kDataIndex = -2; |
static const int kReturnValueIndex = -3; |
- static const int kIsolateIndex = -4; |
+ static const int kReturnValueDefaultValueIndex = -4; |
+ static const int kIsolateIndex = -5; |
V8_INLINE(PropertyCallbackInfo(internal::Object** args)) |
: args_(args) { } |
@@ -5658,7 +5661,7 @@ template<typename S> |
void ReturnValue<T>::Set(const Persistent<S>& handle) { |
TYPE_CHECK(T, S); |
if (V8_UNLIKELY(handle.IsEmpty())) { |
- SetUndefined(); |
+ *value_ = GetDefaultValue(); |
} else { |
*value_ = *reinterpret_cast<internal::Object**>(*handle); |
} |
@@ -5669,7 +5672,7 @@ template<typename S> |
void ReturnValue<T>::Set(const Handle<S> handle) { |
TYPE_CHECK(T, S); |
if (V8_UNLIKELY(handle.IsEmpty())) { |
- SetUndefined(); |
+ *value_ = GetDefaultValue(); |
} else { |
*value_ = *reinterpret_cast<internal::Object**>(*handle); |
} |
@@ -5728,8 +5731,14 @@ void ReturnValue<T>::SetUndefined() { |
template<typename T> |
Isolate* ReturnValue<T>::GetIsolate() { |
- // Isolate is always the pointer below value_ on the stack. |
- return *reinterpret_cast<Isolate**>(&value_[-1]); |
+ // Isolate is always the pointer below the default value on the stack. |
+ return *reinterpret_cast<Isolate**>(&value_[-2]); |
+} |
+ |
+template<typename T> |
+internal::Object* ReturnValue<T>::GetDefaultValue() { |
+ // Default value is always the pointer below value_ on the stack. |
+ return value_[-1]; |
} |