%PDF- <> %âãÏÓ endobj 2 0 obj <> endobj 3 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/Annots[ 28 0 R 29 0 R] /MediaBox[ 0 0 595.5 842.25] /Contents 4 0 R/Group<>/Tabs/S>> endobj ºaâÚÎΞ-ÌE1ÍØÄ÷{òò2ÿ ÛÖ^ÔÀá TÎ{¦?§®¥kuµùÕ5sLOšuY>endobj 2 0 obj<>endobj 2 0 obj<>endobj 2 0 obj<>endobj 2 0 obj<> endobj 2 0 obj<>endobj 2 0 obj<>es 3 0 R>> endobj 2 0 obj<> ox[ 0.000000 0.000000 609.600000 935.600000]/Fi endobj 3 0 obj<> endobj 7 1 obj<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI]>>/Subtype/Form>> stream
// 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 extern class Name extends PrimitiveHeapObject { raw_hash_field: NameHash; } bitfield struct NameHash extends uint32 { hash_not_computed: bool: 1 bit; is_not_integer_index_mask: bool: 1 bit; array_index_value: uint32: 24 bit; array_index_length: uint32: 6 bit; } // This is the same as Name, but with the information that there are no other // kinds of names. type AnyName = PrivateSymbol|PublicSymbol|String; bitfield struct SymbolFlags extends uint32 { is_private: bool: 1 bit; is_well_known_symbol: bool: 1 bit; is_in_public_symbol_table: bool: 1 bit; is_interesting_symbol: bool: 1 bit; is_private_name: bool: 1 bit; is_private_brand: bool: 1 bit; } extern class Symbol extends Name { flags: SymbolFlags; description: String|Undefined; } type PublicSymbol extends Symbol; type PrivateSymbol extends Symbol; const kNameEmptyHashField: NameHash = NameHash{ hash_not_computed: true, is_not_integer_index_mask: true, array_index_value: 0, array_index_length: 0 }; const kMaxCachedArrayIndexLength: constexpr uint32 generates 'Name::kMaxCachedArrayIndexLength'; const kMaxArrayIndexSize: constexpr uint32 generates 'Name::kMaxArrayIndexSize'; const kNofHashBitFields: constexpr int31 generates 'Name::kNofHashBitFields'; const kArrayIndexValueBits: constexpr int31 generates 'Name::kArrayIndexValueBits'; const kDoesNotContainCachedArrayIndexMask: constexpr uint32 generates 'Name::kDoesNotContainCachedArrayIndexMask'; const kIsNotIntegerIndexMask: constexpr uint32 generates 'Name::kIsNotIntegerIndexMask'; macro ContainsCachedArrayIndex(hash: uint32): bool { return (hash & kDoesNotContainCachedArrayIndexMask) == 0; } const kArrayIndexValueBitsShift: uint32 = kNofHashBitFields; const kArrayIndexLengthBitsShift: uint32 = kNofHashBitFields + kArrayIndexValueBits; macro TenToThe(exponent: uint32): uint32 { assert(exponent <= 9); let answer: int32 = 1; for (let i: int32 = 0; i < Signed(exponent); i++) { answer = answer * 10; } return Unsigned(answer); } macro MakeArrayIndexHash(value: uint32, length: uint32): NameHash { // This is in sync with StringHasher::MakeArrayIndexHash. assert(length <= kMaxArrayIndexSize); const one: uint32 = 1; assert(TenToThe(kMaxCachedArrayIndexLength) < (one << kArrayIndexValueBits)); let hash: uint32 = value; hash = (hash << kArrayIndexValueBitsShift) | (length << kArrayIndexLengthBitsShift); assert((hash & kIsNotIntegerIndexMask) == 0); assert( (length <= kMaxCachedArrayIndexLength) == ContainsCachedArrayIndex(hash)); return %RawDownCast<NameHash>(hash); }