aboutsummaryrefslogtreecommitdiff
path: root/src/bun.js/bindings/napi.cpp
diff options
context:
space:
mode:
authorGravatar Jarred Sumner <jarred@jarredsumner.com> 2023-09-18 17:31:26 -0700
committerGravatar GitHub <noreply@github.com> 2023-09-18 17:31:26 -0700
commit79dd196edd820db5212da1a524fd5f888b38a3aa (patch)
tree956bdd2f38f86401a3a6293490f26a10fc457b85 /src/bun.js/bindings/napi.cpp
parent333e217c320fdf5a6b62fa31df18389f01887bdd (diff)
downloadbun-79dd196edd820db5212da1a524fd5f888b38a3aa.tar.gz
bun-79dd196edd820db5212da1a524fd5f888b38a3aa.tar.zst
bun-79dd196edd820db5212da1a524fd5f888b38a3aa.zip
Implement `node_api_create_external_string_latin1` and `node_api_create_external_string_utf16` (#5675)
Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com>
Diffstat (limited to 'src/bun.js/bindings/napi.cpp')
-rw-r--r--src/bun.js/bindings/napi.cpp75
1 files changed, 75 insertions, 0 deletions
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();