From 1f17f88071cbfd6f02544d903c3b884f94dff052 Mon Sep 17 00:00:00 2001 From: Ben Noordhuis Date: Thu, 13 Mar 2014 18:53:48 +0100 Subject: [PATCH] src, test: fix up ObjectWrap, `make test-addons` V8 was upgraded from 3.22 to 3.24 in commit 1c7bf24. Upgrade source files in test/addons/ and automatically generated tests from doc/api/addons.markdown to the new V8 API. This coincidentally fixes a bug in src/node_object_wrap.h where it was still using the old V8 weak persistent handle interface, which is gone in 3.24. --- doc/api/addons.markdown | 22 +++++++++++----------- src/node_object_wrap.h | 15 +++++++++------ test/addons/async-hello-world/binding.cc | 9 ++++++--- test/addons/at-exit/binding.cc | 6 ++++-- 4 files changed, 30 insertions(+), 22 deletions(-) diff --git a/doc/api/addons.markdown b/doc/api/addons.markdown index b6f3fd45c0..e2915b6ceb 100644 --- a/doc/api/addons.markdown +++ b/doc/api/addons.markdown @@ -160,8 +160,8 @@ function calls and return a result. This is the main and only needed source return; } - Local num = Number::New(args[0]->NumberValue() + - args[1]->NumberValue()); + double value = args[0]->NumberValue() + args[1]->NumberValue(); + Local num = Number::New(isolate, value); args.GetReturnValue().Set(num); } @@ -197,7 +197,7 @@ there. Here's `addon.cc`: Local cb = Local::Cast(args[0]); const unsigned argc = 1; Local argv[argc] = { String::NewFromUtf8(isolate, "hello world") }; - cb->Call(Context::GetCurrent()->Global(), argc, argv); + cb->Call(isolate->GetCurrentContext()->Global(), argc, argv); } void Init(Handle exports, Handle module) { @@ -236,7 +236,7 @@ the string passed to `createObject()`: Isolate* isolate = Isolate::GetCurrent(); HandleScope scope(isolate); - Local obj = Object::New(); + Local obj = Object::New(isolate); obj->Set(String::NewFromUtf8(isolate, "msg"), args[0]->ToString()); args.GetReturnValue().Set(obj); @@ -278,7 +278,7 @@ wraps a C++ function: Isolate* isolate = Isolate::GetCurrent(); HandleScope scope(isolate); - Local tpl = FunctionTemplate::New(MyFunction); + Local tpl = FunctionTemplate::New(isolate, MyFunction); Local fn = tpl->GetFunction(); // omit this to make it anonymous @@ -366,7 +366,7 @@ prototype: Isolate* isolate = Isolate::GetCurrent(); // Prepare constructor template - Local tpl = FunctionTemplate::New(New); + Local tpl = FunctionTemplate::New(isolate, New); tpl->SetClassName(String::NewFromUtf8(isolate, "MyObject")); tpl->InstanceTemplate()->SetInternalFieldCount(1); @@ -404,7 +404,7 @@ prototype: MyObject* obj = ObjectWrap::Unwrap(args.This()); obj->value_ += 1; - args.GetReturnValue().Set(Number::New(obj->value_)); + args.GetReturnValue().Set(Number::New(isolate, obj->value_)); } Test it with: @@ -494,7 +494,7 @@ The implementation is similar to the above in `myobject.cc`: void MyObject::Init() { Isolate* isolate = Isolate::GetCurrent(); // Prepare constructor template - Local tpl = FunctionTemplate::New(New); + Local tpl = FunctionTemplate::New(isolate, New); tpl->SetClassName(String::NewFromUtf8(isolate, "MyObject")); tpl->InstanceTemplate()->SetInternalFieldCount(1); @@ -542,7 +542,7 @@ The implementation is similar to the above in `myobject.cc`: MyObject* obj = ObjectWrap::Unwrap(args.This()); obj->value_ += 1; - args.GetReturnValue().Set(Number::New(obj->value_)); + args.GetReturnValue().Set(Number::New(isolate, obj->value_)); } Test it with: @@ -591,7 +591,7 @@ In the following `addon.cc` we introduce a function `add()` that can take on two args[1]->ToObject()); double sum = obj1->value() + obj2->value(); - args.GetReturnValue().Set(Number::New(sum)); + args.GetReturnValue().Set(Number::New(isolate, sum)); } void InitAll(Handle exports) { @@ -650,7 +650,7 @@ The implementation of `myobject.cc` is similar as before: Isolate* isolate = Isolate::GetCurrent(); // Prepare constructor template - Local tpl = FunctionTemplate::New(New); + Local tpl = FunctionTemplate::New(isolate, New); tpl->SetClassName(String::NewFromUtf8(isolate, "MyObject")); tpl->InstanceTemplate()->SetInternalFieldCount(1); diff --git a/src/node_object_wrap.h b/src/node_object_wrap.h index 445a9e66c3..b604e67095 100644 --- a/src/node_object_wrap.h +++ b/src/node_object_wrap.h @@ -82,7 +82,7 @@ class ObjectWrap { inline void MakeWeak(void) { - persistent().MakeWeak(this, WeakCallback); + persistent().SetWeak(this, WeakCallback); persistent().MarkIndependent(); } @@ -116,13 +116,16 @@ class ObjectWrap { int refs_; // ro private: - static void WeakCallback(v8::Isolate* isolate, - v8::Persistent* pobj, - ObjectWrap* wrap) { + static void WeakCallback( + const v8::WeakCallbackData& data) { + v8::Isolate* isolate = data.GetIsolate(); v8::HandleScope scope(isolate); + ObjectWrap* wrap = data.GetParameter(); assert(wrap->refs_ == 0); - assert(*pobj == wrap->persistent()); - assert((*pobj).IsNearDeath()); + assert(wrap->handle_.IsNearDeath()); + assert( + data.GetValue() == v8::Local::New(isolate, wrap->handle_)); + wrap->handle_.Reset(); delete wrap; } diff --git a/test/addons/async-hello-world/binding.cc b/test/addons/async-hello-world/binding.cc index 02584c1abd..99f79431a0 100644 --- a/test/addons/async-hello-world/binding.cc +++ b/test/addons/async-hello-world/binding.cc @@ -24,15 +24,18 @@ void AfterAsync(uv_work_t* r) { HandleScope scope(isolate); async_req* req = reinterpret_cast(r->data); - Handle argv[2] = { Null(), Integer::New(req->output) }; + Handle argv[2] = { + Null(isolate), + Integer::New(isolate, req->output) + }; TryCatch try_catch; Local callback = Local::New(isolate, req->callback); - callback->Call(Context::GetCurrent()->Global(), 2, argv); + callback->Call(isolate->GetCurrentContext()->Global(), 2, argv); // cleanup - req->callback.Dispose(); + req->callback.Reset(); delete req; if (try_catch.HasCaught()) { diff --git a/test/addons/at-exit/binding.cc b/test/addons/at-exit/binding.cc index 3609e4d19c..156dbe4ff5 100644 --- a/test/addons/at-exit/binding.cc +++ b/test/addons/at-exit/binding.cc @@ -16,9 +16,11 @@ static int at_exit_cb1_called = 0; static int at_exit_cb2_called = 0; static void at_exit_cb1(void* arg) { - HandleScope scope(Isolate::GetCurrent()); + // FIXME(bnoordhuis) Isolate::GetCurrent() is on its way out. + Isolate* isolate = Isolate::GetCurrent(); + HandleScope handle_scope(isolate); assert(arg == 0); - Local obj = Object::New(); + Local obj = Object::New(isolate); assert(!obj.IsEmpty()); // assert VM is still alive assert(obj->IsObject()); at_exit_cb1_called++;