Browse Source

core: set PROVIDER type as Persistent class id

Pass along the PROVIDER type, that is already passed to AsyncWrap, along
to BaseObject to set the handle_'s class id. This will allow all
Persistents to be transversed and uniquely identified by what type they
are using APIs such as v8::PersistentHandleVisitor.

PR-URL: https://github.com/nodejs/io.js/pull/1730
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
v2.3.1-release
Trevor Norris 10 years ago
parent
commit
3c44100558
  1. 3
      src/async-wrap-inl.h
  2. 7
      src/base-object-inl.h
  3. 4
      src/base-object.h

3
src/async-wrap-inl.h

@ -17,7 +17,8 @@ inline AsyncWrap::AsyncWrap(Environment* env,
v8::Handle<v8::Object> object,
ProviderType provider,
AsyncWrap* parent)
: BaseObject(env, object), bits_(static_cast<uint32_t>(provider) << 1) {
: BaseObject(env, object, provider),
bits_(static_cast<uint32_t>(provider) << 1) {
// Check user controlled flag to see if the init callback should run.
if (!env->using_asyncwrap())
return;

7
src/base-object-inl.h

@ -10,10 +10,15 @@
namespace node {
inline BaseObject::BaseObject(Environment* env, v8::Local<v8::Object> handle)
inline BaseObject::BaseObject(Environment* env,
v8::Local<v8::Object> handle,
const uint16_t class_id)
: handle_(env->isolate(), handle),
env_(env) {
CHECK_EQ(false, handle.IsEmpty());
// Shift value 8 bits over to try avoiding conflict with anything else.
if (class_id != 0)
handle_.SetWrapperClassId(class_id << 8);
}

4
src/base-object.h

@ -9,7 +9,9 @@ class Environment;
class BaseObject {
public:
BaseObject(Environment* env, v8::Local<v8::Object> handle);
BaseObject(Environment* env,
v8::Local<v8::Object> handle,
const uint16_t class_id = 0);
virtual ~BaseObject();
// Returns the wrapped object. Returns an empty handle when

Loading…
Cancel
Save