v8.h | v8.h | |||
---|---|---|---|---|
skipping to change at line 143 | skipping to change at line 143 | |||
class Data; | class Data; | |||
template<typename T> class PropertyCallbackInfo; | template<typename T> class PropertyCallbackInfo; | |||
class StackTrace; | class StackTrace; | |||
class StackFrame; | class StackFrame; | |||
class Isolate; | class Isolate; | |||
class DeclaredAccessorDescriptor; | class DeclaredAccessorDescriptor; | |||
class ObjectOperationDescriptor; | class ObjectOperationDescriptor; | |||
class RawOperationDescriptor; | class RawOperationDescriptor; | |||
class CallHandlerHelper; | class CallHandlerHelper; | |||
class EscapableHandleScope; | class EscapableHandleScope; | |||
template<typename T> class ReturnValue; | ||||
namespace internal { | namespace internal { | |||
class Arguments; | class Arguments; | |||
class Heap; | class Heap; | |||
class HeapObject; | class HeapObject; | |||
class Isolate; | class Isolate; | |||
class Object; | class Object; | |||
template<typename T> class CustomArguments; | template<typename T> class CustomArguments; | |||
class PropertyCallbackArguments; | class PropertyCallbackArguments; | |||
class FunctionCallbackArguments; | class FunctionCallbackArguments; | |||
skipping to change at line 411 | skipping to change at line 412 | |||
template<class F> friend class Handle; | template<class F> friend class Handle; | |||
template<class F> friend class Local; | template<class F> friend class Local; | |||
template<class F> friend class FunctionCallbackInfo; | template<class F> friend class FunctionCallbackInfo; | |||
template<class F> friend class PropertyCallbackInfo; | template<class F> friend class PropertyCallbackInfo; | |||
friend class String; | friend class String; | |||
friend class Object; | friend class Object; | |||
friend class Context; | friend class Context; | |||
template<class F> friend class internal::CustomArguments; | template<class F> friend class internal::CustomArguments; | |||
friend class HandleScope; | friend class HandleScope; | |||
friend class EscapableHandleScope; | friend class EscapableHandleScope; | |||
template<class F1, class F2, class F3> friend class PersistentValueMap; | ||||
V8_INLINE static Local<T> New(Isolate* isolate, T* that); | V8_INLINE static Local<T> New(Isolate* isolate, T* that); | |||
}; | }; | |||
// Eternal handles are set-once handles that live for the life of the isola te. | // Eternal handles are set-once handles that live for the life of the isola te. | |||
template <class T> class Eternal { | template <class T> class Eternal { | |||
public: | public: | |||
V8_INLINE Eternal() : index_(kInitialValue) { } | V8_INLINE Eternal() : index_(kInitialValue) { } | |||
template<class S> | template<class S> | |||
V8_INLINE Eternal(Isolate* isolate, Local<S> handle) : index_(kInitialVal ue) { | V8_INLINE Eternal(Isolate* isolate, Local<S> handle) : index_(kInitialVal ue) { | |||
skipping to change at line 523 | skipping to change at line 525 | |||
template<typename P> | template<typename P> | |||
V8_INLINE void SetWeak( | V8_INLINE void SetWeak( | |||
P* parameter, | P* parameter, | |||
typename WeakCallbackData<T, P>::Callback callback); | typename WeakCallbackData<T, P>::Callback callback); | |||
template<typename S, typename P> | template<typename S, typename P> | |||
V8_INLINE void SetWeak( | V8_INLINE void SetWeak( | |||
P* parameter, | P* parameter, | |||
typename WeakCallbackData<S, P>::Callback callback); | typename WeakCallbackData<S, P>::Callback callback); | |||
V8_INLINE void ClearWeak(); | template<typename P> | |||
V8_INLINE P* ClearWeak(); | ||||
// TODO(dcarney): remove this. | ||||
V8_INLINE void ClearWeak() { ClearWeak<void>(); } | ||||
/** | /** | |||
* Marks the reference to this object independent. Garbage collector is f ree | * Marks the reference to this object independent. Garbage collector is f ree | |||
* to ignore any object groups containing this object. Weak callback for an | * to ignore any object groups containing this object. Weak callback for an | |||
* independent handle should not assume that it will be preceded by a glo bal | * independent handle should not assume that it will be preceded by a glo bal | |||
* GC prologue callback or followed by a global GC epilogue callback. | * GC prologue callback or followed by a global GC epilogue callback. | |||
*/ | */ | |||
V8_INLINE void MarkIndependent(); | V8_INLINE void MarkIndependent(); | |||
/** | /** | |||
skipping to change at line 572 | skipping to change at line 578 | |||
private: | private: | |||
friend class Isolate; | friend class Isolate; | |||
friend class Utils; | friend class Utils; | |||
template<class F> friend class Handle; | template<class F> friend class Handle; | |||
template<class F> friend class Local; | template<class F> friend class Local; | |||
template<class F1, class F2> friend class Persistent; | template<class F1, class F2> friend class Persistent; | |||
template<class F> friend class UniquePersistent; | template<class F> friend class UniquePersistent; | |||
template<class F> friend class PersistentBase; | template<class F> friend class PersistentBase; | |||
template<class F> friend class ReturnValue; | template<class F> friend class ReturnValue; | |||
template<class F1, class F2, class F3> friend class PersistentValueMap; | ||||
friend class Object; | friend class Object; | |||
explicit V8_INLINE PersistentBase(T* val) : val_(val) {} | explicit V8_INLINE PersistentBase(T* val) : val_(val) {} | |||
PersistentBase(PersistentBase& other); // NOLINT | PersistentBase(PersistentBase& other); // NOLINT | |||
void operator=(PersistentBase&); | void operator=(PersistentBase&); | |||
V8_INLINE static T* New(Isolate* isolate, T* that); | V8_INLINE static T* New(Isolate* isolate, T* that); | |||
T* val_; | T* val_; | |||
}; | }; | |||
skipping to change at line 736 | skipping to change at line 743 | |||
* Note: Persistent class hierarchy is subject to future changes. | * Note: Persistent class hierarchy is subject to future changes. | |||
*/ | */ | |||
template<class T> | template<class T> | |||
class UniquePersistent : public PersistentBase<T> { | class UniquePersistent : public PersistentBase<T> { | |||
struct RValue { | struct RValue { | |||
V8_INLINE explicit RValue(UniquePersistent* obj) : object(obj) {} | V8_INLINE explicit RValue(UniquePersistent* obj) : object(obj) {} | |||
UniquePersistent* object; | UniquePersistent* object; | |||
}; | }; | |||
public: | public: | |||
/** | /** | |||
* A UniquePersistent with no storage cell. | * A UniquePersistent with no storage cell. | |||
*/ | */ | |||
V8_INLINE UniquePersistent() : PersistentBase<T>(0) { } | V8_INLINE UniquePersistent() : PersistentBase<T>(0) { } | |||
/** | /** | |||
* Construct a UniquePersistent from a Handle. | * Construct a UniquePersistent from a Handle. | |||
* When the Handle is non-empty, a new storage cell is created | * When the Handle is non-empty, a new storage cell is created | |||
* pointing to the same object, and no flags are set. | * pointing to the same object, and no flags are set. | |||
*/ | */ | |||
template <class S> | template <class S> | |||
V8_INLINE UniquePersistent(Isolate* isolate, Handle<S> that) | V8_INLINE UniquePersistent(Isolate* isolate, Handle<S> that) | |||
skipping to change at line 774 | skipping to change at line 781 | |||
: PersistentBase<T>(rvalue.object->val_) { | : PersistentBase<T>(rvalue.object->val_) { | |||
rvalue.object->val_ = 0; | rvalue.object->val_ = 0; | |||
} | } | |||
V8_INLINE ~UniquePersistent() { this->Reset(); } | V8_INLINE ~UniquePersistent() { this->Reset(); } | |||
/** | /** | |||
* Move via assignment. | * Move via assignment. | |||
*/ | */ | |||
template<class S> | template<class S> | |||
V8_INLINE UniquePersistent& operator=(UniquePersistent<S> rhs) { | V8_INLINE UniquePersistent& operator=(UniquePersistent<S> rhs) { | |||
TYPE_CHECK(T, S); | TYPE_CHECK(T, S); | |||
this->Reset(); | ||||
this->val_ = rhs.val_; | this->val_ = rhs.val_; | |||
rhs.val_ = 0; | rhs.val_ = 0; | |||
return *this; | return *this; | |||
} | } | |||
/** | /** | |||
* Cast operator for moves. | * Cast operator for moves. | |||
*/ | */ | |||
V8_INLINE operator RValue() { return RValue(this); } | V8_INLINE operator RValue() { return RValue(this); } | |||
/** | /** | |||
* Pass allows returning uniques from functions, etc. | * Pass allows returning uniques from functions, etc. | |||
*/ | */ | |||
V8_INLINE UniquePersistent Pass() { return UniquePersistent(RValue(this)) ; } | V8_INLINE UniquePersistent Pass() { return UniquePersistent(RValue(this)) ; } | |||
private: | private: | |||
UniquePersistent(UniquePersistent&); | UniquePersistent(UniquePersistent&); | |||
void operator=(UniquePersistent&); | void operator=(UniquePersistent&); | |||
}; | }; | |||
typedef uintptr_t PersistentContainerValue; | ||||
static const uintptr_t kPersistentContainerNotFound = 0; | ||||
/** | ||||
* A map wrapper that allows using UniquePersistent as a mapped value. | ||||
* C++11 embedders don't need this class, as they can use UniquePersistent | ||||
* directly in std containers. | ||||
* | ||||
* The map relies on a backing map, whose type and accessors are described | ||||
* by the Traits class. The backing map will handle values of type | ||||
* PersistentContainerValue, with all conversion into and out of V8 | ||||
* handles being transparently handled by this class. | ||||
*/ | ||||
template<class K, class V, class Traits> | ||||
class PersistentValueMap { | ||||
public: | ||||
V8_INLINE explicit PersistentValueMap(Isolate* isolate) : isolate_(isolat | ||||
e) {} | ||||
V8_INLINE ~PersistentValueMap() { Clear(); } | ||||
V8_INLINE Isolate* GetIsolate() { return isolate_; } | ||||
/** | ||||
* Return size of the map. | ||||
*/ | ||||
V8_INLINE size_t Size() { return Traits::Size(&impl_); } | ||||
/** | ||||
* Get value stored in map. | ||||
*/ | ||||
V8_INLINE Local<V> Get(const K& key) { | ||||
return Local<V>::New(isolate_, FromVal(Traits::Get(&impl_, key))); | ||||
} | ||||
/** | ||||
* Check whether a value is contained in the map. | ||||
*/ | ||||
V8_INLINE bool Contains(const K& key) { | ||||
return Traits::Get(&impl_, key) != 0; | ||||
} | ||||
/** | ||||
* Get value stored in map and set it in returnValue. | ||||
* Return true if a value was found. | ||||
*/ | ||||
V8_INLINE bool SetReturnValue(const K& key, | ||||
ReturnValue<Value>& returnValue); | ||||
/** | ||||
* Call Isolate::SetReference with the given parent and the map value. | ||||
*/ | ||||
V8_INLINE void SetReference(const K& key, | ||||
const v8::Persistent<v8::Object>& parent) { | ||||
GetIsolate()->SetReference( | ||||
reinterpret_cast<internal::Object**>(parent.val_), | ||||
reinterpret_cast<internal::Object**>(FromVal(Traits::Get(&impl_, key) | ||||
))); | ||||
} | ||||
/** | ||||
* Put value into map. Depending on Traits::kIsWeak, the value will be he | ||||
ld | ||||
* by the map strongly or weakly. | ||||
* Returns old value as UniquePersistent. | ||||
*/ | ||||
UniquePersistent<V> Set(const K& key, Local<V> value) { | ||||
UniquePersistent<V> persistent(isolate_, value); | ||||
return SetUnique(key, &persistent); | ||||
} | ||||
/** | ||||
* Put value into map, like Set(const K&, Local<V>). | ||||
*/ | ||||
UniquePersistent<V> Set(const K& key, UniquePersistent<V> value) { | ||||
return SetUnique(key, &value); | ||||
} | ||||
/** | ||||
* Return value for key and remove it from the map. | ||||
*/ | ||||
V8_INLINE UniquePersistent<V> Remove(const K& key) { | ||||
return Release(Traits::Remove(&impl_, key)).Pass(); | ||||
} | ||||
/** | ||||
* Traverses the map repeatedly, | ||||
* in case side effects of disposal cause insertions. | ||||
**/ | ||||
void Clear(); | ||||
private: | ||||
PersistentValueMap(PersistentValueMap&); | ||||
void operator=(PersistentValueMap&); | ||||
/** | ||||
* Put the value into the map, and set the 'weak' callback when demanded | ||||
* by the Traits class. | ||||
*/ | ||||
UniquePersistent<V> SetUnique(const K& key, UniquePersistent<V>* persiste | ||||
nt) { | ||||
if (Traits::kIsWeak) { | ||||
Local<V> value(Local<V>::New(isolate_, *persistent)); | ||||
persistent->template SetWeak<typename Traits::WeakCallbackDataType>( | ||||
Traits::WeakCallbackParameter(&impl_, key, value), WeakCallback); | ||||
} | ||||
PersistentContainerValue old_value = | ||||
Traits::Set(&impl_, key, ClearAndLeak(persistent)); | ||||
return Release(old_value).Pass(); | ||||
} | ||||
static void WeakCallback( | ||||
const WeakCallbackData<V, typename Traits::WeakCallbackDataType>& dat | ||||
a); | ||||
V8_INLINE static V* FromVal(PersistentContainerValue v) { | ||||
return reinterpret_cast<V*>(v); | ||||
} | ||||
V8_INLINE static PersistentContainerValue ClearAndLeak( | ||||
UniquePersistent<V>* persistent) { | ||||
V* v = persistent->val_; | ||||
persistent->val_ = 0; | ||||
return reinterpret_cast<PersistentContainerValue>(v); | ||||
} | ||||
/** | ||||
* Return a container value as UniquePersistent and make sure the weak | ||||
* callback is properly disposed of. All remove functionality should go | ||||
* through this. | ||||
*/ | ||||
V8_INLINE static UniquePersistent<V> Release(PersistentContainerValue v) | ||||
{ | ||||
UniquePersistent<V> p; | ||||
p.val_ = FromVal(v); | ||||
if (Traits::kIsWeak && !p.IsEmpty()) { | ||||
Traits::DisposeCallbackData( | ||||
p.template ClearWeak<typename Traits::WeakCallbackDataType>()); | ||||
} | ||||
return p.Pass(); | ||||
} | ||||
Isolate* isolate_; | ||||
typename Traits::Impl impl_; | ||||
}; | ||||
/** | /** | |||
* A stack-allocated class that governs a number of local handles. | * A stack-allocated class that governs a number of local handles. | |||
* After a handle scope has been created, all local handles will be | * After a handle scope has been created, all local handles will be | |||
* allocated within that handle scope until either the handle scope is | * allocated within that handle scope until either the handle scope is | |||
* deleted or another handle scope is created. If there is already a | * deleted or another handle scope is created. If there is already a | |||
* handle scope and a new one is created, all allocations will take | * handle scope and a new one is created, all allocations will take | |||
* place in the new handle scope until it is deleted. After that, | * place in the new handle scope until it is deleted. After that, | |||
* new handles will again be allocated in the original handle scope. | * new handles will again be allocated in the original handle scope. | |||
* | * | |||
* After the handle scope of a local handle has been deleted the | * After the handle scope of a local handle has been deleted the | |||
skipping to change at line 2351 | skipping to change at line 2497 | |||
V8_INLINE void SetNull(); | V8_INLINE void SetNull(); | |||
V8_INLINE void SetUndefined(); | V8_INLINE void SetUndefined(); | |||
V8_INLINE void SetEmptyString(); | V8_INLINE void SetEmptyString(); | |||
// Convenience getter for Isolate | // Convenience getter for Isolate | |||
V8_INLINE Isolate* GetIsolate(); | V8_INLINE Isolate* GetIsolate(); | |||
private: | private: | |||
template<class F> friend class ReturnValue; | template<class F> friend class ReturnValue; | |||
template<class F> friend class FunctionCallbackInfo; | template<class F> friend class FunctionCallbackInfo; | |||
template<class F> friend class PropertyCallbackInfo; | template<class F> friend class PropertyCallbackInfo; | |||
template<class F, class G, class H> friend class PersistentValueMap; | ||||
V8_INLINE void SetInternal(internal::Object* value) { *value_ = value; } | ||||
V8_INLINE internal::Object* GetDefaultValue(); | V8_INLINE internal::Object* GetDefaultValue(); | |||
V8_INLINE explicit ReturnValue(internal::Object** slot); | V8_INLINE explicit ReturnValue(internal::Object** slot); | |||
internal::Object** value_; | internal::Object** value_; | |||
}; | }; | |||
/** | /** | |||
* The argument information given to function call callbacks. This | * The argument information given to function call callbacks. This | |||
* class provides access to information about the context of the call, | * class provides access to information about the context of the call, | |||
* including the receiver, the number and values of arguments, and | * including the receiver, the number and values of arguments, and | |||
* the holder of the function. | * the holder of the function. | |||
skipping to change at line 4137 | skipping to change at line 4285 | |||
* instead to influence the garbage collection schedule. | * instead to influence the garbage collection schedule. | |||
*/ | */ | |||
void RequestGarbageCollectionForTesting(GarbageCollectionType type); | void RequestGarbageCollectionForTesting(GarbageCollectionType type); | |||
/** | /** | |||
* Set the callback to invoke for logging event. | * Set the callback to invoke for logging event. | |||
*/ | */ | |||
void SetEventLogger(LogEventCallback that); | void SetEventLogger(LogEventCallback that); | |||
private: | private: | |||
template<class K, class V, class Traits> friend class PersistentValueMap; | ||||
Isolate(); | Isolate(); | |||
Isolate(const Isolate&); | Isolate(const Isolate&); | |||
~Isolate(); | ~Isolate(); | |||
Isolate& operator=(const Isolate&); | Isolate& operator=(const Isolate&); | |||
void* operator new(size_t size); | void* operator new(size_t size); | |||
void operator delete(void*, size_t); | void operator delete(void*, size_t); | |||
void SetObjectGroupId(internal::Object** object, UniqueId id); | void SetObjectGroupId(internal::Object** object, UniqueId id); | |||
void SetReferenceFromGroup(UniqueId id, internal::Object** object); | void SetReferenceFromGroup(UniqueId id, internal::Object** object); | |||
void SetReference(internal::Object** parent, internal::Object** child); | void SetReference(internal::Object** parent, internal::Object** child); | |||
skipping to change at line 4722 | skipping to change at line 4872 | |||
V8(); | V8(); | |||
static internal::Object** GlobalizeReference(internal::Isolate* isolate, | static internal::Object** GlobalizeReference(internal::Isolate* isolate, | |||
internal::Object** handle); | internal::Object** handle); | |||
static internal::Object** CopyPersistent(internal::Object** handle); | static internal::Object** CopyPersistent(internal::Object** handle); | |||
static void DisposeGlobal(internal::Object** global_handle); | static void DisposeGlobal(internal::Object** global_handle); | |||
typedef WeakCallbackData<Value, void>::Callback WeakCallback; | typedef WeakCallbackData<Value, void>::Callback WeakCallback; | |||
static void MakeWeak(internal::Object** global_handle, | static void MakeWeak(internal::Object** global_handle, | |||
void* data, | void* data, | |||
WeakCallback weak_callback); | WeakCallback weak_callback); | |||
static void ClearWeak(internal::Object** global_handle); | static void* ClearWeak(internal::Object** global_handle); | |||
static void Eternalize(Isolate* isolate, | static void Eternalize(Isolate* isolate, | |||
Value* handle, | Value* handle, | |||
int* index); | int* index); | |||
static Local<Value> GetEternal(Isolate* isolate, int index); | static Local<Value> GetEternal(Isolate* isolate, int index); | |||
template <class T> friend class Handle; | template <class T> friend class Handle; | |||
template <class T> friend class Local; | template <class T> friend class Local; | |||
template <class T> friend class Eternal; | template <class T> friend class Eternal; | |||
template <class T> friend class PersistentBase; | template <class T> friend class PersistentBase; | |||
template <class T, class M> friend class Persistent; | template <class T, class M> friend class Persistent; | |||
skipping to change at line 5608 | skipping to change at line 5758 | |||
template <class T> | template <class T> | |||
template <typename P> | template <typename P> | |||
void PersistentBase<T>::SetWeak( | void PersistentBase<T>::SetWeak( | |||
P* parameter, | P* parameter, | |||
typename WeakCallbackData<T, P>::Callback callback) { | typename WeakCallbackData<T, P>::Callback callback) { | |||
SetWeak<T, P>(parameter, callback); | SetWeak<T, P>(parameter, callback); | |||
} | } | |||
template <class T> | template <class T> | |||
void PersistentBase<T>::ClearWeak() { | template<typename P> | |||
V8::ClearWeak(reinterpret_cast<internal::Object**>(this->val_)); | P* PersistentBase<T>::ClearWeak() { | |||
return reinterpret_cast<P*>( | ||||
V8::ClearWeak(reinterpret_cast<internal::Object**>(this->val_))); | ||||
} | } | |||
template <class T> | template <class T> | |||
void PersistentBase<T>::MarkIndependent() { | void PersistentBase<T>::MarkIndependent() { | |||
typedef internal::Internals I; | typedef internal::Internals I; | |||
if (this->IsEmpty()) return; | if (this->IsEmpty()) return; | |||
I::UpdateNodeFlag(reinterpret_cast<internal::Object**>(this->val_), | I::UpdateNodeFlag(reinterpret_cast<internal::Object**>(this->val_), | |||
true, | true, | |||
I::kNodeIsIndependentShift); | I::kNodeIsIndependentShift); | |||
} | } | |||
skipping to change at line 5656 | skipping to change at line 5808 | |||
template <class T> | template <class T> | |||
uint16_t PersistentBase<T>::WrapperClassId() const { | uint16_t PersistentBase<T>::WrapperClassId() const { | |||
typedef internal::Internals I; | typedef internal::Internals I; | |||
if (this->IsEmpty()) return 0; | if (this->IsEmpty()) return 0; | |||
internal::Object** obj = reinterpret_cast<internal::Object**>(this->val_) ; | internal::Object** obj = reinterpret_cast<internal::Object**>(this->val_) ; | |||
uint8_t* addr = reinterpret_cast<uint8_t*>(obj) + I::kNodeClassIdOffset; | uint8_t* addr = reinterpret_cast<uint8_t*>(obj) + I::kNodeClassIdOffset; | |||
return *reinterpret_cast<uint16_t*>(addr); | return *reinterpret_cast<uint16_t*>(addr); | |||
} | } | |||
template <class K, class V, class Traits> | ||||
bool PersistentValueMap<K, V, Traits>::SetReturnValue(const K& key, | ||||
ReturnValue<Value>& returnValue) { | ||||
PersistentContainerValue value = Traits::Get(&impl_, key); | ||||
bool hasValue = value != 0; | ||||
if (hasValue) { | ||||
returnValue.SetInternal( | ||||
*reinterpret_cast<internal::Object**>(FromVal(value))); | ||||
} | ||||
return hasValue; | ||||
} | ||||
template <class K, class V, class Traits> | ||||
void PersistentValueMap<K, V, Traits>::Clear() { | ||||
typedef typename Traits::Iterator It; | ||||
HandleScope handle_scope(isolate_); | ||||
// TODO(dcarney): figure out if this swap and loop is necessary. | ||||
while (!Traits::Empty(&impl_)) { | ||||
typename Traits::Impl impl; | ||||
Traits::Swap(impl_, impl); | ||||
for (It i = Traits::Begin(&impl); i != Traits::End(&impl); ++i) { | ||||
Traits::Dispose(isolate_, Release(Traits::Value(i)).Pass(), &impl, | ||||
Traits::Key(i)); | ||||
} | ||||
} | ||||
} | ||||
template <class K, class V, class Traits> | ||||
void PersistentValueMap<K, V, Traits>::WeakCallback( | ||||
const WeakCallbackData<V, typename Traits::WeakCallbackDataType>& data) | ||||
{ | ||||
typename Traits::Impl* impl = Traits::ImplFromWeakCallbackData(data); | ||||
K key = Traits::KeyFromWeakCallbackData(data); | ||||
PersistentContainerValue value = Traits::Remove(impl, key); | ||||
Traits::Dispose(data.GetIsolate(), Release(value).Pass(), impl, key); | ||||
} | ||||
template<typename T> | template<typename T> | |||
ReturnValue<T>::ReturnValue(internal::Object** slot) : value_(slot) {} | ReturnValue<T>::ReturnValue(internal::Object** slot) : value_(slot) {} | |||
template<typename T> | template<typename T> | |||
template<typename S> | template<typename S> | |||
void ReturnValue<T>::Set(const Persistent<S>& handle) { | void ReturnValue<T>::Set(const Persistent<S>& handle) { | |||
TYPE_CHECK(T, S); | TYPE_CHECK(T, S); | |||
if (V8_UNLIKELY(handle.IsEmpty())) { | if (V8_UNLIKELY(handle.IsEmpty())) { | |||
*value_ = GetDefaultValue(); | *value_ = GetDefaultValue(); | |||
} else { | } else { | |||
End of changes. 12 change blocks. | ||||
5 lines changed or deleted | 200 lines changed or added | |||