Skip to content

Commit 973c12f

Browse files
Sampson Gaomhdawson
Sampson Gao
authored andcommitted
n-api: napi_is_construct_call->napi_get_new_target
Remove napi_is_construct_call and introduce napi_get_new_target. 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 0c258bd commit 973c12f

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
@@ -444,7 +444,7 @@ class CallbackWrapper {
444444
CallbackWrapper(napi_value this_arg, size_t args_length, void* data)
445445
: _this(this_arg), _args_length(args_length), _data(data) {}
446446

447-
virtual bool IsConstructCall() = 0;
447+
virtual napi_value NewTarget() = 0;
448448
virtual void Args(napi_value* buffer, size_t bufferlength) = 0;
449449
virtual void SetReturnValue(napi_value value) = 0;
450450

@@ -473,8 +473,7 @@ class CallbackWrapperBase : public CallbackWrapper {
473473
->Value();
474474
}
475475

476-
/*virtual*/
477-
bool IsConstructCall() override { return false; }
476+
napi_value NewTarget() override { return nullptr; }
478477

479478
protected:
480479
void InvokeCallback() {
@@ -522,8 +521,13 @@ class FunctionCallbackWrapper
522521
const v8::FunctionCallbackInfo<v8::Value>& cbinfo)
523522
: CallbackWrapperBase(cbinfo, cbinfo.Length()) {}
524523

525-
/*virtual*/
526-
bool IsConstructCall() override { return _cbinfo.IsConstructCall(); }
524+
napi_value NewTarget() override {
525+
if (_cbinfo.IsConstructCall()) {
526+
return v8impl::JsValueFromV8LocalValue(_cbinfo.NewTarget());
527+
} else {
528+
return nullptr;
529+
}
530+
}
527531

528532
/*virtual*/
529533
void Args(napi_value* buffer, size_t buffer_length) override {
@@ -1878,18 +1882,17 @@ napi_status napi_get_cb_info(
18781882
return napi_clear_last_error(env);
18791883
}
18801884

1881-
napi_status napi_is_construct_call(napi_env env,
1882-
napi_callback_info cbinfo,
1883-
bool* result) {
1884-
// Omit NAPI_PREAMBLE and GET_RETURN_STATUS because no V8 APIs are called.
1885+
napi_status napi_get_new_target(napi_env env,
1886+
napi_callback_info cbinfo,
1887+
napi_value* result) {
18851888
CHECK_ENV(env);
18861889
CHECK_ARG(env, cbinfo);
18871890
CHECK_ARG(env, result);
18881891

18891892
v8impl::CallbackWrapper* info =
18901893
reinterpret_cast<v8impl::CallbackWrapper*>(cbinfo);
18911894

1892-
*result = info->IsConstructCall();
1895+
*result = info->NewTarget();
18931896
return napi_clear_last_error(env);
18941897
}
18951898

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)