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

This html diff was produced by rfcdiff 1.41. The latest version is available from http://tools.ietf.org/tools/rfcdiff/