diff --git a/src/bun.js/bindings/DOMFormData.cpp b/src/bun.js/bindings/DOMFormData.cpp index 34cd431cb6..08c203585f 100644 --- a/src/bun.js/bindings/DOMFormData.cpp +++ b/src/bun.js/bindings/DOMFormData.cpp @@ -110,14 +110,14 @@ void DOMFormData::append(const String& name, RefPtr blob, const String& fi blob->setFileName(replaceUnpairedSurrogatesWithReplacementCharacter(String(filename))); m_items.append({ replaceUnpairedSurrogatesWithReplacementCharacter(String(name)), blob }); } -void DOMFormData::remove(const String& name) +void DOMFormData::remove(const StringView name) { - m_items.removeAllMatching([&name](const auto& item) { + m_items.removeAllMatching([name](const auto& item) { return item.name == name; }); } -auto DOMFormData::get(const String& name) -> std::optional +auto DOMFormData::get(const StringView name) -> std::optional { for (auto& item : m_items) { if (item.name == name) @@ -127,7 +127,7 @@ auto DOMFormData::get(const String& name) -> std::optional return std::nullopt; } -auto DOMFormData::getAll(const String& name) -> Vector +auto DOMFormData::getAll(const StringView name) -> Vector { Vector result; @@ -139,7 +139,7 @@ auto DOMFormData::getAll(const String& name) -> Vector return result; } -bool DOMFormData::has(const String& name) +bool DOMFormData::has(const StringView name) { for (auto& item : m_items) { if (item.name == name) diff --git a/src/bun.js/bindings/DOMFormData.h b/src/bun.js/bindings/DOMFormData.h index 0f0c1518ce..8a25f0b60a 100644 --- a/src/bun.js/bindings/DOMFormData.h +++ b/src/bun.js/bindings/DOMFormData.h @@ -65,10 +65,10 @@ public: void append(const String& name, const String& value); void append(const String& name, RefPtr, const String& filename = {}); - void remove(const String& name); - std::optional get(const String& name); - Vector getAll(const String& name); - bool has(const String& name); + void remove(const StringView name); + std::optional get(const StringView name); + Vector getAll(const StringView name); + bool has(const StringView name); void set(const String& name, const String& value); void set(const String& name, RefPtr, const String& filename = {}); Ref clone() const; diff --git a/src/bun.js/bindings/ErrorCode.cpp b/src/bun.js/bindings/ErrorCode.cpp index 8a7d9c2e97..bb7c91195c 100644 --- a/src/bun.js/bindings/ErrorCode.cpp +++ b/src/bun.js/bindings/ErrorCode.cpp @@ -522,7 +522,7 @@ JSC::EncodedJSValue INVALID_ARG_VALUE(JSC::ThrowScope& throwScope, JSC::JSGlobal return {}; } -JSC::EncodedJSValue UNKNOWN_ENCODING(JSC::ThrowScope& throwScope, JSC::JSGlobalObject* globalObject, const WTF::String& encoding) +JSC::EncodedJSValue UNKNOWN_ENCODING(JSC::ThrowScope& throwScope, JSC::JSGlobalObject* globalObject, const WTF::StringView encoding) { auto message = makeString("Unknown encoding: "_s, encoding); throwScope.throwException(globalObject, createError(globalObject, ErrorCode::ERR_UNKNOWN_ENCODING, message)); diff --git a/src/bun.js/bindings/ErrorCode.h b/src/bun.js/bindings/ErrorCode.h index 6a4387e51c..9c288f9b06 100644 --- a/src/bun.js/bindings/ErrorCode.h +++ b/src/bun.js/bindings/ErrorCode.h @@ -85,7 +85,7 @@ JSC::EncodedJSValue OUT_OF_RANGE(JSC::ThrowScope& throwScope, JSC::JSGlobalObjec JSC::EncodedJSValue OUT_OF_RANGE(JSC::ThrowScope& throwScope, JSC::JSGlobalObject* globalObject, const WTF::String& arg_name_val, const WTF::String& msg, JSC::JSValue actual); JSC::EncodedJSValue INVALID_ARG_VALUE(JSC::ThrowScope& throwScope, JSC::JSGlobalObject* globalObject, WTF::ASCIILiteral name, JSC::JSValue value, const WTF::String& reason = "is invalid"_s); JSC::EncodedJSValue INVALID_ARG_VALUE(JSC::ThrowScope& throwScope, JSC::JSGlobalObject* globalObject, JSC::JSValue name, JSC::JSValue value, const WTF::String& reason = "is invalid"_s); -JSC::EncodedJSValue UNKNOWN_ENCODING(JSC::ThrowScope& throwScope, JSC::JSGlobalObject* globalObject, const WTF::String& encoding); +JSC::EncodedJSValue UNKNOWN_ENCODING(JSC::ThrowScope& throwScope, JSC::JSGlobalObject* globalObject, const WTF::StringView encoding); JSC::EncodedJSValue INVALID_STATE(JSC::ThrowScope& throwScope, JSC::JSGlobalObject* globalObject, const WTF::String& statemsg); JSC::EncodedJSValue STRING_TOO_LONG(JSC::ThrowScope& throwScope, JSC::JSGlobalObject* globalObject); JSC::EncodedJSValue BUFFER_OUT_OF_BOUNDS(JSC::ThrowScope& throwScope, JSC::JSGlobalObject* globalObject); diff --git a/src/bun.js/bindings/JSBuffer.cpp b/src/bun.js/bindings/JSBuffer.cpp index 41976b38ad..ef55090712 100644 --- a/src/bun.js/bindings/JSBuffer.cpp +++ b/src/bun.js/bindings/JSBuffer.cpp @@ -251,11 +251,11 @@ static inline WebCore::BufferEncodingType parseEncoding(JSC::JSGlobalObject* lex { auto arg_ = arg.toStringOrNull(lexicalGlobalObject); RETURN_IF_EXCEPTION(scope, {}); - auto arg_s = arg_->getString(lexicalGlobalObject); + const auto& view = arg_->view(lexicalGlobalObject); - std::optional encoded = parseEnumeration2(*lexicalGlobalObject, arg_s); + std::optional encoded = parseEnumeration2(*lexicalGlobalObject, view); if (UNLIKELY(!encoded)) { - Bun::ERR::UNKNOWN_ENCODING(scope, lexicalGlobalObject, arg_s); + Bun::ERR::UNKNOWN_ENCODING(scope, lexicalGlobalObject, view); return WebCore::BufferEncodingType::utf8; } @@ -322,7 +322,7 @@ static inline JSC::EncodedJSValue writeToBuffer(JSC::JSGlobalObject* lexicalGlob if (UNLIKELY(str->length() == 0)) return JSC::JSValue::encode(JSC::jsNumber(0)); - const auto& view = str->value(lexicalGlobalObject); + const auto& view = str->view(lexicalGlobalObject); if (view->isNull()) { return {}; } @@ -444,7 +444,9 @@ static JSC::EncodedJSValue constructFromEncoding(JSGlobalObject* lexicalGlobalOb auto& vm = JSC::getVM(lexicalGlobalObject); auto scope = DECLARE_THROW_SCOPE(vm); - const auto& view = str->tryGetValue(lexicalGlobalObject); + // Use ->view() here instead of ->value() as that will avoid flattening ropestrings from .slice() + const auto& view = str->view(lexicalGlobalObject); + RETURN_IF_EXCEPTION(scope, {}); JSC::EncodedJSValue result; if (view->is8Bit()) { @@ -524,7 +526,10 @@ static inline JSC::EncodedJSValue constructBufferFromStringAndEncoding(JSC::JSGl if (arg1 && arg1.isString()) { std::optional encoded = parseEnumeration(*lexicalGlobalObject, arg1); if (!encoded) { - return Bun::ERR::UNKNOWN_ENCODING(scope, lexicalGlobalObject, arg1.getString(lexicalGlobalObject)); + auto* encodingString = arg1.toString(lexicalGlobalObject); + RETURN_IF_EXCEPTION(scope, {}); + const auto& view = encodingString->view(lexicalGlobalObject); + return Bun::ERR::UNKNOWN_ENCODING(scope, lexicalGlobalObject, view); } encoding = encoded.value(); @@ -569,13 +574,15 @@ static inline JSC::EncodedJSValue jsBufferConstructorFunction_allocBody(JSC::JSG } } auto startPtr = uint8Array->typedVector() + start; - auto str_ = value.toWTFString(lexicalGlobalObject); - if (str_.isEmpty()) { + auto str_ = value.toString(lexicalGlobalObject); + RETURN_IF_EXCEPTION(scope, {}); + const auto& view = str_->view(lexicalGlobalObject); + if (view->isEmpty()) { memset(startPtr, 0, length); RELEASE_AND_RETURN(scope, JSC::JSValue::encode(uint8Array)); } - ZigString str = Zig::toZigString(str_); + ZigString str = Zig::toZigString(view); if (UNLIKELY(!Bun__Buffer_fill(&str, startPtr, end - start, encoding))) { throwTypeError(lexicalGlobalObject, scope, "Failed to decode value"_s); diff --git a/src/bun.js/bindings/JSBufferEncodingType.cpp b/src/bun.js/bindings/JSBufferEncodingType.cpp index 903ba94951..cd4efd318d 100644 --- a/src/bun.js/bindings/JSBufferEncodingType.cpp +++ b/src/bun.js/bindings/JSBufferEncodingType.cpp @@ -57,10 +57,16 @@ template<> std::optional parseEnumerationview(&lexicalGlobalObject); + return parseEnumeration2(lexicalGlobalObject, view); } -std::optional parseEnumeration2(JSGlobalObject& lexicalGlobalObject, WTF::String encoding) +std::optional parseEnumeration2(JSGlobalObject& lexicalGlobalObject, const WTF::StringView encoding) { // caller must check if value is a string switch (encoding.length()) { diff --git a/src/bun.js/bindings/JSBufferEncodingType.h b/src/bun.js/bindings/JSBufferEncodingType.h index f6e26116fa..e468b09cd1 100644 --- a/src/bun.js/bindings/JSBufferEncodingType.h +++ b/src/bun.js/bindings/JSBufferEncodingType.h @@ -8,7 +8,7 @@ String convertEnumerationToString(BufferEncodingType); template<> JSC::JSString* convertEnumerationToJS(JSC::JSGlobalObject&, BufferEncodingType); template<> std::optional parseEnumeration(JSC::JSGlobalObject&, JSValue); -std::optional parseEnumeration2(JSC::JSGlobalObject&, WTF::String); +std::optional parseEnumeration2(JSC::JSGlobalObject&, const WTF::StringView); template<> WTF::ASCIILiteral expectedEnumerationValues(); } // namespace WebCore diff --git a/src/bun.js/bindings/JSStringDecoder.cpp b/src/bun.js/bindings/JSStringDecoder.cpp index ff6a0c18c0..42c4aac1d7 100644 --- a/src/bun.js/bindings/JSStringDecoder.cpp +++ b/src/bun.js/bindings/JSStringDecoder.cpp @@ -571,9 +571,10 @@ JSC::EncodedJSValue JSStringDecoderConstructor::construct(JSC::JSGlobalObject* l if (opt.has_value()) { encoding = opt.value(); } else { - WTF::String encodingString = jsEncoding.toWTFString(lexicalGlobalObject); + auto* encodingString = jsEncoding.toString(lexicalGlobalObject); RETURN_IF_EXCEPTION(throwScope, {}); - return Bun::ERR::UNKNOWN_ENCODING(throwScope, lexicalGlobalObject, encodingString); + const auto& view = encodingString->view(lexicalGlobalObject); + return Bun::ERR::UNKNOWN_ENCODING(throwScope, lexicalGlobalObject, view); } } JSValue thisValue = callFrame->newTarget(); diff --git a/src/bun.js/bindings/NodeHTTP.cpp b/src/bun.js/bindings/NodeHTTP.cpp index 1bef336c82..943bfd8f7f 100644 --- a/src/bun.js/bindings/NodeHTTP.cpp +++ b/src/bun.js/bindings/NodeHTTP.cpp @@ -386,7 +386,10 @@ JSC_DEFINE_HOST_FUNCTION(jsHTTPGetHeader, (JSGlobalObject * globalObject, CallFr JSValue nameValue = callFrame->argument(1); if (nameValue.isString()) { FetchHeaders* impl = &headers->wrapped(); - String name = nameValue.toWTFString(globalObject); + JSString* nameString = nameValue.toString(globalObject); + RETURN_IF_EXCEPTION(scope, {}); + const auto name = nameString->view(globalObject); + RETURN_IF_EXCEPTION(scope, {}); if (WTF::equalIgnoringASCIICase(name, "set-cookie"_s)) { return fetchHeadersGetSetCookie(globalObject, vm, impl); } diff --git a/src/bun.js/bindings/URLSearchParams.cpp b/src/bun.js/bindings/URLSearchParams.cpp index 0b688b8be2..e8a15e5194 100644 --- a/src/bun.js/bindings/URLSearchParams.cpp +++ b/src/bun.js/bindings/URLSearchParams.cpp @@ -79,7 +79,7 @@ ExceptionOr> URLSearchParams::create(std::variant URLSearchParams::getAll(const String& name) const +Vector URLSearchParams::getAll(const StringView name) const { Vector values; values.reserveInitialCapacity(m_pairs.size()); @@ -150,7 +150,7 @@ Vector URLSearchParams::getAll(const String& name) const return values; } -void URLSearchParams::remove(const String& name, const String& value) +void URLSearchParams::remove(const StringView name, const String& value) { m_pairs.removeAllMatching([&](const auto& pair) { return pair.key == name && (value.isNull() || pair.value == value); diff --git a/src/bun.js/bindings/URLSearchParams.h b/src/bun.js/bindings/URLSearchParams.h index a8744053e5..2bc00cb590 100644 --- a/src/bun.js/bindings/URLSearchParams.h +++ b/src/bun.js/bindings/URLSearchParams.h @@ -47,10 +47,10 @@ public: } void append(const String& name, const String& value); - void remove(const String& name, const String& value = {}); - String get(const String& name) const; - Vector getAll(const String& name) const; - bool has(const String& name, const String& value = {}) const; + void remove(const StringView name, const String& value = {}); + String get(const StringView name) const; + Vector getAll(const StringView name) const; + bool has(const StringView name, const String& value = {}) const; void set(const String& name, const String& value); String toString() const; void updateFromAssociatedURL(); diff --git a/src/bun.js/bindings/ZigGlobalObject.cpp b/src/bun.js/bindings/ZigGlobalObject.cpp index dcb2a251bb..e718a28527 100644 --- a/src/bun.js/bindings/ZigGlobalObject.cpp +++ b/src/bun.js/bindings/ZigGlobalObject.cpp @@ -297,7 +297,7 @@ static JSValue formatStackTraceToJSValue(JSC::VM& vm, Zig::GlobalObject* globalO auto* str = errorMessage.toString(lexicalGlobalObject); RETURN_IF_EXCEPTION(scope, {}); if (str->length() > 0) { - auto value = str->value(lexicalGlobalObject); + auto value = str->view(lexicalGlobalObject); RETURN_IF_EXCEPTION(scope, {}); sb.append("Error: "_s); sb.append(value.data); diff --git a/src/bun.js/bindings/helpers.h b/src/bun.js/bindings/helpers.h index cf5a5e875f..cabb787ce1 100644 --- a/src/bun.js/bindings/helpers.h +++ b/src/bun.js/bindings/helpers.h @@ -251,11 +251,18 @@ static ZigString toZigString(const WTF::StringView& str) static ZigString toZigString(JSC::JSString& str, JSC::JSGlobalObject* global) { + if (str.isSubstring()) { + return toZigString(str.view(global)); + } + return toZigString(str.value(global)); } static ZigString toZigString(JSC::JSString* str, JSC::JSGlobalObject* global) { + if (str->isSubstring()) { + return toZigString(str->view(global)); + } return toZigString(str->value(global)); } @@ -283,7 +290,7 @@ static void throwException(JSC::ThrowScope& scope, ZigErrorType err, JSC::JSGlob static ZigString toZigString(JSC::JSValue val, JSC::JSGlobalObject* global) { auto scope = DECLARE_THROW_SCOPE(global->vm()); - WTF::String str = val.toWTFString(global); + auto* str = val.toString(global); if (scope.exception()) { scope.clearException(); @@ -291,9 +298,14 @@ static ZigString toZigString(JSC::JSValue val, JSC::JSGlobalObject* global) return ZigStringEmpty; } - scope.release(); + auto view = str->view(global); + if (scope.exception()) { + scope.clearException(); + scope.release(); + return ZigStringEmpty; + } - return toZigString(str); + return toZigString(view); } static const WTF::String toStringStatic(ZigString str) diff --git a/src/bun.js/bindings/webcore/FetchHeaders.cpp b/src/bun.js/bindings/webcore/FetchHeaders.cpp index f50fdc8923..a6b64d5cd1 100644 --- a/src/bun.js/bindings/webcore/FetchHeaders.cpp +++ b/src/bun.js/bindings/webcore/FetchHeaders.cpp @@ -205,7 +205,7 @@ ExceptionOr FetchHeaders::append(const String& name, const String& value) } // https://fetch.spec.whatwg.org/#dom-headers-delete -ExceptionOr FetchHeaders::remove(const String& name) +ExceptionOr FetchHeaders::remove(const StringView name) { if (!isValidHTTPToken(name)) return Exception { TypeError, makeString("Invalid header name: '"_s, name, "'"_s) }; @@ -232,14 +232,14 @@ size_t FetchHeaders::memoryCost() const return m_headers.memoryCost() + sizeof(*this); } -ExceptionOr FetchHeaders::get(const String& name) const +ExceptionOr FetchHeaders::get(const StringView name) const { if (!isValidHTTPToken(name)) return Exception { TypeError, makeString("Invalid header name: '"_s, name, "'"_s) }; return m_headers.get(name); } -ExceptionOr FetchHeaders::has(const String& name) const +ExceptionOr FetchHeaders::has(const StringView name) const { if (!isValidHTTPToken(name)) return Exception { TypeError, makeString("Invalid header name: '"_s, name, '"') }; diff --git a/src/bun.js/bindings/webcore/FetchHeaders.h b/src/bun.js/bindings/webcore/FetchHeaders.h index e28db4f966..eac56928c7 100644 --- a/src/bun.js/bindings/webcore/FetchHeaders.h +++ b/src/bun.js/bindings/webcore/FetchHeaders.h @@ -59,9 +59,9 @@ public: static Ref create(const FetchHeaders& headers) { return adoptRef(*new FetchHeaders { headers }); } ExceptionOr append(const String& name, const String& value); - ExceptionOr remove(const String&); - ExceptionOr get(const String&) const; - ExceptionOr has(const String&) const; + ExceptionOr remove(const StringView); + ExceptionOr get(const StringView) const; + ExceptionOr has(const StringView) const; ExceptionOr set(const String& name, const String& value); ExceptionOr set(const HTTPHeaderName name, const String& value); diff --git a/src/bun.js/bindings/webcore/HTTPHeaderMap.cpp b/src/bun.js/bindings/webcore/HTTPHeaderMap.cpp index 577485117b..65330b5af5 100644 --- a/src/bun.js/bindings/webcore/HTTPHeaderMap.cpp +++ b/src/bun.js/bindings/webcore/HTTPHeaderMap.cpp @@ -68,7 +68,7 @@ HTTPHeaderMap HTTPHeaderMap::isolatedCopy() && return map; } -String HTTPHeaderMap::get(const String& name) const +String HTTPHeaderMap::get(const StringView name) const { HTTPHeaderName headerName; if (findHTTPHeaderName(name, headerName)) @@ -96,7 +96,7 @@ size_t HTTPHeaderMap::memoryCost() const return cost; } -String HTTPHeaderMap::getUncommonHeader(const String& name) const +String HTTPHeaderMap::getUncommonHeader(const StringView name) const { auto index = m_uncommonHeaders.findIf([&](auto& header) { return equalIgnoringASCIICase(header.key, name); @@ -201,7 +201,7 @@ bool HTTPHeaderMap::addIfNotPresent(HTTPHeaderName headerName, const String& val return true; } -bool HTTPHeaderMap::contains(const String& name) const +bool HTTPHeaderMap::contains(const StringView name) const { HTTPHeaderName headerName; if (findHTTPHeaderName(name, headerName)) @@ -212,7 +212,7 @@ bool HTTPHeaderMap::contains(const String& name) const }) != notFound; } -bool HTTPHeaderMap::remove(const String& name) +bool HTTPHeaderMap::remove(const StringView name) { HTTPHeaderName headerName; diff --git a/src/bun.js/bindings/webcore/HTTPHeaderMap.h b/src/bun.js/bindings/webcore/HTTPHeaderMap.h index 589d2945cf..bbc28eedf0 100644 --- a/src/bun.js/bindings/webcore/HTTPHeaderMap.h +++ b/src/bun.js/bindings/webcore/HTTPHeaderMap.h @@ -182,13 +182,13 @@ public: m_uncommonHeaders.shrinkToFit(); } - WEBCORE_EXPORT String get(const String &name) const; + WEBCORE_EXPORT String get(const StringView name) const; WEBCORE_EXPORT void set(const String &name, const String &value); WEBCORE_EXPORT void add(const String &name, const String &value); WEBCORE_EXPORT void append(const String &name, const String &value); - WEBCORE_EXPORT bool contains(const String &) const; - WEBCORE_EXPORT int64_t indexOf(String &name) const; - WEBCORE_EXPORT bool remove(const String &); + WEBCORE_EXPORT bool contains(const StringView) const; + WEBCORE_EXPORT int64_t indexOf(StringView name) const; + WEBCORE_EXPORT bool remove(const StringView); WEBCORE_EXPORT String getIndex(HeaderIndex index) const; WEBCORE_EXPORT bool setIndex(HeaderIndex index, const String &value); @@ -265,7 +265,7 @@ public: void setUncommonHeaderCloneName(const StringView name, const String &value); private: - WEBCORE_EXPORT String getUncommonHeader(const String &name) const; + WEBCORE_EXPORT String getUncommonHeader(const StringView name) const; CommonHeadersVector m_commonHeaders; UncommonHeadersVector m_uncommonHeaders; diff --git a/src/bun.js/bindings/webcore/HTTPHeaderNames.cpp b/src/bun.js/bindings/webcore/HTTPHeaderNames.cpp index 2c548b6a01..8b36ed87cb 100644 --- a/src/bun.js/bindings/webcore/HTTPHeaderNames.cpp +++ b/src/bun.js/bindings/webcore/HTTPHeaderNames.cpp @@ -655,7 +655,7 @@ HTTPHeaderNamesHash::findHeaderNameImpl(const char* str, size_t len) } #line 253 "HTTPHeaderNames.gperf" -bool findHTTPHeaderName(StringView stringView, HTTPHeaderName& headerName) +bool findHTTPHeaderName(const StringView stringView, HTTPHeaderName& headerName) { unsigned length = stringView.length(); if (length > maxHTTPHeaderNameLength || length < minHTTPHeaderNameLength) diff --git a/src/bun.js/bindings/webcore/HTTPHeaderNames.h b/src/bun.js/bindings/webcore/HTTPHeaderNames.h index 42db45a00f..4f7575e283 100644 --- a/src/bun.js/bindings/webcore/HTTPHeaderNames.h +++ b/src/bun.js/bindings/webcore/HTTPHeaderNames.h @@ -132,7 +132,7 @@ const unsigned numHTTPHeaderNames = 93; const size_t minHTTPHeaderNameLength = 2; const size_t maxHTTPHeaderNameLength = 40; -bool findHTTPHeaderName(StringView, HTTPHeaderName&); +bool findHTTPHeaderName(const StringView, HTTPHeaderName&); WEBCORE_EXPORT StringView httpHeaderNameString(HTTPHeaderName); } // namespace WebCore diff --git a/src/bun.js/bindings/webcore/HTTPParsers.cpp b/src/bun.js/bindings/webcore/HTTPParsers.cpp index 2bef4f365e..7318ce5914 100644 --- a/src/bun.js/bindings/webcore/HTTPParsers.cpp +++ b/src/bun.js/bindings/webcore/HTTPParsers.cpp @@ -193,7 +193,7 @@ bool isValidLanguageHeaderValue(const String& value) } // See RFC 7230, Section 3.2.6. -bool isValidHTTPToken(StringView value) +bool isValidHTTPToken(const StringView value) { if (value.isEmpty()) return false; @@ -215,11 +215,6 @@ bool isValidHTTPToken(StringView value) return true; } -bool isValidHTTPToken(const String& value) -{ - return isValidHTTPToken(StringView(value)); -} - #if USE(GLIB) // True if the character at the given position satisifies a predicate, incrementing "pos" by one. // Note: Might return pos == str.length() @@ -817,18 +812,18 @@ size_t parseHTTPRequestBody(const uint8_t* data, size_t length, Vector& } // Implements . -bool isForbiddenHeaderName(const String& name) +bool isForbiddenHeaderName(const StringView name) { return false; } -bool isForbiddenHeader(const String& name, StringView value) +bool isForbiddenHeader(const StringView name, StringView value) { return false; } // Implements . -bool isNoCORSSafelistedRequestHeaderName(const String& name) +bool isNoCORSSafelistedRequestHeaderName(const StringView name) { HTTPHeaderName headerName; if (findHTTPHeaderName(name, headerName)) { @@ -846,27 +841,27 @@ bool isNoCORSSafelistedRequestHeaderName(const String& name) } // Implements . -bool isPriviledgedNoCORSRequestHeaderName(const String& name) +bool isPriviledgedNoCORSRequestHeaderName(const StringView name) { return false; // return equalLettersIgnoringASCIICase(name, "range"_s); } // Implements . -bool isForbiddenResponseHeaderName(const String& name) +bool isForbiddenResponseHeaderName(const StringView name) { return false; // return equalLettersIgnoringASCIICase(name, "set-cookie"_s) || equalLettersIgnoringASCIICase(name, "set-cookie2"_s); } // Implements . -bool isForbiddenMethod(StringView name) +bool isForbiddenMethod(const StringView name) { // return equalLettersIgnoringASCIICase(name, "connect"_s) || equalLettersIgnoringASCIICase(name, "trace"_s) || equalLettersIgnoringASCIICase(name, "track"_s); return false; } -bool isSimpleHeader(const String& name, const String& value) +bool isSimpleHeader(const StringView name, const StringView value) { HTTPHeaderName headerName; return !findHTTPHeaderName(name, headerName); diff --git a/src/bun.js/bindings/webcore/HTTPParsers.h b/src/bun.js/bindings/webcore/HTTPParsers.h index bf56caccb1..05c9aebc55 100644 --- a/src/bun.js/bindings/webcore/HTTPParsers.h +++ b/src/bun.js/bindings/webcore/HTTPParsers.h @@ -80,8 +80,7 @@ bool isValidLanguageHeaderValue(const String&); #if USE(GLIB) WEBCORE_EXPORT bool isValidUserAgentHeaderValue(const String&); #endif -bool isValidHTTPToken(const String&); -bool isValidHTTPToken(StringView); +bool isValidHTTPToken(const StringView); std::optional parseHTTPDate(const String&); StringView filenameFromHTTPContentDisposition(StringView); WEBCORE_EXPORT String extractMIMETypeFromMediaType(const String&); @@ -101,15 +100,15 @@ size_t parseHTTPHeader(const uint8_t* data, size_t length, String& failureReason size_t parseHTTPRequestBody(const uint8_t* data, size_t length, Vector& body); // HTTP Header routine as per https://fetch.spec.whatwg.org/#terminology-headers -bool isForbiddenHeaderName(const String&); -bool isNoCORSSafelistedRequestHeaderName(const String&); -bool isPriviledgedNoCORSRequestHeaderName(const String&); -bool isForbiddenResponseHeaderName(const String&); -bool isForbiddenMethod(const String&); -bool isSimpleHeader(const String& name, const String& value); +bool isForbiddenHeaderName(const StringView); +bool isNoCORSSafelistedRequestHeaderName(const StringView); +bool isPriviledgedNoCORSRequestHeaderName(const StringView); +bool isForbiddenResponseHeaderName(const StringView); +bool isForbiddenMethod(const StringView); +bool isSimpleHeader(const StringView name, const StringView value); // bool isCrossOriginSafeHeader(HTTPHeaderName, const HTTPHeaderSet&); // bool isCrossOriginSafeHeader(const String&, const HTTPHeaderSet&); -bool isCrossOriginSafeRequestHeader(HTTPHeaderName, const String&); +bool isCrossOriginSafeRequestHeader(HTTPHeaderName, const StringView); String normalizeHTTPMethod(const String&); bool isSafeMethod(const String&); diff --git a/src/bun.js/bindings/webcore/JSDOMFormData.cpp b/src/bun.js/bindings/webcore/JSDOMFormData.cpp index 92bb50c8cf..1ddee5427b 100644 --- a/src/bun.js/bindings/webcore/JSDOMFormData.cpp +++ b/src/bun.js/bindings/webcore/JSDOMFormData.cpp @@ -373,9 +373,11 @@ static inline JSC::EncodedJSValue jsDOMFormDataPrototypeFunction_getBody(JSC::JS if (UNLIKELY(callFrame->argumentCount() < 1)) return throwVMError(lexicalGlobalObject, throwScope, createNotEnoughArgumentsError(lexicalGlobalObject)); EnsureStillAliveScope argument0 = callFrame->uncheckedArgument(0); - auto name = convert(*lexicalGlobalObject, argument0.value()); + auto* nameStr = argument0.value().toString(lexicalGlobalObject); RETURN_IF_EXCEPTION(throwScope, {}); - RELEASE_AND_RETURN(throwScope, JSValue::encode(toJS>>>(*lexicalGlobalObject, *castedThis->globalObject(), throwScope, impl.get(WTFMove(name))))); + auto name = nameStr->view(lexicalGlobalObject); + RETURN_IF_EXCEPTION(throwScope, {}); + RELEASE_AND_RETURN(throwScope, JSValue::encode(toJS>>>(*lexicalGlobalObject, *castedThis->globalObject(), throwScope, impl.get(name)))); } JSC_DEFINE_HOST_FUNCTION(jsDOMFormDataPrototypeFunction_get, (JSGlobalObject * lexicalGlobalObject, CallFrame* callFrame)) @@ -393,9 +395,11 @@ static inline JSC::EncodedJSValue jsDOMFormDataPrototypeFunction_getAllBody(JSC: if (UNLIKELY(callFrame->argumentCount() < 1)) return throwVMError(lexicalGlobalObject, throwScope, createNotEnoughArgumentsError(lexicalGlobalObject)); EnsureStillAliveScope argument0 = callFrame->uncheckedArgument(0); - auto name = convert(*lexicalGlobalObject, argument0.value()); + auto* nameStr = argument0.value().toString(lexicalGlobalObject); RETURN_IF_EXCEPTION(throwScope, {}); - auto entries = impl.getAll(WTFMove(name)); + auto name = nameStr->view(lexicalGlobalObject); + RETURN_IF_EXCEPTION(throwScope, {}); + auto entries = impl.getAll(name); JSC::JSArray* result = JSC::constructEmptyArray(lexicalGlobalObject, nullptr, 0); for (auto entry : entries) { if (auto string = std::get_if(&entry)) { diff --git a/src/bun.js/bindings/webcore/JSFetchHeaders.cpp b/src/bun.js/bindings/webcore/JSFetchHeaders.cpp index 8a57ca1908..c2d42fc86d 100644 --- a/src/bun.js/bindings/webcore/JSFetchHeaders.cpp +++ b/src/bun.js/bindings/webcore/JSFetchHeaders.cpp @@ -210,11 +210,13 @@ JSC_DEFINE_HOST_FUNCTION(jsFetchHeadersPrototypeFunction_getAll, (JSGlobalObject return {}; } - auto name = convert(*lexicalGlobalObject, callFrame->uncheckedArgument(0)); + auto* nameStr = callFrame->uncheckedArgument(0).toString(lexicalGlobalObject); + RETURN_IF_EXCEPTION(scope, {}); + auto name = nameStr->view(lexicalGlobalObject); RETURN_IF_EXCEPTION(scope, {}); auto& impl = castedThis->wrapped(); - if (name.length() != "set-cookie"_s.length() || name.convertToASCIILowercase() != "set-cookie"_s) { + if (name->length() != "set-cookie"_s.length() || name->convertToASCIILowercase() != "set-cookie"_s) { throwTypeError(lexicalGlobalObject, scope, "Only \"set-cookie\" is supported."_s); } @@ -429,9 +431,11 @@ static inline JSC::EncodedJSValue jsFetchHeadersPrototypeFunction_deleteBody(JSC if (UNLIKELY(callFrame->argumentCount() < 1)) return throwVMError(lexicalGlobalObject, throwScope, createNotEnoughArgumentsError(lexicalGlobalObject)); EnsureStillAliveScope argument0 = callFrame->uncheckedArgument(0); - auto name = convert(*lexicalGlobalObject, argument0.value()); + auto* nameString = argument0.value().toString(lexicalGlobalObject); RETURN_IF_EXCEPTION(throwScope, {}); - RELEASE_AND_RETURN(throwScope, JSValue::encode(toJS(*lexicalGlobalObject, throwScope, [&]() -> decltype(auto) { return impl.remove(WTFMove(name)); }))); + const auto name = nameString->view(lexicalGlobalObject); + RETURN_IF_EXCEPTION(throwScope, {}); + RELEASE_AND_RETURN(throwScope, JSValue::encode(toJS(*lexicalGlobalObject, throwScope, [&]() -> decltype(auto) { return impl.remove(name); }))); } JSC_DEFINE_HOST_FUNCTION(jsFetchHeadersPrototypeFunction_delete, (JSGlobalObject * lexicalGlobalObject, CallFrame* callFrame)) @@ -449,9 +453,11 @@ static inline JSC::EncodedJSValue jsFetchHeadersPrototypeFunction_getBody(JSC::J if (UNLIKELY(callFrame->argumentCount() < 1)) return throwVMError(lexicalGlobalObject, throwScope, createNotEnoughArgumentsError(lexicalGlobalObject)); EnsureStillAliveScope argument0 = callFrame->uncheckedArgument(0); - auto name = convert(*lexicalGlobalObject, argument0.value()); + auto* nameString = argument0.value().toString(lexicalGlobalObject); RETURN_IF_EXCEPTION(throwScope, {}); - RELEASE_AND_RETURN(throwScope, JSValue::encode(toJS>(*lexicalGlobalObject, throwScope, impl.get(WTFMove(name))))); + const auto name = nameString->view(lexicalGlobalObject); + RETURN_IF_EXCEPTION(throwScope, {}); + RELEASE_AND_RETURN(throwScope, JSValue::encode(toJS>(*lexicalGlobalObject, throwScope, impl.get(name)))); } JSC_DEFINE_HOST_FUNCTION(jsFetchHeadersPrototypeFunction_get, (JSGlobalObject * lexicalGlobalObject, CallFrame* callFrame)) @@ -469,9 +475,11 @@ static inline JSC::EncodedJSValue jsFetchHeadersPrototypeFunction_hasBody(JSC::J if (UNLIKELY(callFrame->argumentCount() < 1)) return throwVMError(lexicalGlobalObject, throwScope, createNotEnoughArgumentsError(lexicalGlobalObject)); EnsureStillAliveScope argument0 = callFrame->uncheckedArgument(0); - auto name = convert(*lexicalGlobalObject, argument0.value()); + auto* nameString = argument0.value().toString(lexicalGlobalObject); RETURN_IF_EXCEPTION(throwScope, {}); - RELEASE_AND_RETURN(throwScope, JSValue::encode(toJS(*lexicalGlobalObject, throwScope, impl.has(WTFMove(name))))); + const auto name = nameString->view(lexicalGlobalObject); + RETURN_IF_EXCEPTION(throwScope, {}); + RELEASE_AND_RETURN(throwScope, JSValue::encode(toJS(*lexicalGlobalObject, throwScope, impl.has(name)))); } JSC_DEFINE_HOST_FUNCTION(jsFetchHeadersPrototypeFunction_has, (JSGlobalObject * lexicalGlobalObject, CallFrame* callFrame)) diff --git a/src/bun.js/bindings/webcore/JSTextEncoder.cpp b/src/bun.js/bindings/webcore/JSTextEncoder.cpp index e8264a7319..e33bf367ed 100644 --- a/src/bun.js/bindings/webcore/JSTextEncoder.cpp +++ b/src/bun.js/bindings/webcore/JSTextEncoder.cpp @@ -19,6 +19,7 @@ */ #include "root.h" +#include "JavaScriptCore/ExceptionScope.h" #include "JSTextEncoder.h" @@ -384,7 +385,7 @@ static inline JSC::EncodedJSValue jsTextEncoderPrototypeFunction_encodeBody(JSC: } JSC::JSString* input = argument0.value().toStringOrNull(lexicalGlobalObject); JSC::EncodedJSValue res; - String str; + StringView str; if (input->is8Bit()) { if (input->isRope()) { GCDeferralContext gcDeferralContext(vm); @@ -392,15 +393,21 @@ static inline JSC::EncodedJSValue jsTextEncoderPrototypeFunction_encodeBody(JSC: if (!JSC::JSValue::decode(encodedValue).isUndefined()) { RELEASE_AND_RETURN(throwScope, encodedValue); } + + RETURN_IF_EXCEPTION(throwScope, {}); } - str = input->value(lexicalGlobalObject); + str = input->view(lexicalGlobalObject); + RETURN_IF_EXCEPTION(throwScope, {}); res = TextEncoder__encode8(lexicalGlobalObject, str.span8().data(), str.length()); } else { - str = input->value(lexicalGlobalObject); + str = input->view(lexicalGlobalObject); + RETURN_IF_EXCEPTION(throwScope, {}); res = TextEncoder__encode16(lexicalGlobalObject, str.span16().data(), str.length()); } + RETURN_IF_EXCEPTION(throwScope, {}); + if (UNLIKELY(JSC::JSValue::decode(res).isObject() && JSC::JSValue::decode(res).getObject()->isErrorInstance())) { throwScope.throwException(lexicalGlobalObject, JSC::JSValue::decode(res)); return {}; diff --git a/src/bun.js/bindings/webcore/JSURLSearchParams.cpp b/src/bun.js/bindings/webcore/JSURLSearchParams.cpp index a938234a4a..674d076eff 100644 --- a/src/bun.js/bindings/webcore/JSURLSearchParams.cpp +++ b/src/bun.js/bindings/webcore/JSURLSearchParams.cpp @@ -305,9 +305,11 @@ static inline JSC::EncodedJSValue jsURLSearchParamsPrototypeFunction_getBody(JSC if (UNLIKELY(callFrame->argumentCount() < 1)) return throwVMError(lexicalGlobalObject, throwScope, createNotEnoughArgumentsError(lexicalGlobalObject)); EnsureStillAliveScope argument0 = callFrame->uncheckedArgument(0); - auto name = convert(*lexicalGlobalObject, argument0.value()); + auto* nameString = argument0.value().toString(lexicalGlobalObject); RETURN_IF_EXCEPTION(throwScope, {}); - RELEASE_AND_RETURN(throwScope, JSValue::encode(toJS>(*lexicalGlobalObject, throwScope, impl.get(WTFMove(name))))); + const auto name = nameString->view(lexicalGlobalObject); + RETURN_IF_EXCEPTION(throwScope, {}); + RELEASE_AND_RETURN(throwScope, JSValue::encode(toJS>(*lexicalGlobalObject, throwScope, impl.get(name)))); } JSC_DEFINE_HOST_FUNCTION(jsURLSearchParamsPrototypeFunction_get, (JSGlobalObject * lexicalGlobalObject, CallFrame* callFrame)) @@ -325,9 +327,11 @@ static inline JSC::EncodedJSValue jsURLSearchParamsPrototypeFunction_getAllBody( if (UNLIKELY(callFrame->argumentCount() < 1)) return throwVMError(lexicalGlobalObject, throwScope, createNotEnoughArgumentsError(lexicalGlobalObject)); EnsureStillAliveScope argument0 = callFrame->uncheckedArgument(0); - auto name = convert(*lexicalGlobalObject, argument0.value()); + auto* nameString = argument0.value().toString(lexicalGlobalObject); RETURN_IF_EXCEPTION(throwScope, {}); - RELEASE_AND_RETURN(throwScope, JSValue::encode(toJS>(*lexicalGlobalObject, *castedThis->globalObject(), throwScope, impl.getAll(WTFMove(name))))); + const auto name = nameString->view(lexicalGlobalObject); + RETURN_IF_EXCEPTION(throwScope, {}); + RELEASE_AND_RETURN(throwScope, JSValue::encode(toJS>(*lexicalGlobalObject, *castedThis->globalObject(), throwScope, impl.getAll(name)))); } JSC_DEFINE_HOST_FUNCTION(jsURLSearchParamsPrototypeFunction_getAll, (JSGlobalObject * lexicalGlobalObject, CallFrame* callFrame)) @@ -345,7 +349,9 @@ static inline JSC::EncodedJSValue jsURLSearchParamsPrototypeFunction_hasBody(JSC if (UNLIKELY(callFrame->argumentCount() < 1)) return throwVMError(lexicalGlobalObject, throwScope, createNotEnoughArgumentsError(lexicalGlobalObject)); EnsureStillAliveScope argument0 = callFrame->uncheckedArgument(0); - auto name = convert(*lexicalGlobalObject, argument0.value()); + auto* nameString = argument0.value().toString(lexicalGlobalObject); + RETURN_IF_EXCEPTION(throwScope, {}); + const auto name = nameString->view(lexicalGlobalObject); RETURN_IF_EXCEPTION(throwScope, {}); String value; @@ -355,7 +361,7 @@ static inline JSC::EncodedJSValue jsURLSearchParamsPrototypeFunction_hasBody(JSC RETURN_IF_EXCEPTION(throwScope, {}); } - RELEASE_AND_RETURN(throwScope, JSValue::encode(toJS(*lexicalGlobalObject, throwScope, impl.has(WTFMove(name), WTFMove(value))))); + RELEASE_AND_RETURN(throwScope, JSValue::encode(toJS(*lexicalGlobalObject, throwScope, impl.has(name, WTFMove(value))))); } JSC_DEFINE_HOST_FUNCTION(jsURLSearchParamsPrototypeFunction_has, (JSGlobalObject * lexicalGlobalObject, CallFrame* callFrame))