summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJarrod Connolly <jarrod@nestedquotes.ca>2019-02-03 23:26:33 -0800
committerBeth Griggs <Bethany.Griggs@uk.ibm.com>2019-09-03 16:58:59 +0100
commit4f41e4f471180e9b86c92e51814b9aa7c5fe00dc (patch)
tree644389ae84fd587fa7bea021197b54af8c102c02 /src
parent55692ba1605dd6a39c85171847fdbe391573989e (diff)
downloadnode-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.cc45
-rw-r--r--src/node_api.h14
-rw-r--r--src/node_api_types.h1
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