diff options
author | Jarrod Connolly <jarrod@nestedquotes.ca> | 2019-02-03 23:26:33 -0800 |
---|---|---|
committer | Beth Griggs <Bethany.Griggs@uk.ibm.com> | 2019-09-03 16:58:59 +0100 |
commit | 4f41e4f471180e9b86c92e51814b9aa7c5fe00dc (patch) | |
tree | 644389ae84fd587fa7bea021197b54af8c102c02 /src | |
parent | 55692ba1605dd6a39c85171847fdbe391573989e (diff) | |
download | node-new-4f41e4f471180e9b86c92e51814b9aa7c5fe00dc.tar.gz |
n-api: implement date object
Implements `napi_create_date()` as well as `napi_is_date()` to
allow working with JavaScript Date objects.
Backport-PR-URL: https://github.com/nodejs/node/pull/28298
PR-URL: https://github.com/nodejs/node/pull/25917
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Reviewed-By: Michael Dawson <michael_dawson@ca.ibm.com>
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/node_api.cc | 45 | ||||
-rw-r--r-- | src/node_api.h | 14 | ||||
-rw-r--r-- | src/node_api_types.h | 1 |
3 files changed, 59 insertions, 1 deletions
diff --git a/src/node_api.cc b/src/node_api.cc index 0618b3f7bf..e892d1e76b 100644 --- a/src/node_api.cc +++ b/src/node_api.cc @@ -1376,6 +1376,7 @@ const char* error_messages[] = {nullptr, "Thread-safe function queue is full", "Thread-safe function handle is closing", "A bigint was expected", + "A date was expected", }; static inline napi_status napi_clear_last_error(napi_env env) { @@ -1407,7 +1408,7 @@ napi_status napi_get_last_error_info(napi_env env, // We don't have a napi_status_last as this would result in an ABI // change each time a message was added. static_assert( - node::arraysize(error_messages) == napi_bigint_expected + 1, + node::arraysize(error_messages) == napi_date_expected + 1, "Count of error messages must match count of error values"); CHECK_LE(env->last_error.error_code, napi_callback_scope_mismatch); @@ -4085,6 +4086,48 @@ napi_status napi_is_promise(napi_env env, return napi_clear_last_error(env); } +napi_status napi_create_date(napi_env env, + double time, + napi_value* result) { + NAPI_PREAMBLE(env); + CHECK_ARG(env, result); + + v8::MaybeLocal<v8::Value> maybe_date = v8::Date::New(env->context(), time); + CHECK_MAYBE_EMPTY(env, maybe_date, napi_generic_failure); + + *result = v8impl::JsValueFromV8LocalValue(maybe_date.ToLocalChecked()); + + return GET_RETURN_STATUS(env); +} + +napi_status napi_is_date(napi_env env, + napi_value value, + bool* is_date) { + CHECK_ENV(env); + CHECK_ARG(env, value); + CHECK_ARG(env, is_date); + + *is_date = v8impl::V8LocalValueFromJsValue(value)->IsDate(); + + return napi_clear_last_error(env); +} + +napi_status napi_get_date_value(napi_env env, + napi_value value, + double* result) { + NAPI_PREAMBLE(env); + CHECK_ARG(env, value); + CHECK_ARG(env, result); + + v8::Local<v8::Value> val = v8impl::V8LocalValueFromJsValue(value); + RETURN_STATUS_IF_FALSE(env, val->IsDate(), napi_date_expected); + + v8::Local<v8::Date> date = val.As<v8::Date>(); + *result = date->ValueOf(); + + return GET_RETURN_STATUS(env); +} + napi_status napi_run_script(napi_env env, napi_value script, napi_value* result) { diff --git a/src/node_api.h b/src/node_api.h index 54aa739fa9..f00e66ac15 100644 --- a/src/node_api.h +++ b/src/node_api.h @@ -676,6 +676,20 @@ napi_ref_threadsafe_function(napi_env env, napi_threadsafe_function func); #ifdef NAPI_EXPERIMENTAL +// Dates +NAPI_EXTERN napi_status napi_create_date(napi_env env, + double time, + napi_value* result); + +NAPI_EXTERN napi_status napi_is_date(napi_env env, + napi_value value, + bool* is_date); + +NAPI_EXTERN napi_status napi_get_date_value(napi_env env, + napi_value value, + double* result); + +// BigInt NAPI_EXTERN napi_status napi_create_bigint_int64(napi_env env, int64_t value, napi_value* result); diff --git a/src/node_api_types.h b/src/node_api_types.h index db1d830dff..0aece04aee 100644 --- a/src/node_api_types.h +++ b/src/node_api_types.h @@ -82,6 +82,7 @@ typedef enum { napi_queue_full, napi_closing, napi_bigint_expected, + napi_date_expected, } napi_status; #if NAPI_VERSION >= 4 |