diff options
author | 2023-08-19 18:34:56 -0700 | |
---|---|---|
committer | 2023-08-19 18:34:56 -0700 | |
commit | 19054ebc35201cdb3d80f114d3fff88f852c0bd7 (patch) | |
tree | f5a8b987cb93a7120ce27a1418560b464db24209 | |
parent | 507761b4637a83d10e2f8b64ff870881bba7c14b (diff) | |
download | bun-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.cpp | 55 | ||||
-rw-r--r-- | src/linker.lds | 1 | ||||
-rw-r--r-- | src/napi/napi.zig | 9 | ||||
-rw-r--r-- | src/symbols.dyn | 3 | ||||
-rw-r--r-- | src/symbols.txt | 3 |
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 |