aboutsummaryrefslogtreecommitdiff
path: root/src/javascript/jsc/bindings/helpers.h
diff options
context:
space:
mode:
authorGravatar Jarred Sumner <jarred@jarredsumner.com> 2022-01-22 19:39:23 -0800
committerGravatar Jarred Sumner <jarred@jarredsumner.com> 2022-01-22 19:39:23 -0800
commitdc5745080d057a73ac8052a40c8950e8c7a8b51c (patch)
treeeadf1f2c9516f1b920a112fcd0f9ba2c284cf422 /src/javascript/jsc/bindings/helpers.h
parent3dfac788fa5bed6fd8438515084d883c876e6a85 (diff)
downloadbun-dc5745080d057a73ac8052a40c8950e8c7a8b51c.tar.gz
bun-dc5745080d057a73ac8052a40c8950e8c7a8b51c.tar.zst
bun-dc5745080d057a73ac8052a40c8950e8c7a8b51c.zip
Ensure we fully copy strings
Diffstat (limited to 'src/javascript/jsc/bindings/helpers.h')
-rw-r--r--src/javascript/jsc/bindings/helpers.h24
1 files changed, 19 insertions, 5 deletions
diff --git a/src/javascript/jsc/bindings/helpers.h b/src/javascript/jsc/bindings/helpers.h
index 83ec088c5..d88d0cfde 100644
--- a/src/javascript/jsc/bindings/helpers.h
+++ b/src/javascript/jsc/bindings/helpers.h
@@ -66,10 +66,16 @@ static const JSC::ArgList makeArgs(JSC__JSValue *v, size_t count) {
namespace Zig {
+// 8 bit byte
+// we tag the final two bits
+// so 56 bits are copied over
+// rest we zero out for consistentcy
+static const unsigned char *untag(const unsigned char *ptr) { return ptr; }
+
static const JSC::Identifier toIdentifier(ZigString str, JSC::JSGlobalObject *global) {
if (str.len == 0 || str.ptr == nullptr) { return JSC::Identifier::EmptyIdentifier; }
- return JSC::Identifier::fromString(global->vm(), str.ptr, str.len);
+ return JSC::Identifier::fromString(global->vm(), untag(str.ptr), str.len);
}
static bool isTaggedUTF16Ptr(const unsigned char *ptr) {
@@ -84,12 +90,18 @@ static const WTF::String toString(ZigString str) {
if (str.len == 0 || str.ptr == nullptr) { return WTF::String(); }
return !isTaggedUTF16Ptr(str.ptr)
- ? WTF::String(WTF::StringImpl::createWithoutCopying(str.ptr, str.len))
+ ? WTF::String(WTF::StringImpl::createWithoutCopying(untag(str.ptr), str.len))
: WTF::String(WTF::StringImpl::createWithoutCopying(
- reinterpret_cast<const UChar *>(str.ptr), str.len));
+ reinterpret_cast<const UChar *>(untag(str.ptr)), str.len));
}
-static const WTF::String toStringCopy(ZigString str) { return toString(str).isolatedCopy(); }
+static const WTF::String toStringCopy(ZigString str) {
+ if (str.len == 0 || str.ptr == nullptr) { return WTF::String(); }
+
+ return !isTaggedUTF16Ptr(str.ptr) ? WTF::String(WTF::StringImpl::create(untag(str.ptr), str.len))
+ : WTF::String(WTF::StringImpl::create(
+ reinterpret_cast<const UChar *>(untag(str.ptr)), str.len));
+}
static WTF::String toStringNotConst(ZigString str) { return toString(str); }
@@ -162,7 +174,9 @@ static ZigString toZigString(JSC::Identifier *str, JSC::JSGlobalObject *global)
return toZigString(str->string());
}
-static WTF::StringView toStringView(ZigString str) { return WTF::StringView(str.ptr, str.len); }
+static WTF::StringView toStringView(ZigString str) {
+ return WTF::StringView(untag(str.ptr), str.len);
+}
static void throwException(JSC::ThrowScope &scope, ZigErrorType err, JSC::JSGlobalObject *global) {
scope.throwException(global,