aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/bun.js/bindings/bindings.zig4
-rw-r--r--src/bun.js/bindings/napi.cpp75
-rw-r--r--src/napi/napi.zig12
-rw-r--r--src/symbols.dyn2
-rw-r--r--src/symbols.txt2
5 files changed, 91 insertions, 4 deletions
diff --git a/src/bun.js/bindings/bindings.zig b/src/bun.js/bindings/bindings.zig
index 1a82fc5e6..72393d639 100644
--- a/src/bun.js/bindings/bindings.zig
+++ b/src/bun.js/bindings/bindings.zig
@@ -3903,6 +3903,10 @@ pub const JSValue = enum(JSValueReprInt) {
return jsNumberFromInt32(@as(i32, @intCast(i)));
}
+ return jsNumberFromPtrSize(i);
+ }
+
+ pub fn jsNumberFromPtrSize(i: usize) JSValue {
return jsNumberFromDouble(@as(f64, @floatFromInt(@as(i52, @intCast(@as(u51, @truncate(i)))))));
}
diff --git a/src/bun.js/bindings/napi.cpp b/src/bun.js/bindings/napi.cpp
index 9b6d5c853..9823a59b6 100644
--- a/src/bun.js/bindings/napi.cpp
+++ b/src/bun.js/bindings/napi.cpp
@@ -503,6 +503,81 @@ extern "C" napi_status napi_get_named_property(napi_env env, napi_value object,
return napi_ok;
}
+#if !COMPILER(MSVC)
+__attribute__((visibility("default")))
+#endif
+extern "C" napi_status
+node_api_create_external_string_latin1(napi_env env,
+ char* str,
+ size_t length,
+ napi_finalize finalize_callback,
+ void* finalize_hint,
+ napi_value* result,
+ bool* copied)
+{
+ // https://nodejs.org/api/n-api.html#node_api_create_external_string_latin1
+ if (UNLIKELY(!str || !result)) {
+ return napi_invalid_arg;
+ }
+
+ length = length == NAPI_AUTO_LENGTH ? strlen(str) : length;
+ WTF::ExternalStringImpl& impl = WTF::ExternalStringImpl::create(reinterpret_cast<LChar*>(str), static_cast<unsigned int>(length), finalize_hint, [finalize_callback](void* hint, void* str, unsigned length) {
+ if (finalize_callback) {
+ finalize_callback(reinterpret_cast<napi_env>(Bun__getDefaultGlobal()), nullptr, hint);
+ }
+ });
+ JSGlobalObject* globalObject = toJS(env);
+ // globalObject is allowed to be null here
+ if (UNLIKELY(!globalObject)) {
+ globalObject = Bun__getDefaultGlobal();
+ }
+
+ JSString* out = JSC::jsString(globalObject->vm(), WTF::String(impl));
+ ensureStillAliveHere(out);
+ *result = toNapi(out);
+ ensureStillAliveHere(out);
+
+ return napi_ok;
+}
+
+#if !COMPILER(MSVC)
+__attribute__((visibility("default")))
+#endif
+
+extern "C" napi_status
+node_api_create_external_string_utf16(napi_env env,
+ char16_t* str,
+ size_t length,
+ napi_finalize finalize_callback,
+ void* finalize_hint,
+ napi_value* result,
+ bool* copied)
+{
+ // https://nodejs.org/api/n-api.html#node_api_create_external_string_utf16
+ if (UNLIKELY(!str || !result)) {
+ return napi_invalid_arg;
+ }
+
+ length = length == NAPI_AUTO_LENGTH ? std::char_traits<char16_t>::length(str) : length;
+ WTF::ExternalStringImpl& impl = WTF::ExternalStringImpl::create(reinterpret_cast<UChar*>(str), static_cast<unsigned int>(length), finalize_hint, [finalize_callback](void* hint, void* str, unsigned length) {
+ if (finalize_callback) {
+ finalize_callback(reinterpret_cast<napi_env>(Bun__getDefaultGlobal()), nullptr, hint);
+ }
+ });
+ JSGlobalObject* globalObject = toJS(env);
+ // globalObject is allowed to be null here
+ if (UNLIKELY(!globalObject)) {
+ globalObject = Bun__getDefaultGlobal();
+ }
+
+ JSString* out = JSC::jsString(globalObject->vm(), WTF::String(impl));
+ ensureStillAliveHere(out);
+ *result = toNapi(out);
+ ensureStillAliveHere(out);
+
+ return napi_ok;
+}
+
extern "C" void napi_module_register(napi_module* mod)
{
auto* globalObject = Bun__getDefaultGlobal();
diff --git a/src/napi/napi.zig b/src/napi/napi.zig
index d143fe1b3..e86a832b9 100644
--- a/src/napi/napi.zig
+++ b/src/napi/napi.zig
@@ -309,14 +309,14 @@ pub extern fn napi_create_error(env: napi_env, code: napi_value, msg: napi_value
pub extern fn napi_create_type_error(env: napi_env, code: napi_value, msg: napi_value, result: *napi_value) napi_status;
pub extern fn napi_create_range_error(env: napi_env, code: napi_value, msg: napi_value, result: *napi_value) napi_status;
pub extern fn napi_typeof(env: napi_env, value: napi_value, result: *napi_valuetype) napi_status;
-pub export fn napi_get_value_double(_: napi_env, value: napi_value, result: *f64) napi_status {
+pub export fn napi_get_value_double(globalObject: napi_env, value: napi_value, result: *f64) napi_status {
log("napi_get_value_double", .{});
- result.* = value.asNumber();
+ result.* = value.coerce(f64, globalObject);
return .ok;
}
-pub export fn napi_get_value_int32(_: napi_env, value: napi_value, result: *i32) napi_status {
+pub export fn napi_get_value_int32(globalObject: napi_env, value: napi_value, result: *i32) napi_status {
log("napi_get_value_int32", .{});
- result.* = value.to(i32);
+ result.* = value.coerce(i32, globalObject);
return .ok;
}
pub export fn napi_get_value_uint32(_: napi_env, value: napi_value, result: *u32) napi_status {
@@ -1097,6 +1097,8 @@ pub export fn napi_get_buffer_info(env: napi_env, value: napi_value, data: *[*]u
extern fn node_api_create_syntax_error(napi_env, napi_value, napi_value, *napi_value) napi_status;
extern fn node_api_symbol_for(napi_env, [*]const c_char, usize, *napi_value) napi_status;
extern fn node_api_throw_syntax_error(napi_env, [*]const c_char, [*]const c_char) napi_status;
+extern fn node_api_create_external_string_latin1(napi_env, [*:0]u8, usize, napi_finalize, ?*anyopaque, *JSValue, *bool) napi_status;
+extern fn node_api_create_external_string_utf16(napi_env, [*:0]u16, usize, napi_finalize, ?*anyopaque, *JSValue, *bool) napi_status;
pub export fn napi_create_async_work(
env: napi_env,
@@ -1617,5 +1619,7 @@ pub fn fixDeadCodeElimination() void {
std.mem.doNotOptimizeAway(&node_api_create_syntax_error);
std.mem.doNotOptimizeAway(&node_api_symbol_for);
std.mem.doNotOptimizeAway(&node_api_throw_syntax_error);
+ std.mem.doNotOptimizeAway(&node_api_create_external_string_latin1);
+ std.mem.doNotOptimizeAway(&node_api_create_external_string_utf16);
std.mem.doNotOptimizeAway(&@import("../bun.js/node/buffer.zig").BufferVectorized.fill);
}
diff --git a/src/symbols.dyn b/src/symbols.dyn
index 5ec9fd807..63b17aa61 100644
--- a/src/symbols.dyn
+++ b/src/symbols.dyn
@@ -146,4 +146,6 @@
_node_api_create_syntax_error;
_node_api_symbol_for;
_node_api_throw_syntax_error;
+ _node_api_create_external_string_latin1;
+ _node_api_create_external_string_utf16;
}; \ No newline at end of file
diff --git a/src/symbols.txt b/src/symbols.txt
index c958a08eb..ab6490f5a 100644
--- a/src/symbols.txt
+++ b/src/symbols.txt
@@ -145,3 +145,5 @@ _napi_wrap
_node_api_create_syntax_error
_node_api_symbol_for
_node_api_throw_syntax_error
+_node_api_create_external_string_latin1
+_node_api_create_external_string_utf16