Skip to content

Commit a2d340f

Browse files
Sampson Gaojasnell
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 <[email protected]> Reviewed-By: Colin Ihrig <[email protected]> Reviewed-By: Michael Dawson <[email protected]> Reviewed-By: James M Snell <[email protected]> Reviewed-By: Kyle Farnung <[email protected]>
1 parent 4d26c68 commit a2d340f

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
@@ -2918,25 +2918,24 @@ Returns `napi_ok` if the API succeeded.
29182918
This method is used within a callback function to retrieve details about the
29192919
call like the arguments and the `this` pointer from a given callback info.
29202920

2921-
### *napi_is_construct_call*
2921+
### *napi_get_new_target*
29222922
<!-- YAML
2923-
added: v8.0.0
2923+
added: REPLACEME
29242924
-->
29252925
```C
2926-
napi_status napi_is_construct_call(napi_env env,
2927-
napi_callback_info cbinfo,
2928-
bool* result)
2926+
napi_status napi_get_new_target(napi_env env,
2927+
napi_callback_info cbinfo,
2928+
napi_value* result)
29292929
```
29302930

29312931
- `[in] env`: The environment that the API is invoked under.
29322932
- `[in] cbinfo`: The callback info passed into the callback function.
2933-
- `[out] result`: Whether the native function is being invoked as
2934-
a constructor call.
2933+
- `[out] result`: The `new.target` of the constructor call.
29352934

29362935
Returns `napi_ok` if the API succeeded.
29372936

2938-
This API checks if the the current callback was due to a
2939-
consructor call.
2937+
This API returns the `new.target` of the constructor call. If the current
2938+
callback is not a constructor call, the result is `nullptr`.
29402939

29412940
### *napi_new_instance*
29422941
<!-- YAML

src/node_api.cc

+13-10
Original file line numberDiff line numberDiff line change
@@ -446,7 +446,7 @@ class CallbackWrapper {
446446
CallbackWrapper(napi_value this_arg, size_t args_length, void* data)
447447
: _this(this_arg), _args_length(args_length), _data(data) {}
448448

449-
virtual bool IsConstructCall() = 0;
449+
virtual napi_value NewTarget() = 0;
450450
virtual void Args(napi_value* buffer, size_t bufferlength) = 0;
451451
virtual void SetReturnValue(napi_value value) = 0;
452452

@@ -475,8 +475,7 @@ class CallbackWrapperBase : public CallbackWrapper {
475475
->Value();
476476
}
477477

478-
/*virtual*/
479-
bool IsConstructCall() override { return false; }
478+
napi_value NewTarget() override { return nullptr; }
480479

481480
protected:
482481
void InvokeCallback() {
@@ -524,8 +523,13 @@ class FunctionCallbackWrapper
524523
const v8::FunctionCallbackInfo<v8::Value>& cbinfo)
525524
: CallbackWrapperBase(cbinfo, cbinfo.Length()) {}
526525

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

530534
/*virtual*/
531535
void Args(napi_value* buffer, size_t buffer_length) override {
@@ -1874,18 +1878,17 @@ napi_status napi_get_cb_info(
18741878
return napi_clear_last_error(env);
18751879
}
18761880

1877-
napi_status napi_is_construct_call(napi_env env,
1878-
napi_callback_info cbinfo,
1879-
bool* result) {
1880-
// Omit NAPI_PREAMBLE and GET_RETURN_STATUS because no V8 APIs are called.
1881+
napi_status napi_get_new_target(napi_env env,
1882+
napi_callback_info cbinfo,
1883+
napi_value* result) {
18811884
CHECK_ENV(env);
18821885
CHECK_ARG(env, cbinfo);
18831886
CHECK_ARG(env, result);
18841887

18851888
v8impl::CallbackWrapper* info =
18861889
reinterpret_cast<v8impl::CallbackWrapper*>(cbinfo);
18871890

1888-
*result = info->IsConstructCall();
1891+
*result = info->NewTarget();
18891892
return napi_clear_last_error(env);
18901893
}
18911894

src/node_api.h

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

343-
NAPI_EXTERN napi_status napi_is_construct_call(napi_env env,
344-
napi_callback_info cbinfo,
345-
bool* result);
343+
NAPI_EXTERN napi_status napi_get_new_target(napi_env env,
344+
napi_callback_info cbinfo,
345+
napi_value* result);
346346
NAPI_EXTERN napi_status
347347
napi_define_class(napi_env env,
348348
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)