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:
Sampson Gao 2017-08-08 16:21:56 -04:00 committed by Michael Dawson
parent 0c258bdc40
commit 973c12f631
4 changed files with 27 additions and 24 deletions

View File

@ -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

View File

@ -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);
} }

View File

@ -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,

View File

@ -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];