blob: df9b0f4ff075556392f7af46d49afd6fb519991e [file] [log] [blame]
// Copyright 2019 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.
@abstract
@generateCppClass
@reserveBitsInInstanceType(6)
extern class String extends Name {
const length: int32;
}
@generateCppClass
@generateBodyDescriptor
@doNotGenerateCast
extern class ConsString extends String {
first: String;
second: String;
}
@abstract
@generateBodyDescriptor
@doNotGenerateCast
extern class ExternalString extends String {
resource: ExternalPointer;
resource_data: ExternalPointer;
}
extern operator '.resource_ptr' macro LoadExternalStringResourcePtr(
ExternalString): RawPtr;
extern operator '.resource_data_ptr' macro LoadExternalStringResourceDataPtr(
ExternalString): RawPtr;
@doNotGenerateCast
extern class ExternalOneByteString extends ExternalString {
}
@doNotGenerateCast
extern class ExternalTwoByteString extends ExternalString {
}
@generateCppClass
@doNotGenerateCast
extern class InternalizedString extends String {
}
@abstract
@generateCppClass
@doNotGenerateCast
extern class SeqString extends String {
}
@generateCppClass
@generateBodyDescriptor
@doNotGenerateCast
extern class SeqOneByteString extends SeqString {
chars[length]: char8;
}
@generateCppClass
@generateBodyDescriptor
@doNotGenerateCast
extern class SeqTwoByteString extends SeqString {
chars[length]: char16;
}
@generateCppClass
@generateBodyDescriptor
@doNotGenerateCast
extern class SlicedString extends String {
parent: String;
offset: Smi;
}
@generateCppClass
@generateBodyDescriptor
@doNotGenerateCast
extern class ThinString extends String {
actual: String;
}
// A direct string can be accessed directly through CSA without going into the
// C++ runtime. See also: ToDirectStringAssembler.
type DirectString extends String;
@export
macro AllocateSeqOneByteString(length: uint32): SeqOneByteString {
assert(length <= kStringMaxLength);
if (length == 0) return UnsafeCast<SeqOneByteString>(kEmptyString);
return new SeqOneByteString{
map: kOneByteStringMap,
hash_field: kNameEmptyHashField,
length: Signed(length),
chars: ...UninitializedIterator {}
};
}
@export
macro AllocateSeqTwoByteString(length: uint32): String {
assert(length <= kStringMaxLength);
if (length == 0) return kEmptyString;
return new SeqTwoByteString{
map: kStringMap,
hash_field: kNameEmptyHashField,
length: Signed(length),
chars: ...UninitializedIterator {}
};
}