Skip to content

Commit fe87a59

Browse files
Sampson GaoMylesBorins
Sampson Gao
authored andcommittedApr 16, 2018
n-api: napi_is_construct_call->napi_get_new_target
Remove napi_is_construct_call and introduce napi_get_new_target. Backport-PR-URL: #19447 PR-URL: #14698 Reviewed-By: Jason Ginchereau <jasongin@microsoft.com> Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: Michael Dawson <michael_dawson@ca.ibm.com> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Kyle Farnung <kfarnung@microsoft.com>
1 parent 5eadd62 commit fe87a59

File tree

4 files changed

+27
-24
lines changed

4 files changed

+27
-24
lines changed
 

‎doc/api/n-api.md

+8-9
Original file line numberDiff line numberDiff line change
@@ -2928,25 +2928,24 @@ Returns `napi_ok` if the API succeeded.
29282928
This method is used within a callback function to retrieve details about the
29292929
call like the arguments and the `this` pointer from a given callback info.
29302930

2931-
### *napi_is_construct_call*
2931+
### *napi_get_new_target*
29322932
<!-- YAML
2933-
added: v8.0.0
2933+
added: REPLACEME
29342934
-->
29352935
```C
2936-
napi_status napi_is_construct_call(napi_env env,
2937-
napi_callback_info cbinfo,
2938-
bool* result)
2936+
napi_status napi_get_new_target(napi_env env,
2937+
napi_callback_info cbinfo,
2938+
napi_value* result)
29392939
```
29402940

29412941
- `[in] env`: The environment that the API is invoked under.
29422942
- `[in] cbinfo`: The callback info passed into the callback function.
2943-
- `[out] result`: Whether the native function is being invoked as
2944-
a constructor call.
2943+
- `[out] result`: The `new.target` of the constructor call.
29452944

29462945
Returns `napi_ok` if the API succeeded.
29472946

2948-
This API checks if the the current callback was due to a
2949-
consructor call.
2947+
This API returns the `new.target` of the constructor call. If the current
2948+
callback is not a constructor call, the result is `nullptr`.
29502949

29512950
### *napi_new_instance*
29522951
<!-- YAML

‎src/node_api.cc

+13-10
Original file line numberDiff line numberDiff line change
@@ -451,7 +451,7 @@ class CallbackWrapper {
451451
CallbackWrapper(napi_value this_arg, size_t args_length, void* data)
452452
: _this(this_arg), _args_length(args_length), _data(data) {}
453453

454-
virtual bool IsConstructCall() = 0;
454+
virtual napi_value NewTarget() = 0;
455455
virtual void Args(napi_value* buffer, size_t bufferlength) = 0;
456456
virtual void SetReturnValue(napi_value value) = 0;
457457

@@ -480,8 +480,7 @@ class CallbackWrapperBase : public CallbackWrapper {
480480
->Value();
481481
}
482482

483-
/*virtual*/
484-
bool IsConstructCall() override { return false; }
483+
napi_value NewTarget() override { return nullptr; }
485484

486485
protected:
487486
void InvokeCallback() {
@@ -529,8 +528,13 @@ class FunctionCallbackWrapper
529528
const v8::FunctionCallbackInfo<v8::Value>& cbinfo)
530529
: CallbackWrapperBase(cbinfo, cbinfo.Length()) {}
531530

532-
/*virtual*/
533-
bool IsConstructCall() override { return _cbinfo.IsConstructCall(); }
531+
napi_value NewTarget() override {
532+
if (_cbinfo.IsConstructCall()) {
533+
return v8impl::JsValueFromV8LocalValue(_cbinfo.NewTarget());
534+
} else {
535+
return nullptr;
536+
}
537+
}
534538

535539
/*virtual*/
536540
void Args(napi_value* buffer, size_t buffer_length) override {
@@ -1883,18 +1887,17 @@ napi_status napi_get_cb_info(
18831887
return napi_clear_last_error(env);
18841888
}
18851889

1886-
napi_status napi_is_construct_call(napi_env env,
1887-
napi_callback_info cbinfo,
1888-
bool* result) {
1889-
// Omit NAPI_PREAMBLE and GET_RETURN_STATUS because no V8 APIs are called.
1890+
napi_status napi_get_new_target(napi_env env,
1891+
napi_callback_info cbinfo,
1892+
napi_value* result) {
18901893
CHECK_ENV(env);
18911894
CHECK_ARG(env, cbinfo);
18921895
CHECK_ARG(env, result);
18931896

18941897
v8impl::CallbackWrapper* info =
18951898
reinterpret_cast<v8impl::CallbackWrapper*>(cbinfo);
18961899

1897-
*result = info->IsConstructCall();
1900+
*result = info->NewTarget();
18981901
return napi_clear_last_error(env);
18991902
}
19001903

‎src/node_api.h

+3-3
Original file line numberDiff line numberDiff line change
@@ -330,9 +330,9 @@ NAPI_EXTERN napi_status napi_get_cb_info(
330330
napi_value* this_arg, // [out] Receives the JS 'this' arg for the call
331331
void** data); // [out] Receives the data pointer for the callback.
332332

333-
NAPI_EXTERN napi_status napi_is_construct_call(napi_env env,
334-
napi_callback_info cbinfo,
335-
bool* result);
333+
NAPI_EXTERN napi_status napi_get_new_target(napi_env env,
334+
napi_callback_info cbinfo,
335+
napi_value* result);
336336
NAPI_EXTERN napi_status
337337
napi_define_class(napi_env env,
338338
const char* utf8name,

‎test/addons-napi/6_object_wrap/myobject.cc

+3-2
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,9 @@ void MyObject::Init(napi_env env, napi_value exports) {
3232
}
3333

3434
napi_value MyObject::New(napi_env env, napi_callback_info info) {
35-
bool is_constructor;
36-
NAPI_CALL(env, napi_is_construct_call(env, info, &is_constructor));
35+
napi_value new_target;
36+
NAPI_CALL(env, napi_get_new_target(env, info, &new_target));
37+
bool is_constructor = (new_target != nullptr);
3738

3839
size_t argc = 1;
3940
napi_value args[1];

0 commit comments

Comments
 (0)