From f29f4fec9c9763057528ee1565df8474db6d8c4a Mon Sep 17 00:00:00 2001 From: Yagiz Nizipli Date: Mon, 30 Sep 2024 21:18:32 -0400 Subject: [PATCH] improve stringwrapper bytestring unwrap --- src/workerd/jsg/value.h | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/src/workerd/jsg/value.h b/src/workerd/jsg/value.h index a71a0947747..139c397d919 100644 --- a/src/workerd/jsg/value.h +++ b/src/workerd/jsg/value.h @@ -468,18 +468,19 @@ class StringWrapper { kj::Maybe> parentObject) { // TODO(cleanup): Move to a HeaderStringWrapper in the api directory. v8::Local str = check(handle->ToString(context)); - auto result = - ByteString(KJ_ASSERT_NONNULL(tryUnwrap(context, str, (kj::String*)nullptr, parentObject))); - if (str->ContainsOnlyOneByte()) { - auto buf = kj::heapArray(str->Length() + 1); - str->WriteOneByte(context->GetIsolate(), buf.begin()); - for (auto b: buf) { - if (b >= 128) { - result.warning = ByteString::Warning::CONTAINS_EXTENDED_ASCII; - break; - } - } + auto result = ByteString(KJ_ASSERT_NONNULL( + tryUnwrap(context, str, static_cast(nullptr), parentObject))); + + v8::String::ValueView str_view(context->GetIsolate(), str); + + if (str_view.is_one_byte()) [[likely]] { + // Storage is one-byte. We don't need to scan. + } else if (str->ContainsOnlyOneByte()) { + // Storage is two-byte, but it contains only one byte. + // No need to scan the string for extended ascii. + result.warning = ByteString::Warning::CONTAINS_EXTENDED_ASCII; } else { + // Storage is two-bytes, and it doesn't contain "only one-bytes" result.warning = ByteString::Warning::CONTAINS_UNICODE; } return kj::mv(result);