From 575738b7f59bfdfd2a3d371e464eb9a16e81710e Mon Sep 17 00:00:00 2001 From: Trevor Norris Date: Mon, 18 May 2015 16:39:53 -0600 Subject: [PATCH] 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 --- src/async-wrap-inl.h | 3 ++- src/base-object-inl.h | 7 ++++++- src/base-object.h | 4 +++- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/async-wrap-inl.h b/src/async-wrap-inl.h index bad634ddaf14b9..0518cd3b7ce002 100644 --- a/src/async-wrap-inl.h +++ b/src/async-wrap-inl.h @@ -17,7 +17,8 @@ inline AsyncWrap::AsyncWrap(Environment* env, v8::Handle object, ProviderType provider, AsyncWrap* parent) - : BaseObject(env, object), bits_(static_cast(provider) << 1) { + : BaseObject(env, object, provider), + bits_(static_cast(provider) << 1) { // Check user controlled flag to see if the init callback should run. if (!env->using_asyncwrap()) return; diff --git a/src/base-object-inl.h b/src/base-object-inl.h index db0daa1e82f559..775b07342edee9 100644 --- a/src/base-object-inl.h +++ b/src/base-object-inl.h @@ -10,10 +10,15 @@ namespace node { -inline BaseObject::BaseObject(Environment* env, v8::Local handle) +inline BaseObject::BaseObject(Environment* env, + v8::Local 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); } diff --git a/src/base-object.h b/src/base-object.h index 5a7b95827e8f11..90abee4333fcb1 100644 --- a/src/base-object.h +++ b/src/base-object.h @@ -9,7 +9,9 @@ class Environment; class BaseObject { public: - BaseObject(Environment* env, v8::Local handle); + BaseObject(Environment* env, + v8::Local handle, + const uint16_t class_id = 0); virtual ~BaseObject(); // Returns the wrapped object. Returns an empty handle when