aboutsummaryrefslogtreecommitdiff
path: root/src/bun.js/bindings/BunString.cpp
diff options
context:
space:
mode:
authorGravatar Jarred Sumner <jarred@jarredsumner.com> 2023-06-11 05:26:37 -0700
committerGravatar GitHub <noreply@github.com> 2023-06-11 05:26:37 -0700
commitef65f3c305e989bd7d7fe6f0e73822bdbe0e91dd (patch)
tree208a5f55d885c95afe40366bbe7b0e6d4c5f7859 /src/bun.js/bindings/BunString.cpp
parent02eafd5019150357012ebb7a39f1c264ba73599e (diff)
downloadbun-ef65f3c305e989bd7d7fe6f0e73822bdbe0e91dd.tar.gz
bun-ef65f3c305e989bd7d7fe6f0e73822bdbe0e91dd.tar.zst
bun-ef65f3c305e989bd7d7fe6f0e73822bdbe0e91dd.zip
Support using `WTF::StringImpl` from Zig (#3279)
* Fix `make headers` * [JS parser] Fix bug with printing non-ascii import paths in ascii mode * Introduce `bun.String` * Add test for non-ascii imports & entry points * Add comment * Fix build issue * Support HTTP server * Make it print the same --------- Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com>
Diffstat (limited to 'src/bun.js/bindings/BunString.cpp')
-rw-r--r--src/bun.js/bindings/BunString.cpp141
1 files changed, 141 insertions, 0 deletions
diff --git a/src/bun.js/bindings/BunString.cpp b/src/bun.js/bindings/BunString.cpp
new file mode 100644
index 000000000..797f66545
--- /dev/null
+++ b/src/bun.js/bindings/BunString.cpp
@@ -0,0 +1,141 @@
+#include "root.h"
+#include "headers-handwritten.h"
+#include "JavaScriptCore/JSCJSValueInlines.h"
+#include "helpers.h"
+
+using namespace JSC;
+
+extern "C" void Bun__WTFStringImpl__deref(WTF::StringImpl* impl)
+{
+ impl->deref();
+}
+extern "C" void Bun__WTFStringImpl__ref(WTF::StringImpl* impl)
+{
+ impl->ref();
+}
+
+extern "C" bool BunString__fromJS(JSC::JSGlobalObject* globalObject, JSC::EncodedJSValue encodedValue, BunString* bunString)
+{
+ JSC::JSValue value = JSC::JSValue::decode(encodedValue);
+ *bunString = Bun::toString(globalObject, value);
+ return bunString->tag != BunStringTag::Dead;
+}
+
+namespace Bun {
+JSC::JSValue toJS(JSC::JSGlobalObject* globalObject, BunString bunString)
+{
+ if (bunString.tag == BunStringTag::Empty || bunString.tag == BunStringTag::Dead) {
+ return JSValue(JSC::jsEmptyString(globalObject->vm()));
+ }
+ if (bunString.tag == BunStringTag::WTFStringImpl) {
+ return JSValue(jsString(globalObject->vm(), String(bunString.impl.wtf)));
+ }
+
+ if (bunString.tag == BunStringTag::StaticZigString) {
+ return JSValue(jsString(globalObject->vm(), Zig::toStringStatic(bunString.impl.zig)));
+ }
+
+ return JSValue(Zig::toJSStringGC(bunString.impl.zig, globalObject));
+}
+
+WTF::String toWTFString(const BunString& bunString)
+{
+ if (bunString.tag == BunStringTag::ZigString) {
+ if (Zig::isTaggedUTF8Ptr(bunString.impl.zig.ptr)) {
+ return Zig::toStringCopy(bunString.impl.zig);
+ } else {
+ return Zig::toString(bunString.impl.zig);
+ }
+
+ } else if (bunString.tag == BunStringTag::StaticZigString) {
+ return Zig::toStringStatic(bunString.impl.zig);
+ }
+
+ if (bunString.tag == BunStringTag::WTFStringImpl) {
+ return WTF::String(bunString.impl.wtf);
+ }
+
+ return WTF::String();
+}
+
+BunString fromJS(JSC::JSGlobalObject* globalObject, JSValue value)
+{
+ JSC::JSString* str = value.toStringOrNull(globalObject);
+ if (UNLIKELY(!str)) {
+ return { BunStringTag::Dead };
+ }
+
+ if (str->length() == 0) {
+ return { BunStringTag::Empty };
+ }
+
+ auto wtfString = str->value(globalObject);
+
+ return { BunStringTag::WTFStringImpl, { .wtf = wtfString.impl() } };
+}
+
+BunString toString(JSC::JSGlobalObject* globalObject, JSValue value)
+{
+ return fromJS(globalObject, value);
+}
+
+BunString toString(WTF::String& wtfString)
+{
+ if (wtfString.length() == 0)
+ return { BunStringTag::Empty };
+
+ return { BunStringTag::WTFStringImpl, { .wtf = wtfString.impl() } };
+}
+BunString toString(const WTF::String& wtfString)
+{
+ if (wtfString.length() == 0)
+ return { BunStringTag::Empty };
+
+ return { BunStringTag::WTFStringImpl, { .wtf = wtfString.impl() } };
+}
+BunString toString(WTF::StringImpl* wtfString)
+{
+ if (wtfString->length() == 0)
+ return { BunStringTag::Empty };
+
+ return { BunStringTag::WTFStringImpl, { .wtf = wtfString } };
+}
+
+BunString fromString(WTF::String& wtfString)
+{
+ if (wtfString.length() == 0)
+ return { BunStringTag::Empty };
+
+ return { BunStringTag::WTFStringImpl, { .wtf = wtfString.impl() } };
+}
+
+BunString fromString(WTF::StringImpl* wtfString)
+{
+ if (wtfString->length() == 0)
+ return { BunStringTag::Empty };
+
+ return { BunStringTag::WTFStringImpl, { .wtf = wtfString } };
+}
+
+}
+
+extern "C" JSC::EncodedJSValue BunString__toJS(JSC::JSGlobalObject* globalObject, BunString* bunString)
+{
+ return JSValue::encode(Bun::toJS(globalObject, *bunString));
+}
+
+extern "C" void BunString__toWTFString(BunString* bunString)
+{
+ if (bunString->tag == BunStringTag::ZigString) {
+ if (Zig::isTaggedUTF8Ptr(bunString->impl.zig.ptr)) {
+ bunString->impl.wtf = Zig::toStringCopy(bunString->impl.zig).impl();
+ } else {
+ bunString->impl.wtf = Zig::toString(bunString->impl.zig).impl();
+ }
+
+ bunString->tag = BunStringTag::WTFStringImpl;
+ } else if (bunString->tag == BunStringTag::StaticZigString) {
+ bunString->impl.wtf = Zig::toStringStatic(bunString->impl.zig).impl();
+ bunString->tag = BunStringTag::WTFStringImpl;
+ }
+} \ No newline at end of file