n-api: napi_is_construct_call->napi_get_new_target
Remove napi_is_construct_call and introduce napi_get_new_target. PR-URL: https://github.com/nodejs/node/pull/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>
This commit is contained in:
parent
0c258bdc40
commit
973c12f631
@ -2928,25 +2928,24 @@ Returns `napi_ok` if the API succeeded.
|
|||||||
This method is used within a callback function to retrieve details about the
|
This method is used within a callback function to retrieve details about the
|
||||||
call like the arguments and the `this` pointer from a given callback info.
|
call like the arguments and the `this` pointer from a given callback info.
|
||||||
|
|
||||||
### *napi_is_construct_call*
|
### *napi_get_new_target*
|
||||||
<!-- YAML
|
<!-- YAML
|
||||||
added: v8.0.0
|
added: REPLACEME
|
||||||
-->
|
-->
|
||||||
```C
|
```C
|
||||||
napi_status napi_is_construct_call(napi_env env,
|
napi_status napi_get_new_target(napi_env env,
|
||||||
napi_callback_info cbinfo,
|
napi_callback_info cbinfo,
|
||||||
bool* result)
|
napi_value* result)
|
||||||
```
|
```
|
||||||
|
|
||||||
- `[in] env`: The environment that the API is invoked under.
|
- `[in] env`: The environment that the API is invoked under.
|
||||||
- `[in] cbinfo`: The callback info passed into the callback function.
|
- `[in] cbinfo`: The callback info passed into the callback function.
|
||||||
- `[out] result`: Whether the native function is being invoked as
|
- `[out] result`: The `new.target` of the constructor call.
|
||||||
a constructor call.
|
|
||||||
|
|
||||||
Returns `napi_ok` if the API succeeded.
|
Returns `napi_ok` if the API succeeded.
|
||||||
|
|
||||||
This API checks if the the current callback was due to a
|
This API returns the `new.target` of the constructor call. If the current
|
||||||
consructor call.
|
callback is not a constructor call, the result is `nullptr`.
|
||||||
|
|
||||||
### *napi_new_instance*
|
### *napi_new_instance*
|
||||||
<!-- YAML
|
<!-- YAML
|
||||||
|
@ -444,7 +444,7 @@ class CallbackWrapper {
|
|||||||
CallbackWrapper(napi_value this_arg, size_t args_length, void* data)
|
CallbackWrapper(napi_value this_arg, size_t args_length, void* data)
|
||||||
: _this(this_arg), _args_length(args_length), _data(data) {}
|
: _this(this_arg), _args_length(args_length), _data(data) {}
|
||||||
|
|
||||||
virtual bool IsConstructCall() = 0;
|
virtual napi_value NewTarget() = 0;
|
||||||
virtual void Args(napi_value* buffer, size_t bufferlength) = 0;
|
virtual void Args(napi_value* buffer, size_t bufferlength) = 0;
|
||||||
virtual void SetReturnValue(napi_value value) = 0;
|
virtual void SetReturnValue(napi_value value) = 0;
|
||||||
|
|
||||||
@ -473,8 +473,7 @@ class CallbackWrapperBase : public CallbackWrapper {
|
|||||||
->Value();
|
->Value();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*virtual*/
|
napi_value NewTarget() override { return nullptr; }
|
||||||
bool IsConstructCall() override { return false; }
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void InvokeCallback() {
|
void InvokeCallback() {
|
||||||
@ -522,8 +521,13 @@ class FunctionCallbackWrapper
|
|||||||
const v8::FunctionCallbackInfo<v8::Value>& cbinfo)
|
const v8::FunctionCallbackInfo<v8::Value>& cbinfo)
|
||||||
: CallbackWrapperBase(cbinfo, cbinfo.Length()) {}
|
: CallbackWrapperBase(cbinfo, cbinfo.Length()) {}
|
||||||
|
|
||||||
/*virtual*/
|
napi_value NewTarget() override {
|
||||||
bool IsConstructCall() override { return _cbinfo.IsConstructCall(); }
|
if (_cbinfo.IsConstructCall()) {
|
||||||
|
return v8impl::JsValueFromV8LocalValue(_cbinfo.NewTarget());
|
||||||
|
} else {
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*virtual*/
|
/*virtual*/
|
||||||
void Args(napi_value* buffer, size_t buffer_length) override {
|
void Args(napi_value* buffer, size_t buffer_length) override {
|
||||||
@ -1878,10 +1882,9 @@ napi_status napi_get_cb_info(
|
|||||||
return napi_clear_last_error(env);
|
return napi_clear_last_error(env);
|
||||||
}
|
}
|
||||||
|
|
||||||
napi_status napi_is_construct_call(napi_env env,
|
napi_status napi_get_new_target(napi_env env,
|
||||||
napi_callback_info cbinfo,
|
napi_callback_info cbinfo,
|
||||||
bool* result) {
|
napi_value* result) {
|
||||||
// Omit NAPI_PREAMBLE and GET_RETURN_STATUS because no V8 APIs are called.
|
|
||||||
CHECK_ENV(env);
|
CHECK_ENV(env);
|
||||||
CHECK_ARG(env, cbinfo);
|
CHECK_ARG(env, cbinfo);
|
||||||
CHECK_ARG(env, result);
|
CHECK_ARG(env, result);
|
||||||
@ -1889,7 +1892,7 @@ napi_status napi_is_construct_call(napi_env env,
|
|||||||
v8impl::CallbackWrapper* info =
|
v8impl::CallbackWrapper* info =
|
||||||
reinterpret_cast<v8impl::CallbackWrapper*>(cbinfo);
|
reinterpret_cast<v8impl::CallbackWrapper*>(cbinfo);
|
||||||
|
|
||||||
*result = info->IsConstructCall();
|
*result = info->NewTarget();
|
||||||
return napi_clear_last_error(env);
|
return napi_clear_last_error(env);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -330,9 +330,9 @@ NAPI_EXTERN napi_status napi_get_cb_info(
|
|||||||
napi_value* this_arg, // [out] Receives the JS 'this' arg for the call
|
napi_value* this_arg, // [out] Receives the JS 'this' arg for the call
|
||||||
void** data); // [out] Receives the data pointer for the callback.
|
void** data); // [out] Receives the data pointer for the callback.
|
||||||
|
|
||||||
NAPI_EXTERN napi_status napi_is_construct_call(napi_env env,
|
NAPI_EXTERN napi_status napi_get_new_target(napi_env env,
|
||||||
napi_callback_info cbinfo,
|
napi_callback_info cbinfo,
|
||||||
bool* result);
|
napi_value* result);
|
||||||
NAPI_EXTERN napi_status
|
NAPI_EXTERN napi_status
|
||||||
napi_define_class(napi_env env,
|
napi_define_class(napi_env env,
|
||||||
const char* utf8name,
|
const char* utf8name,
|
||||||
|
@ -32,8 +32,9 @@ void MyObject::Init(napi_env env, napi_value exports) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
napi_value MyObject::New(napi_env env, napi_callback_info info) {
|
napi_value MyObject::New(napi_env env, napi_callback_info info) {
|
||||||
bool is_constructor;
|
napi_value new_target;
|
||||||
NAPI_CALL(env, napi_is_construct_call(env, info, &is_constructor));
|
NAPI_CALL(env, napi_get_new_target(env, info, &new_target));
|
||||||
|
bool is_constructor = (new_target != nullptr);
|
||||||
|
|
||||||
size_t argc = 1;
|
size_t argc = 1;
|
||||||
napi_value args[1];
|
napi_value args[1];
|
||||||
|
Loading…
x
Reference in New Issue
Block a user