mirror of https://github.com/lukechilds/node.git
Browse Source
Simplify and inline ObjectWrap::Wrap Inline and clean up ObjectWrap::Unwrap Move ObjectWrap into its own file. Remove handle from ObjectWrap constructor. add obj->Wrap(handle) Simplify Attach/Detach in ObjectWrap Remove ObjectWrap::InformV8ofAllocation. (Too messy/complex.)v0.7.4-release
Ryan
16 years ago
13 changed files with 134 additions and 202 deletions
@ -0,0 +1,80 @@ |
|||||
|
#ifndef object_wrap_h |
||||
|
#define object_wrap_h |
||||
|
|
||||
|
#include <v8.h> |
||||
|
#include <assert.h> |
||||
|
|
||||
|
namespace node { |
||||
|
|
||||
|
#define NODE_UNWRAP(type, value) static_cast<type*>(node::ObjectWrap::Unwrap(value)) |
||||
|
|
||||
|
class ObjectWrap { |
||||
|
public: |
||||
|
ObjectWrap ( ) { |
||||
|
weak_ = false; |
||||
|
attached_ = false; |
||||
|
} |
||||
|
|
||||
|
virtual ~ObjectWrap ( ) { |
||||
|
if (!handle_.IsEmpty()) { |
||||
|
handle_->SetInternalField(0, v8::Undefined()); |
||||
|
handle_.Dispose(); |
||||
|
handle_.Clear(); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
protected: |
||||
|
static inline void* Unwrap (v8::Handle<v8::Object> handle) |
||||
|
{ |
||||
|
assert(!handle.IsEmpty()); |
||||
|
assert(handle->InternalFieldCount() == 1); |
||||
|
return v8::Handle<v8::External>::Cast( |
||||
|
handle->GetInternalField(0))->Value(); |
||||
|
} |
||||
|
|
||||
|
inline void Wrap(v8::Handle<v8::Object> handle) |
||||
|
{ |
||||
|
assert(handle_.IsEmpty()); |
||||
|
assert(handle->InternalFieldCount() > 0); |
||||
|
handle_ = v8::Persistent<v8::Object>::New(handle); |
||||
|
handle_->SetInternalField(0, v8::External::New(this)); |
||||
|
handle_.MakeWeak(this, MakeWeak); |
||||
|
} |
||||
|
|
||||
|
/* Attach() marks the object as being attached to an event loop.
|
||||
|
* Attached objects will not be garbage collected, even if |
||||
|
* all references are lost. |
||||
|
*/ |
||||
|
void Attach() { |
||||
|
assert(!handle_.IsEmpty()); |
||||
|
attached_ = true; |
||||
|
} |
||||
|
|
||||
|
/* Detach() marks an object as detached from the event loop. This is its
|
||||
|
* default state. When an object with a "weak" reference changes from |
||||
|
* attached to detached state it will be freed. Be careful not to access |
||||
|
* the object after making this call as it might be gone! |
||||
|
* (A "weak reference" is v8 terminology for an object that only has a |
||||
|
* persistant handle.) |
||||
|
*/ |
||||
|
void Detach() { |
||||
|
assert(!handle_.IsEmpty()); |
||||
|
attached_ = false; |
||||
|
if (weak_) delete this; |
||||
|
} |
||||
|
|
||||
|
v8::Persistent<v8::Object> handle_; |
||||
|
|
||||
|
private: |
||||
|
static void MakeWeak (v8::Persistent<v8::Value> value, void *data) { |
||||
|
ObjectWrap *obj = static_cast<ObjectWrap*>(data); |
||||
|
assert(value == obj->handle_); |
||||
|
obj->weak_ = true; |
||||
|
if (!obj->attached_) delete obj; |
||||
|
} |
||||
|
bool attached_; |
||||
|
bool weak_; |
||||
|
}; |
||||
|
|
||||
|
} // namespace node
|
||||
|
#endif // object_wrap_h
|
Loading…
Reference in new issue