Skip to content

Commit c84a42d

Browse files
committed
Updates to make example run/pass
- Example now runs and returns the same value as the nan verion. - Object lifespan is not yet handled correctly as we don't pass in the required contructor. This will be the next step along with testing to validate things get cleaned up as expected
1 parent 24720ed commit c84a42d

File tree

2 files changed

+24
-54
lines changed

2 files changed

+24
-54
lines changed

6_object_wrap/abi/addon.js

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,6 @@
11
var addon = require('bindings')('addon');
2-
var util = require('util');
32

43
var obj = new addon.MyObject(10);
5-
6-
console.log(obj);
7-
84
console.log( obj.plusOne() ); // 11
95
console.log( obj.plusOne() ); // 12
106
console.log( obj.plusOne() ); // 13

6_object_wrap/abi/myobject.cc

Lines changed: 24 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -9,23 +9,7 @@ MyObject::~MyObject() {
99
}
1010

1111
void MyObject::Init(node::js::value env, node::js::value exports) {
12-
/*
13-
Nan::HandleScope scope;
14-
15-
// Prepare constructor template
16-
v8::Local<v8::FunctionTemplate> tpl = Nan::New<v8::FunctionTemplate>(New);
17-
tpl->SetClassName(Nan::New("MyObject").ToLocalChecked());
18-
tpl->InstanceTemplate()->SetInternalFieldCount(1);
19-
20-
// Prototype
21-
Nan::SetPrototypeMethod(tpl, "value", GetValue);
22-
Nan::SetPrototypeMethod(tpl, "plusOne", PlusOne);
23-
Nan::SetPrototypeMethod(tpl, "multiply", Multiply);
24-
25-
constructor.Reset(tpl->GetFunction());
26-
exports->Set(Nan::New("MyObject").ToLocalChecked(), tpl->GetFunction());
27-
*/
28-
node::js::value function = node::js::CreateFunction(env, New);
12+
node::js::value function = node::js::CreateConstructorForWrap(env, New);
2913
node::js::SetFunctionName(env, function, node::js::CreateString(env, "MyObject"));
3014
node::js::value prototype =
3115
node::js::GetProperty(env, function, node::js::PropertyName(env, "prototype"));
@@ -64,53 +48,43 @@ void MyObject::New(node::js::value env, node::js::FunctionCallbackInfo info) {
6448
*/
6549

6650
// assumes its a constructor call
67-
node::js::value args[1];
68-
node::js::GetCallbackArgs(info, args, 1);
69-
double value = 0;
70-
if (node::js::GetUndefined(env) != args[0]) {
71-
value = node::js::GetNumberFromValue(args[0]);
51+
if (node::js::IsContructCall(env, info)) {
52+
node::js::value args[1];
53+
node::js::GetCallbackArgs(info, args, 1);
54+
double value = 0;
55+
if (node::js::GetUndefined(env) != args[0]) {
56+
value = node::js::GetNumberFromValue(args[0]);
57+
}
58+
MyObject* obj = new MyObject(value);
59+
node::js::value jsobj = node::js::GetCallbackObject(env, info);
60+
node::js::Wrap(env, jsobj, (void*) obj, nullptr);
61+
node::js::SetReturnValue(env, info, jsobj);
62+
} else {
63+
node::js::value args[1];
64+
node::js::GetCallbackArgs(info, args, 1);
65+
const int argc = 1;
66+
node::js::value argv[argc] = { args[0] };
67+
node::js::value cons = node::js::GetPersistentValue(env, constructor);
68+
node::js::SetReturnValue(env, info, node::js::NewInstance(env, cons, argc, argv));
7269
}
73-
MyObject* obj = new MyObject(value);
74-
node::js::value jsobj = node::js::GetCallbackObject(env, info);
75-
node::js::Wrap(env, jsobj, (void*) obj);
76-
// node::js::SetReturnValue(env, info, jsobj);
7770
}
7871

7972
void MyObject::GetValue(node::js::value env, node::js::FunctionCallbackInfo info) {
80-
/*
81-
MyObject* obj = ObjectWrap::Unwrap<MyObject>(info.Holder());
82-
info.GetReturnValue().Set(Nan::New(obj->value_));
83-
*/
8473
MyObject* obj = (MyObject*) node::js::Unwrap(env, node::js::GetCallbackObject(env, info));
85-
node::js::SetReturnValue(env, info, node::js::CreateNumber(env, 0));
74+
node::js::SetReturnValue(env, info, node::js::CreateNumber(env, obj->value_));
8675
}
8776

8877
void MyObject::PlusOne(node::js::value env, node::js::FunctionCallbackInfo info) {
89-
/*
90-
MyObject* obj = ObjectWrap::Unwrap<MyObject>(info.Holder());
91-
obj->value_ += 1;
92-
info.GetReturnValue().Set(Nan::New(obj->value_));
93-
*/
9478
MyObject* obj = (MyObject*) node::js::Unwrap(env, node::js::GetCallbackObject(env, info));
95-
node::js::SetReturnValue(env, info, node::js::CreateNumber(env, 0));
79+
obj->value_ += 1;
80+
node::js::SetReturnValue(env, info, node::js::CreateNumber(env, obj->value_));
9681
}
9782

9883
void MyObject::Multiply(node::js::value env, node::js::FunctionCallbackInfo info) {
99-
/*
100-
MyObject* obj = ObjectWrap::Unwrap<MyObject>(info.Holder());
101-
double multiple = info[0]->IsUndefined() ? 1 : info[0]->NumberValue();
102-
103-
v8::Local<v8::Function> cons = Nan::New<v8::Function>(constructor);
104-
105-
const int argc = 1;
106-
v8::Local<v8::Value> argv[argc] = { Nan::New(obj->value_ * multiple) };
107-
108-
info.GetReturnValue().Set(cons->NewInstance(argc, argv));
109-
*/
11084
node::js::value args[1];
11185
node::js::GetCallbackArgs(info, args, 1);
11286

113-
double multiple = 0;
87+
double multiple = 1;
11488
if (node::js::GetUndefined(env) != args[0]) {
11589
multiple = node::js::GetNumberFromValue(args[0]);
11690
}
@@ -119,6 +93,6 @@ void MyObject::Multiply(node::js::value env, node::js::FunctionCallbackInfo info
11993

12094
node::js::value cons = node::js::GetPersistentValue(env, constructor);
12195
const int argc = 1;
122-
node::js::value argv[argc] = { node::js::CreateNumber(env, 1 * multiple) };
96+
node::js::value argv[argc] = { node::js::CreateNumber(env, obj->value_ * multiple) };
12397
node::js::SetReturnValue(env, info, node::js::NewInstance(env, cons, argc, argv));
12498
}

0 commit comments

Comments
 (0)