// Copyright 2020 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "src/heap/off-thread-factory.h" #include "src/common/globals.h" #include "src/handles/handles.h" #include "src/numbers/hash-seed-inl.h" #include "src/objects/fixed-array.h" #include "src/objects/heap-object.h" #include "src/objects/string.h" #include "src/roots/roots-inl.h" #include "src/strings/string-hasher.h" namespace v8 { namespace internal { OffThreadFactory::OffThreadFactory(Isolate* isolate) : roots_(isolate) {} // Hacky method for creating a simple object with a slot pointing to a string. // TODO(leszeks): Remove once we have full FixedArray support. Handle<FixedArray> OffThreadFactory::StringWrapperForTest( Handle<String> string) { HeapObject wrapper = AllocateRaw(FixedArray::SizeFor(1), AllocationType::kOld); wrapper.set_map_after_allocation(read_only_roots().fixed_array_map()); FixedArray array = FixedArray::cast(wrapper); array.set_length(1); array.data_start().Relaxed_Store(*string); return handle(array, isolate()); } Handle<String> OffThreadFactory::MakeOrFindTwoCharacterString(uint16_t c1, uint16_t c2) { // TODO(leszeks): Do some real caching here. Also, these strings should be // internalized. if ((c1 | c2) <= unibrow::Latin1::kMaxChar) { Handle<SeqOneByteString> ret = NewRawOneByteString(2, AllocationType::kOld).ToHandleChecked(); ret->SeqOneByteStringSet(0, c1); ret->SeqOneByteStringSet(1, c2); return ret; } Handle<SeqTwoByteString> ret = NewRawTwoByteString(2, AllocationType::kOld).ToHandleChecked(); ret->SeqTwoByteStringSet(0, c1); ret->SeqTwoByteStringSet(1, c2); return ret; } Handle<String> OffThreadFactory::InternalizeString( const Vector<const uint8_t>& string) { uint32_t hash = StringHasher::HashSequentialString( string.begin(), string.length(), HashSeed(read_only_roots())); return NewOneByteInternalizedString(string, hash); } Handle<String> OffThreadFactory::InternalizeString( const Vector<const uint16_t>& string) { uint32_t hash = StringHasher::HashSequentialString( string.begin(), string.length(), HashSeed(read_only_roots())); return NewTwoByteInternalizedString(string, hash); } void OffThreadFactory::AddToScriptList(Handle<Script> shared) { isolate()->heap()->AddToScriptList(shared); } HeapObject OffThreadFactory::AllocateRaw(int size, AllocationType allocation, AllocationAlignment alignment) { return isolate()->heap()->AllocateRaw(size, allocation, alignment); } } // namespace internal } // namespace v8