diff options
Diffstat (limited to 'test/addons/06_factory_of_wrapped_objects')
5 files changed, 161 insertions, 0 deletions
diff --git a/test/addons/06_factory_of_wrapped_objects/binding.cc b/test/addons/06_factory_of_wrapped_objects/binding.cc new file mode 100644 index 0000000000..71bf45ca6e --- /dev/null +++ b/test/addons/06_factory_of_wrapped_objects/binding.cc @@ -0,0 +1,27 @@ +// Auto-generated by `node tools/doc/addon-verify.js` +// binding.cc +#include <node.h> +#include "myobject.h" + +namespace demo { + +using v8::FunctionCallbackInfo; +using v8::Isolate; +using v8::Local; +using v8::Object; +using v8::String; +using v8::Value; + +void CreateObject(const FunctionCallbackInfo<Value>& args) { + MyObject::NewInstance(args); +} + +void InitAll(Local<Object> exports, Local<Object> module) { + MyObject::Init(exports->GetIsolate()); + + NODE_SET_METHOD(module, "exports", CreateObject); +} + +NODE_MODULE(NODE_GYP_MODULE_NAME, InitAll) + +} // namespace demo diff --git a/test/addons/06_factory_of_wrapped_objects/binding.gyp b/test/addons/06_factory_of_wrapped_objects/binding.gyp new file mode 100644 index 0000000000..5d967d0948 --- /dev/null +++ b/test/addons/06_factory_of_wrapped_objects/binding.gyp @@ -0,0 +1,2 @@ +# Auto-generated by `node tools/doc/addon-verify.js` +{"targets":[{"target_name":"binding","defines":["V8_DEPRECATION_WARNINGS=1"],"sources":["binding.cc","myobject.h","myobject.cc","test.js"]}]}
\ No newline at end of file diff --git a/test/addons/06_factory_of_wrapped_objects/myobject.cc b/test/addons/06_factory_of_wrapped_objects/myobject.cc new file mode 100644 index 0000000000..c1286f42a3 --- /dev/null +++ b/test/addons/06_factory_of_wrapped_objects/myobject.cc @@ -0,0 +1,83 @@ +// Auto-generated by `node tools/doc/addon-verify.js` +// myobject.cc +#include <node.h> +#include "myobject.h" + +namespace demo { + +using v8::Context; +using v8::Function; +using v8::FunctionCallbackInfo; +using v8::FunctionTemplate; +using v8::Isolate; +using v8::Local; +using v8::Number; +using v8::Object; +using v8::Persistent; +using v8::String; +using v8::Value; + +Persistent<Function> MyObject::constructor; + +MyObject::MyObject(double value) : value_(value) { +} + +MyObject::~MyObject() { +} + +void MyObject::Init(Isolate* isolate) { + // Prepare constructor template + Local<FunctionTemplate> tpl = FunctionTemplate::New(isolate, New); + tpl->SetClassName(String::NewFromUtf8(isolate, "MyObject")); + tpl->InstanceTemplate()->SetInternalFieldCount(1); + + // Prototype + NODE_SET_PROTOTYPE_METHOD(tpl, "plusOne", PlusOne); + + constructor.Reset(isolate, tpl->GetFunction()); +} + +void MyObject::New(const FunctionCallbackInfo<Value>& args) { + Isolate* isolate = args.GetIsolate(); + + if (args.IsConstructCall()) { + // Invoked as constructor: `new MyObject(...)` + double value = args[0]->IsUndefined() ? 0 : args[0]->NumberValue(); + MyObject* obj = new MyObject(value); + obj->Wrap(args.This()); + args.GetReturnValue().Set(args.This()); + } else { + // Invoked as plain function `MyObject(...)`, turn into construct call. + const int argc = 1; + Local<Value> argv[argc] = { args[0] }; + Local<Function> cons = Local<Function>::New(isolate, constructor); + Local<Context> context = isolate->GetCurrentContext(); + Local<Object> instance = + cons->NewInstance(context, argc, argv).ToLocalChecked(); + args.GetReturnValue().Set(instance); + } +} + +void MyObject::NewInstance(const FunctionCallbackInfo<Value>& args) { + Isolate* isolate = args.GetIsolate(); + + const unsigned argc = 1; + Local<Value> argv[argc] = { args[0] }; + Local<Function> cons = Local<Function>::New(isolate, constructor); + Local<Context> context = isolate->GetCurrentContext(); + Local<Object> instance = + cons->NewInstance(context, argc, argv).ToLocalChecked(); + + args.GetReturnValue().Set(instance); +} + +void MyObject::PlusOne(const FunctionCallbackInfo<Value>& args) { + Isolate* isolate = args.GetIsolate(); + + MyObject* obj = ObjectWrap::Unwrap<MyObject>(args.Holder()); + obj->value_ += 1; + + args.GetReturnValue().Set(Number::New(isolate, obj->value_)); +} + +} // namespace demo diff --git a/test/addons/06_factory_of_wrapped_objects/myobject.h b/test/addons/06_factory_of_wrapped_objects/myobject.h new file mode 100644 index 0000000000..323c7a8739 --- /dev/null +++ b/test/addons/06_factory_of_wrapped_objects/myobject.h @@ -0,0 +1,28 @@ +// Auto-generated by `node tools/doc/addon-verify.js` +// myobject.h +#ifndef MYOBJECT_H // NOLINT(build/header_guard) +#define MYOBJECT_H // NOLINT(build/header_guard) + +#include <node.h> +#include <node_object_wrap.h> + +namespace demo { + +class MyObject : public node::ObjectWrap { + public: + static void Init(v8::Isolate* isolate); + static void NewInstance(const v8::FunctionCallbackInfo<v8::Value>& args); + + private: + explicit MyObject(double value = 0); + ~MyObject(); + + static void New(const v8::FunctionCallbackInfo<v8::Value>& args); + static void PlusOne(const v8::FunctionCallbackInfo<v8::Value>& args); + static v8::Persistent<v8::Function> constructor; + double value_; +}; + +} // namespace demo + +#endif // NOLINT(build/header_guard) diff --git a/test/addons/06_factory_of_wrapped_objects/test.js b/test/addons/06_factory_of_wrapped_objects/test.js new file mode 100644 index 0000000000..1d02c0e1a2 --- /dev/null +++ b/test/addons/06_factory_of_wrapped_objects/test.js @@ -0,0 +1,21 @@ +// Auto-generated by `node tools/doc/addon-verify.js` +'use strict'; +const common = require('../../common'); +// test.js +const createObject = require(`./build/${common.buildType}/binding`); + +const obj = createObject(10); +console.log(obj.plusOne()); +// Prints: 11 +console.log(obj.plusOne()); +// Prints: 12 +console.log(obj.plusOne()); +// Prints: 13 + +const obj2 = createObject(20); +console.log(obj2.plusOne()); +// Prints: 21 +console.log(obj2.plusOne()); +// Prints: 22 +console.log(obj2.plusOne()); +// Prints: 23 |