[web snapshot] Support web snapshot magic when the source string is two byte
Bug: v8:11525 Change-Id: I28548c4eddcc7764be950950e16ac30b12ac8cdd Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3297890 Reviewed-by: Camillo Bruni <cbruni@chromium.org> Reviewed-by: Leszek Swirski <leszeks@chromium.org> Commit-Queue: Marja Hölttä <marja@chromium.org> Cr-Commit-Position: refs/heads/main@{#78061}
This commit is contained in:
parent
f2ceaf9066
commit
1efe967bcb
@ -2804,7 +2804,8 @@ MaybeHandle<SharedFunctionInfo> GetSharedFunctionInfoForScriptImpl(
|
||||
|
||||
if (V8_UNLIKELY(
|
||||
i::FLAG_experimental_web_snapshots &&
|
||||
(source->IsExternalOneByteString() || source->IsSeqOneByteString()) &&
|
||||
(source->IsExternalOneByteString() || source->IsSeqOneByteString() ||
|
||||
source->IsExternalTwoByteString() || source->IsSeqTwoByteString()) &&
|
||||
source_length > 4)) {
|
||||
// Experimental: Treat the script as a web snapshot if it starts with the
|
||||
// magic byte sequence. TODO(v8:11525): Remove this once proper embedder
|
||||
|
@ -973,6 +973,39 @@ bool WebSnapshotDeserializer::UseWebSnapshot(
|
||||
deserializer_.reset(
|
||||
new ValueDeserializer(isolate_, data_copy.get(), length));
|
||||
return Deserialize();
|
||||
} else if (source->IsExternalTwoByteString()) {
|
||||
// TODO(v8:11525): Implement end-to-end snapshot processing which gets rid
|
||||
// of the need to copy the data here.
|
||||
const v8::String::ExternalStringResource* resource =
|
||||
ExternalTwoByteString::cast(*source).resource();
|
||||
auto length = resource->length();
|
||||
std::unique_ptr<uint8_t[]> data_copy(new uint8_t[length]);
|
||||
{
|
||||
DisallowGarbageCollection no_gc;
|
||||
const uint16_t* data = resource->data();
|
||||
uint8_t* data_copy_ptr = data_copy.get();
|
||||
for (size_t i = 0; i < length; ++i) {
|
||||
data_copy_ptr[i] = static_cast<uint8_t>(data[i]);
|
||||
}
|
||||
}
|
||||
deserializer_.reset(
|
||||
new ValueDeserializer(isolate_, data_copy.get(), length));
|
||||
return Deserialize();
|
||||
} else if (source->IsSeqTwoByteString()) {
|
||||
SeqTwoByteString source_as_seq = SeqTwoByteString::cast(*source);
|
||||
auto length = source_as_seq.length();
|
||||
std::unique_ptr<uint8_t[]> data_copy(new uint8_t[length]);
|
||||
{
|
||||
DisallowGarbageCollection no_gc;
|
||||
uint16_t* data = source_as_seq.GetChars(no_gc);
|
||||
uint8_t* data_copy_ptr = data_copy.get();
|
||||
for (int i = 0; i < length; ++i) {
|
||||
data_copy_ptr[i] = static_cast<uint8_t>(data[i]);
|
||||
}
|
||||
}
|
||||
deserializer_.reset(
|
||||
new ValueDeserializer(isolate_, data_copy.get(), length));
|
||||
return Deserialize();
|
||||
}
|
||||
UNREACHABLE();
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user