From cc8cdf6c51e7729575924d101aa2cbaf0964fa5f Mon Sep 17 00:00:00 2001 From: Jarred Sumner Date: Sat, 27 Apr 2024 02:59:11 -0700 Subject: [PATCH] Fix napi_get_date_value (#10575) --- src/bun.js/bindings/napi.cpp | 30 ++++++++++++++++++++++++++++++ src/napi/napi.zig | 12 +----------- 2 files changed, 31 insertions(+), 11 deletions(-) diff --git a/src/bun.js/bindings/napi.cpp b/src/bun.js/bindings/napi.cpp index 32e2e9261e3a8..ec1007c86d843 100644 --- a/src/bun.js/bindings/napi.cpp +++ b/src/bun.js/bindings/napi.cpp @@ -1,6 +1,10 @@ + #include "node_api.h" #include "root.h" + +#include "JavaScriptCore/DateInstance.h" +#include "JavaScriptCore/JSCast.h" #include "ZigGlobalObject.h" #include "JavaScriptCore/JSGlobalObject.h" #include "JavaScriptCore/SourceCode.h" @@ -534,6 +538,32 @@ extern "C" napi_status napi_has_property(napi_env env, napi_value object, scope.clearException(); return napi_ok; } + +extern "C" napi_status napi_get_date_value(napi_env env, napi_value value, double* result) +{ + NAPI_PREMABLE + + if (UNLIKELY(!env)) { + return napi_invalid_arg; + } + + JSValue jsValue = toJS(value); + if (UNLIKELY(!jsValue)) { + return napi_date_expected; + } + + auto* date = jsDynamicCast(jsValue); + if (UNLIKELY(!date)) { + return napi_date_expected; + } + + if (result) { + *result = date->internalNumber(); + } + + return napi_ok; +} + extern "C" napi_status napi_get_property(napi_env env, napi_value object, napi_value key, napi_value* result) { diff --git a/src/napi/napi.zig b/src/napi/napi.zig index 972d585291030..d3a3d881a0535 100644 --- a/src/napi/napi.zig +++ b/src/napi/napi.zig @@ -900,17 +900,7 @@ pub export fn napi_is_date(_: napi_env, value: napi_value, is_date: *bool) napi_ is_date.* = value.jsTypeLoose() == .JSDate; return .ok; } -pub export fn napi_get_date_value(env: napi_env, value: napi_value, result: *f64) napi_status { - log("napi_get_date_value", .{}); - const getTimeFunction = value.get(env, "getTime") orelse { - return .date_expected; - }; - - result.* = JSValue.c( - JSC.C.JSObjectCallAsFunction(env.ref(), getTimeFunction.asObjectRef(), value.asObjectRef(), 0, null, TODO_EXCEPTION), - ).asNumber(); - return .ok; -} +pub extern fn napi_get_date_value(env: napi_env, value: napi_value, result: *f64) napi_status; pub extern fn napi_add_finalizer(env: napi_env, js_object: napi_value, native_object: ?*anyopaque, finalize_cb: napi_finalize, finalize_hint: ?*anyopaque, result: *Ref) napi_status; pub export fn napi_create_bigint_int64(env: napi_env, value: i64, result: *napi_value) napi_status { log("napi_create_bigint_int64", .{});