| Index: include/v8.h
|
| diff --git a/include/v8.h b/include/v8.h
|
| index 0efc8f6384816d67e7a3cd1ae6e2468bfa7dafa5..8d60c516953811fc1af52ae67812e51e3e710221 100644
|
| --- a/include/v8.h
|
| +++ b/include/v8.h
|
| @@ -330,6 +330,8 @@ class Local {
|
| template <class F1, class F2, class F3>
|
| friend class PersistentValueMapBase;
|
| template<class F1, class F2> friend class PersistentValueVector;
|
| + template <class F>
|
| + friend class ReturnValue;
|
|
|
| explicit V8_INLINE Local(T* that) : val_(that) {}
|
| V8_INLINE static Local<T> New(Isolate* isolate, T* that);
|
| @@ -3127,12 +3129,17 @@ class ReturnValue {
|
| V8_INLINE void SetUndefined();
|
| V8_INLINE void SetEmptyString();
|
| // Convenience getter for Isolate
|
| - V8_INLINE Isolate* GetIsolate();
|
| + V8_INLINE Isolate* GetIsolate() const;
|
|
|
| // Pointer setter: Uncompilable to prevent inadvertent misuse.
|
| template <typename S>
|
| V8_INLINE void Set(S* whatever);
|
|
|
| + // Getter. Creates a new Local<> so it comes with a certain performance
|
| + // hit. If the ReturnValue was not yet set, this will return the undefined
|
| + // value.
|
| + V8_INLINE Local<Value> Get() const;
|
| +
|
| private:
|
| template<class F> friend class ReturnValue;
|
| template<class F> friend class FunctionCallbackInfo;
|
| @@ -7334,6 +7341,7 @@ class Internals {
|
| kAmountOfExternalAllocatedMemoryAtLastGlobalGCOffset + kApiInt64Size +
|
| kApiPointerSize;
|
| static const int kUndefinedValueRootIndex = 4;
|
| + static const int kTheHoleValueRootIndex = 5;
|
| static const int kNullValueRootIndex = 6;
|
| static const int kTrueValueRootIndex = 7;
|
| static const int kFalseValueRootIndex = 8;
|
| @@ -7813,14 +7821,22 @@ void ReturnValue<T>::SetEmptyString() {
|
| *value_ = *I::GetRoot(GetIsolate(), I::kEmptyStringRootIndex);
|
| }
|
|
|
| -template<typename T>
|
| -Isolate* ReturnValue<T>::GetIsolate() {
|
| +template <typename T>
|
| +Isolate* ReturnValue<T>::GetIsolate() const {
|
| // Isolate is always the pointer below the default value on the stack.
|
| return *reinterpret_cast<Isolate**>(&value_[-2]);
|
| }
|
|
|
| -template<typename T>
|
| -template<typename S>
|
| +template <typename T>
|
| +Local<Value> ReturnValue<T>::Get() const {
|
| + typedef internal::Internals I;
|
| + if (*value_ == *I::GetRoot(GetIsolate(), I::kTheHoleValueRootIndex))
|
| + return Local<Value>(*Undefined(GetIsolate()));
|
| + return Local<Value>::New(GetIsolate(), reinterpret_cast<Value*>(value_));
|
| +}
|
| +
|
| +template <typename T>
|
| +template <typename S>
|
| void ReturnValue<T>::Set(S* whatever) {
|
| // Uncompilable to prevent inadvertent misuse.
|
| TYPE_CHECK(S*, Primitive);
|
|
|