[node] switch to NodeRequest member fn callback
For (hopefully) better performance than creating a new v8::Context to wrap each callback while still avoiding leaking memory with v8::FunctionTemplate. Adds a JavaScript shim in front of module.exports.Map to wrap the req.respond API internally and preserve the public callback-passing API, while still exporting the correct prototype.
This commit is contained in:
committed by
Mike Morris
parent
d6f667a5e7
commit
edec56e6c5
@@ -32,6 +32,8 @@ NAN_MODULE_INIT(NodeRequest::Init) {
|
||||
tpl->InstanceTemplate()->SetInternalFieldCount(1);
|
||||
tpl->SetClassName(Nan::New("Request").ToLocalChecked());
|
||||
|
||||
Nan::SetPrototypeMethod(tpl, "respond", HandleCallback);
|
||||
|
||||
constructor.Reset(tpl->GetFunction());
|
||||
|
||||
// TODO: Remove this from the public JavaScript API
|
||||
@@ -49,8 +51,9 @@ void NodeRequest::New(const Nan::FunctionCallbackInfo<v8::Value>& info) {
|
||||
}
|
||||
|
||||
void NodeRequest::HandleCallback(const Nan::FunctionCallbackInfo<v8::Value>& info) {
|
||||
auto request = Nan::ObjectWrap::Unwrap<NodeRequest>(info.Holder());
|
||||
|
||||
// Move out of the object so callback() can only be fired once.
|
||||
auto request = Nan::ObjectWrap::Unwrap<NodeRequest>(info.Data().As<v8::Object>());
|
||||
auto callback = std::move(request->callback);
|
||||
if (!callback) {
|
||||
return info.GetReturnValue().SetUndefined();
|
||||
@@ -122,14 +125,9 @@ void NodeRequest::HandleCallback(const Nan::FunctionCallbackInfo<v8::Value>& inf
|
||||
}
|
||||
|
||||
void NodeRequest::Execute() {
|
||||
// Enter a new v8::Context to avoid leaking v8::FunctionTemplate
|
||||
// from Nan::New<v8::Function>
|
||||
v8::Local<v8::Context> context = v8::Context::New(v8::Isolate::GetCurrent());
|
||||
v8::Context::Scope scope(context);
|
||||
v8::Local<v8::Value> argv[] = { handle() };
|
||||
|
||||
v8::Local<v8::Value> argv[] = { handle(), Nan::New<v8::Function>(NodeRequest::HandleCallback, handle()) };
|
||||
|
||||
Nan::MakeCallback(Nan::To<v8::Object>(target->handle()->GetInternalField(1)).ToLocalChecked(), "request", 2, argv);
|
||||
Nan::MakeCallback(Nan::To<v8::Object>(target->handle()->GetInternalField(1)).ToLocalChecked(), "request", 1, argv);
|
||||
}
|
||||
|
||||
NodeRequest::NodeAsyncRequest::NodeAsyncRequest(NodeRequest* request_) : request(request_) {
|
||||
|
||||
Reference in New Issue
Block a user