From 433a1a1bc36d55fbfd1709ffa5ae6d59d6b0a2af Mon Sep 17 00:00:00 2001 From: Gabriel Schulhof Date: Mon, 3 Feb 2020 13:10:10 -0800 Subject: [PATCH] Add ObjectWrap subclass in instance data --- test/addon_data.cc | 35 +++++++++++++++++++++++++++++++---- test/addon_data.js | 6 +++--- 2 files changed, 34 insertions(+), 7 deletions(-) diff --git a/test/addon_data.cc b/test/addon_data.cc index 449729350..f0d21952f 100644 --- a/test/addon_data.cc +++ b/test/addon_data.cc @@ -4,8 +4,36 @@ class Addon { public: - Addon() {} + class VerboseIndicator : public Napi::ObjectWrap { + public: + VerboseIndicator(const Napi::CallbackInfo& info): + Napi::ObjectWrap(info) { + info.This().As()["verbose"] = + Napi::Boolean::New(info.Env(), + info.Env().GetInstanceData()->verbose); + } + + Napi::Value Getter(const Napi::CallbackInfo& info) { + return Napi::Boolean::New(info.Env(), + info.Env().GetInstanceData()->verbose); + } + + void Setter(const Napi::CallbackInfo& info, const Napi::Value& val) { + info.Env().GetInstanceData()->verbose = val.As(); + } + + static Napi::FunctionReference Init(Napi::Env env) { + return Napi::Persistent(DefineClass(env, "VerboseIndicator", { + InstanceAccessor< + &VerboseIndicator::Getter, + &VerboseIndicator::Setter>("verbose") + })); + } + }; + + Addon(Napi::Env env): VerboseIndicator(VerboseIndicator::Init(env)) {} bool verbose = false; + Napi::FunctionReference VerboseIndicator; ~Addon() { if (verbose) { fprintf(stderr, "addon_data: Addon::~Addon\n"); @@ -14,8 +42,7 @@ class Addon { }; static Napi::Value Getter(const Napi::CallbackInfo& info) { - return Napi::Boolean::New(info.Env(), - info.Env().GetInstanceData()->verbose); + return info.Env().GetInstanceData()->VerboseIndicator.New({}); } static void Setter(const Napi::CallbackInfo& info) { @@ -23,7 +50,7 @@ static void Setter(const Napi::CallbackInfo& info) { } Napi::Object InitAddonData(Napi::Env env) { - env.SetInstanceData(new Addon()); + env.SetInstanceData(new Addon(env)); Napi::Object result = Napi::Object::New(env); result.DefineProperties({ diff --git a/test/addon_data.js b/test/addon_data.js index 999242131..24edcbb03 100644 --- a/test/addon_data.js +++ b/test/addon_data.js @@ -12,11 +12,11 @@ function test(bindingName) { const binding = require(bindingName); // Make sure it is possible to get/set instance data. - assert.strictEqual(binding.addon_data.verbose, false); + assert.strictEqual(binding.addon_data.verbose.verbose, false); binding.addon_data.verbose = true; - assert.strictEqual(binding.addon_data.verbose, true); + assert.strictEqual(binding.addon_data.verbose.verbose, true); binding.addon_data.verbose = false; - assert.strictEqual(binding.addon_data.verbose, false); + assert.strictEqual(binding.addon_data.verbose.verbose, false); // Make sure the instance data finalizer is called at process exit. const child = spawn(process.execPath, [