Skip to content

Commit

Permalink
Update to upstream with some modifications
Browse files Browse the repository at this point in the history
Update to upstream with some modifications
* napi_module_register() uses NODE_MODULE_VERSION, not -1
* We do not use V8's InstanceOf() because its not available
  on earlier node versions

PR-URL: nodejs#160
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Reviewed-By: Michael Dawson <michael_dawson@ca.ibm.com>
  • Loading branch information
Gabriel Schulhof authored and mhdawson committed Oct 25, 2017
1 parent 22be609 commit 988c9a9
Show file tree
Hide file tree
Showing 2 changed files with 54 additions and 25 deletions.
76 changes: 52 additions & 24 deletions src/node_api.cc
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ struct napi_env__ {
v8::Persistent<v8::ObjectTemplate> accessor_data_template;
bool has_instance_available;
napi_extended_error_info last_error;
int open_handle_scopes = 0;
};

#define ENV_OBJECT_TEMPLATE(env, prefix, destination, field_count) \
Expand Down Expand Up @@ -201,19 +202,23 @@ class EscapableHandleScopeWrapper {
bool escape_called_;
};

static
napi_handle_scope JsHandleScopeFromV8HandleScope(HandleScopeWrapper* s) {
return reinterpret_cast<napi_handle_scope>(s);
}

static
HandleScopeWrapper* V8HandleScopeFromJsHandleScope(napi_handle_scope s) {
return reinterpret_cast<HandleScopeWrapper*>(s);
}

static
napi_escapable_handle_scope JsEscapableHandleScopeFromV8EscapableHandleScope(
EscapableHandleScopeWrapper* s) {
return reinterpret_cast<napi_escapable_handle_scope>(s);
}

