aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> 2023-08-19 18:34:56 -0700
committerGravatar Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> 2023-08-19 18:34:56 -0700
commit19054ebc35201cdb3d80f114d3fff88f852c0bd7 (patch)
treef5a8b987cb93a7120ce27a1418560b464db24209
parent507761b4637a83d10e2f8b64ff870881bba7c14b (diff)
downloadbun-19054ebc35201cdb3d80f114d3fff88f852c0bd7.tar.gz
bun-19054ebc35201cdb3d80f114d3fff88f852c0bd7.tar.zst
bun-19054ebc35201cdb3d80f114d3fff88f852c0bd7.zip
[napi] Implement `node_api_create_syntax_error`, `node_api_symbol_for`, `node_api_throw_syntax_error`
These were marked as experimental
-rw-r--r--src/bun.js/bindings/napi.cpp55
-rw-r--r--src/linker.lds1
-rw-r--r--src/napi/napi.zig9
-rw-r--r--src/symbols.dyn3
-rw-r--r--src/symbols.txt3
5 files changed, 70 insertions, 1 deletions
diff --git a/src/bun.js/bindings/napi.cpp b/src/bun.js/bindings/napi.cpp
index 393c133e1..8a77723e2 100644
--- a/src/bun.js/bindings/napi.cpp
+++ b/src/bun.js/bindings/napi.cpp
@@ -1053,6 +1053,61 @@ extern "C" napi_status napi_throw(napi_env env, napi_value error)
return napi_ok;
}
+extern "C" napi_status node_api_symbol_for(napi_env env,
+ const char* utf8description,
+ size_t length, napi_value* result)
+{
+ auto* globalObject = toJS(env);
+ JSC::VM& vm = globalObject->vm();
+ if (UNLIKELY(!result || !utf8description)) {
+ return napi_invalid_arg;
+ }
+
+ auto description = WTF::String::fromUTF8(utf8description, length == NAPI_AUTO_LENGTH ? strlen(utf8description) : length);
+ *result = toNapi(JSC::Symbol::create(vm, vm.symbolRegistry().symbolForKey(description)));
+
+ return napi_ok;
+}
+
+extern "C" napi_status node_api_create_syntax_error(napi_env env,
+ napi_value code,
+ napi_value msg,
+ napi_value* result)
+{
+ if (UNLIKELY(!result)) {
+ return napi_invalid_arg;
+ }
+
+ JSValue messageValue = toJS(msg);
+ JSValue codeValue = toJS(code);
+ auto globalObject = toJS(env);
+ JSC::VM& vm = globalObject->vm();
+ auto* err = messageValue && !messageValue.isUndefinedOrNull() ? createSyntaxError(globalObject, messageValue.toWTFString(globalObject)) : createSyntaxError(globalObject);
+ if (codeValue && !codeValue.isUndefinedOrNull()) {
+ err->putDirect(vm, WebCore::builtinNames(vm).codePublicName(), codeValue, 0);
+ }
+
+ *result = reinterpret_cast<napi_value>(JSC::JSValue::encode(err));
+ return napi_ok;
+}
+
+extern "C" napi_status node_api_throw_syntax_error(napi_env env,
+ const char* code,
+ const char* msg)
+{
+ auto message = msg ? WTF::String::fromUTF8(msg) : String();
+ auto globalObject = toJS(env);
+ JSC::VM& vm = globalObject->vm();
+ auto* err = createSyntaxError(globalObject, message);
+ if (code) {
+ err->putDirect(vm, WebCore::builtinNames(vm).codePublicName(), JSC::jsString(vm, String::fromUTF8(code)), 0);
+ }
+
+ auto scope = DECLARE_THROW_SCOPE(vm);
+ scope.throwException(globalObject, err);
+ return napi_ok;
+}
+
extern "C" napi_status napi_throw_type_error(napi_env env, const char* code,
const char* msg)
{
diff --git a/src/linker.lds b/src/linker.lds
index a47bc080c..f04f62297 100644
--- a/src/linker.lds
+++ b/src/linker.lds
@@ -1,6 +1,7 @@
BUN_0.7 {
global:
napi*;
+ node_api_*;
__cxa_atexit;
__cxa_thread_atexit_impl;
local:
diff --git a/src/napi/napi.zig b/src/napi/napi.zig
index ac428028b..99a49bb96 100644
--- a/src/napi/napi.zig
+++ b/src/napi/napi.zig
@@ -1093,6 +1093,11 @@ pub export fn napi_get_buffer_info(env: napi_env, value: napi_value, data: *[*]u
length.* = array_buf.byte_len;
return .ok;
}
+
+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;
+
pub export fn napi_create_async_work(
env: napi_env,
_: napi_value,
@@ -1610,6 +1615,8 @@ pub fn fixDeadCodeElimination() void {
std.mem.doNotOptimizeAway(&napi_unref_threadsafe_function);
std.mem.doNotOptimizeAway(&napi_unwrap);
std.mem.doNotOptimizeAway(&napi_wrap);
-
+ 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(&@import("../bun.js/node/buffer.zig").BufferVectorized.fill);
}
diff --git a/src/symbols.dyn b/src/symbols.dyn
index b5c935c00..5ec9fd807 100644
--- a/src/symbols.dyn
+++ b/src/symbols.dyn
@@ -143,4 +143,7 @@
_napi_unref_threadsafe_function;
_napi_unwrap;
_napi_wrap;
+ _node_api_create_syntax_error;
+ _node_api_symbol_for;
+ _node_api_throw_syntax_error;
}; \ No newline at end of file
diff --git a/src/symbols.txt b/src/symbols.txt
index eb5a213f5..c958a08eb 100644
--- a/src/symbols.txt
+++ b/src/symbols.txt
@@ -142,3 +142,6 @@ _napi_typeof
_napi_unref_threadsafe_function
_napi_unwrap
_napi_wrap
+_node_api_create_syntax_error
+_node_api_symbol_for
+_node_api_throw_syntax_error