diff options
Diffstat (limited to 'src/bun.js/bindings/napi.cpp')
-rw-r--r-- | src/bun.js/bindings/napi.cpp | 75 |
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(); |