diff options
Diffstat (limited to 'test/addons/07_passing_wrapped_objects_around')
5 files changed, 154 insertions, 0 deletions
diff --git a/test/addons/07_passing_wrapped_objects_around/binding.cc b/test/addons/07_passing_wrapped_objects_around/binding.cc new file mode 100644 index 0000000000..36ba3a710e --- /dev/null +++ b/test/addons/07_passing_wrapped_objects_around/binding.cc @@ -0,0 +1,42 @@ +// Auto-generated by `node tools/doc/addon-verify.js` +// binding.cc +#include <node.h> +#include <node_object_wrap.h> +#include "myobject.h" + +namespace demo { + +using v8::FunctionCallbackInfo; +using v8::Isolate; +using v8::Local; +using v8::Number; +using v8::Object; +using v8::String; +using v8::Value; + +void CreateObject(const FunctionCallbackInfo<Value>& args) { + MyObject::NewInstance(args); +} + +void Add(const FunctionCallbackInfo<Value>& args) { + Isolate* isolate = args.GetIsolate(); + + MyObject* obj1 = node::ObjectWrap::Unwrap<MyObject>( + args[0]->ToObject()); + MyObject* obj2 = node::ObjectWrap::Unwrap<MyObject>( + args[1]->ToObject()); + + double sum = obj1->value() + obj2->value(); + args.GetReturnValue().Set(Number::New(isolate, sum)); +} + +void InitAll(Local<Object> exports) { + MyObject::Init(exports->GetIsolate()); + + NODE_SET_METHOD(exports, "createObject", CreateObject); + NODE_SET_METHOD(exports, "add", Add); +} + +NODE_MODULE(NODE_GYP_MODULE_NAME, InitAll) + +} // namespace demo diff --git a/test/addons/07_passing_wrapped_objects_around/binding.gyp b/test/addons/07_passing_wrapped_objects_around/binding.gyp new file mode 100644 index 0000000000..5d967d0948 --- /dev/null +++ b/test/addons/07_passing_wrapped_objects_around/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/07_passing_wrapped_objects_around/myobject.cc b/test/addons/07_passing_wrapped_objects_around/myobject.cc new file mode 100644 index 0000000000..3dd5bb6976 --- /dev/null +++ b/test/addons/07_passing_wrapped_objects_around/myobject.cc @@ -0,0 +1,70 @@ +// 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::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); + + 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<Context> context = isolate->GetCurrentContext(); + Local<Function> cons = Local<Function>::New(isolate, constructor); + 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); +} + +} // namespace demo diff --git a/test/addons/07_passing_wrapped_objects_around/myobject.h b/test/addons/07_passing_wrapped_objects_around/myobject.h new file mode 100644 index 0000000000..5d430a2081 --- /dev/null +++ b/test/addons/07_passing_wrapped_objects_around/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); + inline double value() const { return value_; } + + private: + explicit MyObject(double value = 0); + ~MyObject(); + + static void New(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/07_passing_wrapped_objects_around/test.js b/test/addons/07_passing_wrapped_objects_around/test.js new file mode 100644 index 0000000000..0175835c7c --- /dev/null +++ b/test/addons/07_passing_wrapped_objects_around/test.js @@ -0,0 +1,12 @@ +// Auto-generated by `node tools/doc/addon-verify.js` +'use strict'; +const common = require('../../common'); +// test.js +const binding = require(`./build/${common.buildType}/binding`); + +const obj1 = binding.createObject(10); +const obj2 = binding.createObject(20); +const result = binding.add(obj1, obj2); + +console.log(result); +// Prints: 30 |