static
EscapableHandleScopeWrapper*
V8EscapableHandleScopeFromJsEscapableHandleScope(
napi_escapable_handle_scope s) {
Expand All @@ -227,18 +232,22 @@ V8EscapableHandleScopeFromJsEscapableHandleScope(
static_assert(sizeof(v8::Local<v8::Value>) == sizeof(napi_value),
"Cannot convert between v8::Local<v8::Value> and napi_value");

static
napi_deferred JsDeferredFromV8Persistent(v8::Persistent<v8::Value>* local) {
return reinterpret_cast<napi_deferred>(local);
}

static
v8::Persistent<v8::Value>* V8PersistentFromJsDeferred(napi_deferred local) {
return reinterpret_cast<v8::Persistent<v8::Value>*>(local);
}

static
napi_value JsValueFromV8LocalValue(v8::Local<v8::Value> local) {
return reinterpret_cast<napi_value>(*local);
}

static
v8::Local<v8::Value> V8LocalValueFromJsValue(napi_value v) {
v8::Local<v8::Value> local;
memcpy(&local, &v, sizeof(v));
Expand Down Expand Up @@ -502,12 +511,16 @@ class CallbackWrapperBase : public CallbackWrapper {
// Make sure any errors encountered last time we were in N-API are gone.
napi_clear_last_error(env);

int open_handle_scopes = env->open_handle_scopes;

napi_value result = cb(env, cbinfo_wrapper);

if (result != nullptr) {
this->SetReturnValue(result);
}

CHECK_EQ(env->open_handle_scopes, open_handle_scopes);

if (!env->last_exception.IsEmpty()) {
isolate->ThrowException(
v8::Local<v8::Value>::New(isolate, env->last_exception));
Expand Down Expand Up @@ -637,6 +650,7 @@ class SetterCallbackWrapper

// Creates an object to be made available to the static function callback
// wrapper, used to retrieve the native callback function and data pointer.
static
v8::Local<v8::Object> CreateFunctionCallbackData(napi_env env,
napi_callback cb,
void* data) {
Expand All @@ -662,6 +676,7 @@ v8::Local<v8::Object> CreateFunctionCallbackData(napi_env env,
// Creates an object to be made available to the static getter/setter
// callback wrapper, used to retrieve the native getter/setter callback
// function and data pointer.
static
v8::Local<v8::Object> CreateAccessorCallbackData(napi_env env,
napi_callback getter,
napi_callback setter,
Expand Down Expand Up @@ -704,6 +719,7 @@ const char napi_wrap_name[] = "N-API Wrapper";
// Search the object's prototype chain for the wrapper object. Usually the
// wrapper would be the first in the chain, but it is OK for other objects to
// be inserted in the prototype chain.
static
bool FindWrapper(v8::Local<v8::Object> obj,
v8::Local<v8::Object>* result = nullptr,
v8::Local<v8::Object>* parent = nullptr) {
Expand Down Expand Up @@ -737,6 +753,7 @@ static void DeleteEnv(napi_env env, void* data, void* hint) {
delete env;
}

static
napi_env GetEnv(v8::Local<v8::Context> context) {
napi_env result;

Expand Down Expand Up @@ -772,6 +789,7 @@ napi_env GetEnv(v8::Local<v8::Context> context) {
return result;
}

static
napi_status Unwrap(napi_env env,
napi_value js_object,
void** result,
Expand All @@ -795,6 +813,7 @@ napi_status Unwrap(napi_env env,
return napi_ok;
}

static
napi_status ConcludeDeferred(napi_env env,
napi_deferred deferred,
napi_value result,
Expand Down Expand Up @@ -854,12 +873,8 @@ void napi_module_register_cb(v8::Local<v8::Object> exports,

// Registers a NAPI module.
void napi_module_register(napi_module* mod) {
int module_version = -1;
#ifdef EXTERNAL_NAPI
module_version = NODE_MODULE_VERSION;
#endif // EXTERNAL_NAPI
node::node_module* nm = new node::node_module {
module_version,
NODE_MODULE_VERSION,
mod->nm_flags,
nullptr,
mod->nm_filename,
Expand All @@ -873,6 +888,7 @@ void napi_module_register(napi_module* mod) {
}

// Warning: Keep in-sync with napi_status enum
static
const char* error_messages[] = {nullptr,
"Invalid argument",
"An object was expected",
Expand Down Expand Up @@ -1209,10 +1225,10 @@ napi_status napi_delete_property(napi_env env,
return GET_RETURN_STATUS(env);
}

NAPI_EXTERN napi_status napi_has_own_property(napi_env env,
napi_value object,
napi_value key,
bool* result) {
napi_status napi_has_own_property(napi_env env,
napi_value object,
napi_value key,
bool* result) {
NAPI_PREAMBLE(env);
CHECK_ARG(env, key);

Expand Down Expand Up @@ -2583,6 +2599,7 @@ napi_status napi_open_handle_scope(napi_env env, napi_handle_scope* result) {

*result = v8impl::JsHandleScopeFromV8HandleScope(
new v8impl::HandleScopeWrapper(env->isolate));
env->open_handle_scopes++;
return napi_clear_last_error(env);
}

Expand All @@ -2591,7 +2608,11 @@ napi_status napi_close_handle_scope(napi_env env, napi_handle_scope scope) {
// JS exceptions.
CHECK_ENV(env);
CHECK_ARG(env, scope);
if (env->open_handle_scopes == 0) {
return napi_handle_scope_mismatch;
}

env->open_handle_scopes--;
delete v8impl::V8HandleScopeFromJsHandleScope(scope);
return napi_clear_last_error(env);
}
Expand All @@ -2606,6 +2627,7 @@ napi_status napi_open_escapable_handle_scope(

*result = v8impl::JsEscapableHandleScopeFromV8EscapableHandleScope(
new v8impl::EscapableHandleScopeWrapper(env->isolate));
env->open_handle_scopes++;
return napi_clear_last_error(env);
}

Expand All @@ -2616,8 +2638,12 @@ napi_status napi_close_escapable_handle_scope(
// JS exceptions.
CHECK_ENV(env);
CHECK_ARG(env, scope);
if (env->open_handle_scopes == 0) {
return napi_handle_scope_mismatch;
}

delete v8impl::V8EscapableHandleScopeFromJsEscapableHandleScope(scope);
env->open_handle_scopes--;
return napi_clear_last_error(env);
}

Expand Down Expand Up @@ -3313,6 +3339,7 @@ napi_status napi_adjust_external_memory(napi_env env,
return napi_clear_last_error(env);
}

namespace {
namespace uvimpl {

static napi_status ConvertUVErrorCode(int code) {
Expand Down Expand Up @@ -3411,6 +3438,7 @@ class Work : public node::AsyncResource {
};

} // end of namespace uvimpl
} // end of anonymous namespace

#define CALL_UV(env, condition) \
do { \
Expand Down Expand Up @@ -3493,9 +3521,9 @@ napi_status napi_cancel_async_work(napi_env env, napi_async_work work) {
return napi_clear_last_error(env);
}

NAPI_EXTERN napi_status napi_create_promise(napi_env env,
napi_deferred* deferred,
napi_value* promise) {
napi_status napi_create_promise(napi_env env,
napi_deferred* deferred,
napi_value* promise) {
NAPI_PREAMBLE(env);
CHECK_ARG(env, deferred);
CHECK_ARG(env, promise);
Expand All @@ -3512,21 +3540,21 @@ NAPI_EXTERN napi_status napi_create_promise(napi_env env,
return GET_RETURN_STATUS(env);
}

NAPI_EXTERN napi_status napi_resolve_deferred(napi_env env,
napi_deferred deferred,
napi_value resolution) {
napi_status napi_resolve_deferred(napi_env env,
napi_deferred deferred,
napi_value resolution) {
return v8impl::ConcludeDeferred(env, deferred, resolution, true);
}

NAPI_EXTERN napi_status napi_reject_deferred(napi_env env,
napi_deferred deferred,
napi_value resolution) {
napi_status napi_reject_deferred(napi_env env,
napi_deferred deferred,
napi_value resolution) {
return v8impl::ConcludeDeferred(env, deferred, resolution, false);
}

NAPI_EXTERN napi_status napi_is_promise(napi_env env,
napi_value promise,
bool* is_promise) {
napi_status napi_is_promise(napi_env env,
napi_value promise,
bool* is_promise) {
CHECK_ENV(env);
CHECK_ARG(env, promise);
CHECK_ARG(env, is_promise);
Expand All @@ -3536,9 +3564,9 @@ NAPI_EXTERN napi_status napi_is_promise(napi_env env,
return napi_clear_last_error(env);
}

NAPI_EXTERN napi_status napi_run_script(napi_env env,
napi_value script,
napi_value* result) {
napi_status napi_run_script(napi_env env,
napi_value script,
napi_value* result) {
NAPI_PREAMBLE(env);
CHECK_ARG(env, script);
CHECK_ARG(env, result);
Expand Down
3 changes: 2 additions & 1 deletion src/node_api_types.h
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,8 @@ typedef enum {
napi_generic_failure,
napi_pending_exception,
napi_cancelled,
napi_escape_called_twice
napi_escape_called_twice,
napi_handle_scope_mismatch
} napi_status;

typedef napi_value (*napi_callback)(napi_env env,
Expand Down

0 comments on commit 988c9a9

Please sign in to comment.