Skip to content
This repository was archived by the owner on Oct 15, 2020. It is now read-only.

Commit c6b7fca

Browse files
authored
napi: use new.target jsrt api (#451)
Now that Jsrt has added a way to fetch the new.target argument from a function callback invocation, change the N-API layer to fetch this value.
1 parent d4795cd commit c6b7fca

File tree

1 file changed

+23
-36
lines changed

1 file changed

+23
-36
lines changed

Diff for: src/node_api_jsrt.cc

+23-36
Original file line numberDiff line numberDiff line change
@@ -225,11 +225,11 @@ class ExternalCallback {
225225
: _env(env), _cb(cb), _data(data) {
226226
}
227227

228-
// JsNativeFunction
228+
// JsEnhancedNativeFunction
229229
static JsValueRef CALLBACK Callback(JsValueRef callee,
230-
bool isConstructCall,
231230
JsValueRef *arguments,
232231
uint16_t argumentCount,
232+
JsNativeFunctionInfo *info,
233233
void *callbackState) {
234234
jsrtimpl::ExternalCallback* externalCallback =
235235
reinterpret_cast<jsrtimpl::ExternalCallback*>(callbackState);
@@ -238,15 +238,8 @@ class ExternalCallback {
238238
napi_clear_last_error();
239239

240240
CallbackInfo cbInfo;
241-
cbInfo.thisArg = reinterpret_cast<napi_value>(arguments[0]);
242-
243-
// TODO(digitalinfinity): This is incorrect as per spec, but
244-
// implementing this behavior for now to at least handle the case
245-
// where folks check newTarget != null to determine they're in a
246-
// constructor.
247-
// JSRT will need to implement an API to get new.target for this
248-
// to work correctly
249-
cbInfo.newTarget = (isConstructCall ? cbInfo.thisArg : nullptr);
241+
cbInfo.thisArg = reinterpret_cast<napi_value>(info->thisArg);
242+
cbInfo.newTarget = reinterpret_cast<napi_value>(info->newTargetArg);
250243
cbInfo.argc = argumentCount - 1;
251244
cbInfo.argv = reinterpret_cast<napi_value*>(arguments + 1);
252245
cbInfo.data = externalCallback->_data;
@@ -688,24 +681,20 @@ napi_status napi_create_function(napi_env env,
688681
}
689682

690683
JsValueRef function;
684+
JsValueRef name = JS_INVALID_REFERENCE;
691685
if (utf8name != nullptr) {
692-
JsValueRef name;
693686
CHECK_JSRT(JsCreateString(
694687
utf8name,
695688
length == -1 ? strlen(utf8name) : length,
696689
&name));
697-
CHECK_JSRT(JsCreateNamedFunction(
698-
name,
699-
jsrtimpl::ExternalCallback::Callback,
700-
externalCallback,
701-
&function));
702-
} else {
703-
CHECK_JSRT(JsCreateFunction(
704-
jsrtimpl::ExternalCallback::Callback,
705-
externalCallback,
706-
&function));
707690
}
708691

692+
CHECK_JSRT(JsCreateEnhancedFunction(
693+
jsrtimpl::ExternalCallback::Callback,
694+
name,
695+
externalCallback,
696+
&function));
697+
709698
CHECK_JSRT(JsSetObjectBeforeCollectCallback(
710699
function, externalCallback, jsrtimpl::ExternalCallback::Finalize));
711700

@@ -730,19 +719,17 @@ static napi_status napi_create_property_function(napi_env env,
730719
CHECK_NAPI(napi_typeof(env, property_name, &nameType));
731720

732721
JsValueRef function;
722+
JsValueRef name = JS_INVALID_REFERENCE;
733723
if (nameType == napi_string) {
734-
CHECK_JSRT(JsCreateNamedFunction(
735-
property_name,
736-
jsrtimpl::ExternalCallback::Callback,
737-
externalCallback,
738-
&function));
739-
} else {
740-
CHECK_JSRT(JsCreateFunction(
741-
jsrtimpl::ExternalCallback::Callback,
742-
externalCallback,
743-
&function));
724+
name = property_name;
744725
}
745726

727+
CHECK_JSRT(JsCreateEnhancedFunction(
728+
jsrtimpl::ExternalCallback::Callback,
729+
name,
730+
externalCallback,
731+
&function));
732+
746733
CHECK_JSRT(JsSetObjectBeforeCollectCallback(
747734
function, externalCallback, jsrtimpl::ExternalCallback::Finalize));
748735

@@ -770,10 +757,10 @@ napi_status napi_define_class(napi_env env,
770757
}
771758

772759
JsValueRef constructor;
773-
CHECK_JSRT(JsCreateNamedFunction(namestring,
774-
jsrtimpl::ExternalCallback::Callback,
775-
externalCallback,
776-
&constructor));
760+
CHECK_JSRT(JsCreateEnhancedFunction(jsrtimpl::ExternalCallback::Callback,
761+
namestring,
762+
externalCallback,
763+
&constructor));
777764

778765
CHECK_JSRT(JsSetObjectBeforeCollectCallback(
779766
constructor, externalCallback, jsrtimpl::ExternalCallback::Finalize));

0 commit comments

Comments
 (0)