diff --git a/pkg/native_compiler/lib/runtime/object_layout.dart b/pkg/native_compiler/lib/runtime/object_layout.dart index 71376ca9617..4fc3ff9d80b 100644 --- a/pkg/native_compiler/lib/runtime/object_layout.dart +++ b/pkg/native_compiler/lib/runtime/object_layout.dart @@ -132,7 +132,7 @@ class ObjectLayout { }; late final Map _dartCompactHashInstanceSize = { - '_HashVMBase': vmOffsets.LinkedHashBase_InstanceSize, + '_LinkedHashBase': vmOffsets.LinkedHashBase_InstanceSize, }; late final ast.Library _typedDataLibrary = GlobalContext diff --git a/pkg/native_compiler/lib/runtime/vm_offsets.g.dart b/pkg/native_compiler/lib/runtime/vm_offsets.g.dart index a7692af3142..fa6d1f2608e 100644 --- a/pkg/native_compiler/lib/runtime/vm_offsets.g.dart +++ b/pkg/native_compiler/lib/runtime/vm_offsets.g.dart @@ -144,6 +144,7 @@ base class VMOffsets { int get LinkedHashBase_index_offset => throw 'Unknown'; int get LinkedHashBase_type_arguments_offset => throw 'Unknown'; int get LinkedHashBase_used_data_offset => throw 'Unknown'; + int get LinkedHashBase_NextFieldOffset => throw 'Unknown'; int get LocalHandle_ptr_offset => throw 'Unknown'; int get MarkingStackBlock_pointers_offset => throw 'Unknown'; int get MarkingStackBlock_top_offset => throw 'Unknown'; @@ -856,6 +857,8 @@ final class Arm64VMOffsets extends VMOffsets { @override int get LinkedHashBase_used_data_offset => 0x20; @override + int get LinkedHashBase_NextFieldOffset => 0x38; + @override int get LocalHandle_ptr_offset => 0x0; @override int get MarkingStackBlock_pointers_offset => 0x10; @@ -1813,6 +1816,8 @@ final class Arm64ProductVMOffsets extends VMOffsets { @override int get LinkedHashBase_used_data_offset => 0x20; @override + int get LinkedHashBase_NextFieldOffset => 0x38; + @override int get LocalHandle_ptr_offset => 0x0; @override int get MarkingStackBlock_pointers_offset => 0x10; @@ -2868,6 +2873,7 @@ enum ClassId { StringCid, OneByteStringCid, TwoByteStringCid, + LinkedHashBaseCid, FfiNativeFunctionCid, FfiInt8Cid, FfiInt16Cid, diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/class_generics_case1.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/class_generics_case1.dart.expect index 60247befed8..22ba50bfb0b 100644 --- a/pkg/vm/testcases/transformations/type_flow/transformer/class_generics_case1.dart.expect +++ b/pkg/vm/testcases/transformations/type_flow/transformer/class_generics_case1.dart.expect @@ -21,7 +21,7 @@ class InheritedElement extends self::Element { [@vm.inferred-return-type.metadata=dart.core::Null? (value: null)] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:2,getterSelectorId:3] method setDependencies([@vm.inferred-arg-type.metadata=!] self::Element dependent, [@vm.inferred-arg-type.metadata=dart.core::_Smi?] core::Object? value) → void { - [@vm.call-site-attributes.metadata=receiverType:dart.core::Map<#lib::Element, dart.core::Object?>] [@vm.direct-call.metadata=dart._compact_hash::__Map&_HashVMBase&MapMixin&_HashBase&_OperatorEqualsAndHashCode&_LinkedHashMapMixin.[]=] [@vm.inferred-type.metadata=? (skip check)] [@vm.direct-call.metadata=#lib::InheritedElement._dependents] [@vm.inferred-type.metadata=dart._compact_hash::_Map<#lib::Element, dart.core::Object?>] this.{self::InheritedElement::_dependents}{core::Map}.{core::Map::[]=}(dependent, value){(self::Element, core::Object?) → void}; + [@vm.call-site-attributes.metadata=receiverType:dart.core::Map<#lib::Element, dart.core::Object?>] [@vm.direct-call.metadata=dart._compact_hash::__Map&_LinkedHashBase&MapMixin&_HashBase&_OperatorEqualsAndHashCode&_LinkedHashMapMixin.[]=] [@vm.inferred-type.metadata=? (skip check)] [@vm.direct-call.metadata=#lib::InheritedElement._dependents] [@vm.inferred-type.metadata=dart._compact_hash::_Map<#lib::Element, dart.core::Object?>] this.{self::InheritedElement::_dependents}{core::Map}.{core::Map::[]=}(dependent, value){(self::Element, core::Object?) → void}; } } diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/const_map.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/const_map.dart.expect index 015a8c9f04f..b1d74b9a9c5 100644 --- a/pkg/vm/testcases/transformations/type_flow/transformer/const_map.dart.expect +++ b/pkg/vm/testcases/transformations/type_flow/transformer/const_map.dart.expect @@ -16,7 +16,7 @@ class _Attribute extends core::Object { [@vm.inferred-return-type.metadata=#lib::_Attribute] static method fromReader() → self::_Attribute { - final self::_AttributeName name = [@vm.direct-call.metadata=dart._compact_hash::__ConstMap&_HashVMImmutableBase&MapMixin&_HashBase&_OperatorEqualsAndCanonicalHashCode&_LinkedHashMapMixin&_UnmodifiableMapMixin&_ImmutableLinkedHashMapMixin.[]] [@vm.inferred-type.metadata=#lib::_AttributeName? (skip check)] #C8.{core::Map::[]}(#C1){(core::Object?) → self::_AttributeName?}!; + final self::_AttributeName name = [@vm.direct-call.metadata=dart._compact_hash::__ConstMap&_LinkedHashImmutableBase&MapMixin&_HashBase&_OperatorEqualsAndCanonicalHashCode&_LinkedHashMapMixin&_UnmodifiableMapMixin&_ImmutableLinkedHashMapMixin.[]] [@vm.inferred-type.metadata=#lib::_AttributeName? (skip check)] #C8.{core::Map::[]}(#C1){(core::Object?) → self::_AttributeName?}!; return new self::_Attribute::_(); } } diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/const_set.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/const_set.dart.expect index 513d1ec6c8c..605dd848960 100644 --- a/pkg/vm/testcases/transformations/type_flow/transformer/const_set.dart.expect +++ b/pkg/vm/testcases/transformations/type_flow/transformer/const_set.dart.expect @@ -16,7 +16,7 @@ class _Attribute extends core::Object { [@vm.inferred-return-type.metadata=#lib::_Attribute] static method fromReader() → self::_Attribute { - final core::bool name = [@vm.direct-call.metadata=dart._compact_hash::__ConstSet&_HashVMImmutableBase&SetMixin&_HashBase&_OperatorEqualsAndCanonicalHashCode&_LinkedHashSetMixin&_UnmodifiableSetMixin&_ImmutableLinkedHashSetMixin.contains] [@vm.inferred-type.metadata=? (skip check)] #C3.{core::Set::contains}(#C2){(core::Object?) → core::bool}; + final core::bool name = [@vm.direct-call.metadata=dart._compact_hash::__ConstSet&_LinkedHashImmutableBase&SetMixin&_HashBase&_OperatorEqualsAndCanonicalHashCode&_LinkedHashSetMixin&_UnmodifiableSetMixin&_ImmutableLinkedHashSetMixin.contains] [@vm.inferred-type.metadata=? (skip check)] #C3.{core::Set::contains}(#C2){(core::Object?) → core::bool}; return let final self::_AttributeName #t1 = #C8.{core::List::[]}(#C2){(core::int) → self::_AttributeName} in new self::_Attribute::_(); } } diff --git a/runtime/vm/class_id.h b/runtime/vm/class_id.h index 7a02aab4685..aad8e18e0be 100644 --- a/runtime/vm/class_id.h +++ b/runtime/vm/class_id.h @@ -312,6 +312,7 @@ static constexpr intptr_t kClassIdTagMax = (1 << 20) - 1; CID(FreeListElement) \ CID(ForwardingCorpse) \ CLASS_LIST(DEFINE_CLASS_ID) \ + CID(LinkedHashBaseCid) \ CLASS_LIST_FFI(DEFINE_FFI_CLASS_ID) \ CLASS_LIST_TYPED_DATA(DEFINE_TYPED_DATA_CLASS_ID) \ CID(ByteDataViewCid) \ diff --git a/runtime/vm/compiler/recognized_methods_list.h b/runtime/vm/compiler/recognized_methods_list.h index da396614b09..34d9da9a59e 100644 --- a/runtime/vm/compiler/recognized_methods_list.h +++ b/runtime/vm/compiler/recognized_methods_list.h @@ -78,31 +78,31 @@ namespace dart { V(CoreLibrary, _Smi, get:hashCode, Smi_hashCode, 0x75c3b512) \ V(CoreLibrary, _Mint, get:hashCode, Mint_hashCode, 0x75c3b512) \ V(CoreLibrary, _Double, get:hashCode, Double_hashCode, 0x75c3b8d3) \ - V(CompactHashLibrary, _HashVMBase, get:_index, LinkedHashBase_getIndex, \ + V(CompactHashLibrary, _LinkedHashBase, get:_index, LinkedHashBase_getIndex, \ 0xb49e7210) \ - V(CompactHashLibrary, _HashVMBase, set:_index, LinkedHashBase_setIndex, \ + V(CompactHashLibrary, _LinkedHashBase, set:_index, LinkedHashBase_setIndex, \ 0xcf36944c) \ - V(CompactHashLibrary, _HashVMBase, get:_data, LinkedHashBase_getData, \ + V(CompactHashLibrary, _LinkedHashBase, get:_data, LinkedHashBase_getData, \ 0x82aeadd7) \ - V(CompactHashLibrary, _HashVMBase, set:_data, LinkedHashBase_setData, \ + V(CompactHashLibrary, _LinkedHashBase, set:_data, LinkedHashBase_setData, \ 0xc1465c93) \ - V(CompactHashLibrary, _HashVMBase, get:_usedData, \ + V(CompactHashLibrary, _LinkedHashBase, get:_usedData, \ LinkedHashBase_getUsedData, 0x74808f38) \ - V(CompactHashLibrary, _HashVMBase, set:_usedData, \ + V(CompactHashLibrary, _LinkedHashBase, set:_usedData, \ LinkedHashBase_setUsedData, 0xe14082f4) \ - V(CompactHashLibrary, _HashVMBase, get:_hashMask, \ + V(CompactHashLibrary, _LinkedHashBase, get:_hashMask, \ LinkedHashBase_getHashMask, 0x53cd6dce) \ - V(CompactHashLibrary, _HashVMBase, set:_hashMask, \ + V(CompactHashLibrary, _LinkedHashBase, set:_hashMask, \ LinkedHashBase_setHashMask, 0xc08d618a) \ - V(CompactHashLibrary, _HashVMBase, get:_deletedKeys, \ + V(CompactHashLibrary, _LinkedHashBase, get:_deletedKeys, \ LinkedHashBase_getDeletedKeys, 0x75eeb895) \ - V(CompactHashLibrary, _HashVMBase, set:_deletedKeys, \ + V(CompactHashLibrary, _LinkedHashBase, set:_deletedKeys, \ LinkedHashBase_setDeletedKeys, 0xe2aeac51) \ - V(CompactHashLibrary, _HashVMImmutableBase, get:_data, \ + V(CompactHashLibrary, _LinkedHashImmutableBase, get:_data, \ ImmutableLinkedHashBase_getData, 0x82aeadd7) \ - V(CompactHashLibrary, _HashVMImmutableBase, get:_indexNullable, \ + V(CompactHashLibrary, _LinkedHashImmutableBase, get:_indexNullable, \ ImmutableLinkedHashBase_getIndex, 0xfe7649ae) \ - V(CompactHashLibrary, _HashVMImmutableBase, set:_index, \ + V(CompactHashLibrary, _LinkedHashImmutableBase, set:_index, \ ImmutableLinkedHashBase_setIndexStoreRelease, 0xcf36944c) \ V(CompactHashLibrary, ::, get:_uninitializedIndex, \ CompactHash_uninitializedIndex, 0xa25a79e6) \ diff --git a/runtime/vm/compiler/runtime_api.h b/runtime/vm/compiler/runtime_api.h index 4136b328c48..641b9355359 100644 --- a/runtime/vm/compiler/runtime_api.h +++ b/runtime/vm/compiler/runtime_api.h @@ -671,6 +671,7 @@ class LinkedHashBase : public AllStatic { static word deleted_keys_offset(); static word type_arguments_offset(); static word InstanceSize(); + static word NextFieldOffset(); }; class ImmutableLinkedHashBase : public LinkedHashBase { diff --git a/runtime/vm/compiler/runtime_offsets_extracted.h b/runtime/vm/compiler/runtime_offsets_extracted.h index 1f471af2b09..2b6acde9d93 100644 --- a/runtime/vm/compiler/runtime_offsets_extracted.h +++ b/runtime/vm/compiler/runtime_offsets_extracted.h @@ -271,6 +271,8 @@ static constexpr dart::compiler::target::word LinkedHashBase_type_arguments_offset = 0x4; static constexpr dart::compiler::target::word LinkedHashBase_used_data_offset = 0x10; +static constexpr dart::compiler::target::word LinkedHashBase_NextFieldOffset = + 0x1c; static constexpr dart::compiler::target::word LocalHandle_ptr_offset = 0x0; static constexpr dart::compiler::target::word MarkingStackBlock_pointers_offset = 0x8; @@ -1039,6 +1041,8 @@ static constexpr dart::compiler::target::word LinkedHashBase_type_arguments_offset = 0x8; static constexpr dart::compiler::target::word LinkedHashBase_used_data_offset = 0x20; +static constexpr dart::compiler::target::word LinkedHashBase_NextFieldOffset = + 0x38; static constexpr dart::compiler::target::word LocalHandle_ptr_offset = 0x0; static constexpr dart::compiler::target::word MarkingStackBlock_pointers_offset = 0x10; @@ -1806,6 +1810,8 @@ static constexpr dart::compiler::target::word LinkedHashBase_type_arguments_offset = 0x4; static constexpr dart::compiler::target::word LinkedHashBase_used_data_offset = 0x10; +static constexpr dart::compiler::target::word LinkedHashBase_NextFieldOffset = + 0x1c; static constexpr dart::compiler::target::word LocalHandle_ptr_offset = 0x0; static constexpr dart::compiler::target::word MarkingStackBlock_pointers_offset = 0x8; @@ -2573,6 +2579,8 @@ static constexpr dart::compiler::target::word LinkedHashBase_type_arguments_offset = 0x8; static constexpr dart::compiler::target::word LinkedHashBase_used_data_offset = 0x20; +static constexpr dart::compiler::target::word LinkedHashBase_NextFieldOffset = + 0x38; static constexpr dart::compiler::target::word LocalHandle_ptr_offset = 0x0; static constexpr dart::compiler::target::word MarkingStackBlock_pointers_offset = 0x10; @@ -3346,6 +3354,8 @@ static constexpr dart::compiler::target::word LinkedHashBase_type_arguments_offset = 0x8; static constexpr dart::compiler::target::word LinkedHashBase_used_data_offset = 0x14; +static constexpr dart::compiler::target::word LinkedHashBase_NextFieldOffset = + 0x20; static constexpr dart::compiler::target::word LocalHandle_ptr_offset = 0x0; static constexpr dart::compiler::target::word MarkingStackBlock_pointers_offset = 0x10; @@ -4116,6 +4126,8 @@ static constexpr dart::compiler::target::word LinkedHashBase_type_arguments_offset = 0x8; static constexpr dart::compiler::target::word LinkedHashBase_used_data_offset = 0x14; +static constexpr dart::compiler::target::word LinkedHashBase_NextFieldOffset = + 0x20; static constexpr dart::compiler::target::word LocalHandle_ptr_offset = 0x0; static constexpr dart::compiler::target::word MarkingStackBlock_pointers_offset = 0x10; @@ -4884,6 +4896,8 @@ static constexpr dart::compiler::target::word LinkedHashBase_type_arguments_offset = 0x4; static constexpr dart::compiler::target::word LinkedHashBase_used_data_offset = 0x10; +static constexpr dart::compiler::target::word LinkedHashBase_NextFieldOffset = + 0x1c; static constexpr dart::compiler::target::word LocalHandle_ptr_offset = 0x0; static constexpr dart::compiler::target::word MarkingStackBlock_pointers_offset = 0x8; @@ -5653,6 +5667,8 @@ static constexpr dart::compiler::target::word LinkedHashBase_type_arguments_offset = 0x8; static constexpr dart::compiler::target::word LinkedHashBase_used_data_offset = 0x20; +static constexpr dart::compiler::target::word LinkedHashBase_NextFieldOffset = + 0x38; static constexpr dart::compiler::target::word LocalHandle_ptr_offset = 0x0; static constexpr dart::compiler::target::word MarkingStackBlock_pointers_offset = 0x10; @@ -6414,6 +6430,8 @@ static constexpr dart::compiler::target::word LinkedHashBase_type_arguments_offset = 0x4; static constexpr dart::compiler::target::word LinkedHashBase_used_data_offset = 0x10; +static constexpr dart::compiler::target::word LinkedHashBase_NextFieldOffset = + 0x1c; static constexpr dart::compiler::target::word LocalHandle_ptr_offset = 0x0; static constexpr dart::compiler::target::word MarkingStackBlock_pointers_offset = 0x8; @@ -7174,6 +7192,8 @@ static constexpr dart::compiler::target::word LinkedHashBase_type_arguments_offset = 0x8; static constexpr dart::compiler::target::word LinkedHashBase_used_data_offset = 0x20; +static constexpr dart::compiler::target::word LinkedHashBase_NextFieldOffset = + 0x38; static constexpr dart::compiler::target::word LocalHandle_ptr_offset = 0x0; static constexpr dart::compiler::target::word MarkingStackBlock_pointers_offset = 0x10; @@ -7933,6 +7953,8 @@ static constexpr dart::compiler::target::word LinkedHashBase_type_arguments_offset = 0x4; static constexpr dart::compiler::target::word LinkedHashBase_used_data_offset = 0x10; +static constexpr dart::compiler::target::word LinkedHashBase_NextFieldOffset = + 0x1c; static constexpr dart::compiler::target::word LocalHandle_ptr_offset = 0x0; static constexpr dart::compiler::target::word MarkingStackBlock_pointers_offset = 0x8; @@ -8692,6 +8714,8 @@ static constexpr dart::compiler::target::word LinkedHashBase_type_arguments_offset = 0x8; static constexpr dart::compiler::target::word LinkedHashBase_used_data_offset = 0x20; +static constexpr dart::compiler::target::word LinkedHashBase_NextFieldOffset = + 0x38; static constexpr dart::compiler::target::word LocalHandle_ptr_offset = 0x0; static constexpr dart::compiler::target::word MarkingStackBlock_pointers_offset = 0x10; @@ -9457,6 +9481,8 @@ static constexpr dart::compiler::target::word LinkedHashBase_type_arguments_offset = 0x8; static constexpr dart::compiler::target::word LinkedHashBase_used_data_offset = 0x14; +static constexpr dart::compiler::target::word LinkedHashBase_NextFieldOffset = + 0x20; static constexpr dart::compiler::target::word LocalHandle_ptr_offset = 0x0; static constexpr dart::compiler::target::word MarkingStackBlock_pointers_offset = 0x10; @@ -10219,6 +10245,8 @@ static constexpr dart::compiler::target::word LinkedHashBase_type_arguments_offset = 0x8; static constexpr dart::compiler::target::word LinkedHashBase_used_data_offset = 0x14; +static constexpr dart::compiler::target::word LinkedHashBase_NextFieldOffset = + 0x20; static constexpr dart::compiler::target::word LocalHandle_ptr_offset = 0x0; static constexpr dart::compiler::target::word MarkingStackBlock_pointers_offset = 0x10; @@ -10979,6 +11007,8 @@ static constexpr dart::compiler::target::word LinkedHashBase_type_arguments_offset = 0x4; static constexpr dart::compiler::target::word LinkedHashBase_used_data_offset = 0x10; +static constexpr dart::compiler::target::word LinkedHashBase_NextFieldOffset = + 0x1c; static constexpr dart::compiler::target::word LocalHandle_ptr_offset = 0x0; static constexpr dart::compiler::target::word MarkingStackBlock_pointers_offset = 0x8; @@ -11740,6 +11770,8 @@ static constexpr dart::compiler::target::word LinkedHashBase_type_arguments_offset = 0x8; static constexpr dart::compiler::target::word LinkedHashBase_used_data_offset = 0x20; +static constexpr dart::compiler::target::word LinkedHashBase_NextFieldOffset = + 0x38; static constexpr dart::compiler::target::word LocalHandle_ptr_offset = 0x0; static constexpr dart::compiler::target::word MarkingStackBlock_pointers_offset = 0x10; @@ -12532,6 +12564,8 @@ static constexpr dart::compiler::target::word AOT_LinkedHashBase_type_arguments_offset = 0x4; static constexpr dart::compiler::target::word AOT_LinkedHashBase_used_data_offset = 0x10; +static constexpr dart::compiler::target::word + AOT_LinkedHashBase_NextFieldOffset = 0x1c; static constexpr dart::compiler::target::word AOT_LocalHandle_ptr_offset = 0x0; static constexpr dart::compiler::target::word AOT_MarkingStackBlock_pointers_offset = 0x8; @@ -13383,6 +13417,8 @@ static constexpr dart::compiler::target::word AOT_LinkedHashBase_type_arguments_offset = 0x8; static constexpr dart::compiler::target::word AOT_LinkedHashBase_used_data_offset = 0x20; +static constexpr dart::compiler::target::word + AOT_LinkedHashBase_NextFieldOffset = 0x38; static constexpr dart::compiler::target::word AOT_LocalHandle_ptr_offset = 0x0; static constexpr dart::compiler::target::word AOT_MarkingStackBlock_pointers_offset = 0x10; @@ -14241,6 +14277,8 @@ static constexpr dart::compiler::target::word AOT_LinkedHashBase_type_arguments_offset = 0x8; static constexpr dart::compiler::target::word AOT_LinkedHashBase_used_data_offset = 0x20; +static constexpr dart::compiler::target::word + AOT_LinkedHashBase_NextFieldOffset = 0x38; static constexpr dart::compiler::target::word AOT_LocalHandle_ptr_offset = 0x0; static constexpr dart::compiler::target::word AOT_MarkingStackBlock_pointers_offset = 0x10; @@ -15095,6 +15133,8 @@ static constexpr dart::compiler::target::word AOT_LinkedHashBase_type_arguments_offset = 0x8; static constexpr dart::compiler::target::word AOT_LinkedHashBase_used_data_offset = 0x14; +static constexpr dart::compiler::target::word + AOT_LinkedHashBase_NextFieldOffset = 0x20; static constexpr dart::compiler::target::word AOT_LocalHandle_ptr_offset = 0x0; static constexpr dart::compiler::target::word AOT_MarkingStackBlock_pointers_offset = 0x10; @@ -15949,6 +15989,8 @@ static constexpr dart::compiler::target::word AOT_LinkedHashBase_type_arguments_offset = 0x8; static constexpr dart::compiler::target::word AOT_LinkedHashBase_used_data_offset = 0x14; +static constexpr dart::compiler::target::word + AOT_LinkedHashBase_NextFieldOffset = 0x20; static constexpr dart::compiler::target::word AOT_LocalHandle_ptr_offset = 0x0; static constexpr dart::compiler::target::word AOT_MarkingStackBlock_pointers_offset = 0x10; @@ -16801,6 +16843,8 @@ static constexpr dart::compiler::target::word AOT_LinkedHashBase_type_arguments_offset = 0x4; static constexpr dart::compiler::target::word AOT_LinkedHashBase_used_data_offset = 0x10; +static constexpr dart::compiler::target::word + AOT_LinkedHashBase_NextFieldOffset = 0x1c; static constexpr dart::compiler::target::word AOT_LocalHandle_ptr_offset = 0x0; static constexpr dart::compiler::target::word AOT_MarkingStackBlock_pointers_offset = 0x8; @@ -17653,6 +17697,8 @@ static constexpr dart::compiler::target::word AOT_LinkedHashBase_type_arguments_offset = 0x8; static constexpr dart::compiler::target::word AOT_LinkedHashBase_used_data_offset = 0x20; +static constexpr dart::compiler::target::word + AOT_LinkedHashBase_NextFieldOffset = 0x38; static constexpr dart::compiler::target::word AOT_LocalHandle_ptr_offset = 0x0; static constexpr dart::compiler::target::word AOT_MarkingStackBlock_pointers_offset = 0x10; @@ -18495,6 +18541,8 @@ static constexpr dart::compiler::target::word AOT_LinkedHashBase_type_arguments_offset = 0x4; static constexpr dart::compiler::target::word AOT_LinkedHashBase_used_data_offset = 0x10; +static constexpr dart::compiler::target::word + AOT_LinkedHashBase_NextFieldOffset = 0x1c; static constexpr dart::compiler::target::word AOT_LocalHandle_ptr_offset = 0x0; static constexpr dart::compiler::target::word AOT_MarkingStackBlock_pointers_offset = 0x8; @@ -19337,6 +19385,8 @@ static constexpr dart::compiler::target::word AOT_LinkedHashBase_type_arguments_offset = 0x8; static constexpr dart::compiler::target::word AOT_LinkedHashBase_used_data_offset = 0x20; +static constexpr dart::compiler::target::word + AOT_LinkedHashBase_NextFieldOffset = 0x38; static constexpr dart::compiler::target::word AOT_LocalHandle_ptr_offset = 0x0; static constexpr dart::compiler::target::word AOT_MarkingStackBlock_pointers_offset = 0x10; @@ -20186,6 +20236,8 @@ static constexpr dart::compiler::target::word AOT_LinkedHashBase_type_arguments_offset = 0x8; static constexpr dart::compiler::target::word AOT_LinkedHashBase_used_data_offset = 0x20; +static constexpr dart::compiler::target::word + AOT_LinkedHashBase_NextFieldOffset = 0x38; static constexpr dart::compiler::target::word AOT_LocalHandle_ptr_offset = 0x0; static constexpr dart::compiler::target::word AOT_MarkingStackBlock_pointers_offset = 0x10; @@ -21031,6 +21083,8 @@ static constexpr dart::compiler::target::word AOT_LinkedHashBase_type_arguments_offset = 0x8; static constexpr dart::compiler::target::word AOT_LinkedHashBase_used_data_offset = 0x14; +static constexpr dart::compiler::target::word + AOT_LinkedHashBase_NextFieldOffset = 0x20; static constexpr dart::compiler::target::word AOT_LocalHandle_ptr_offset = 0x0; static constexpr dart::compiler::target::word AOT_MarkingStackBlock_pointers_offset = 0x10; @@ -21876,6 +21930,8 @@ static constexpr dart::compiler::target::word AOT_LinkedHashBase_type_arguments_offset = 0x8; static constexpr dart::compiler::target::word AOT_LinkedHashBase_used_data_offset = 0x14; +static constexpr dart::compiler::target::word + AOT_LinkedHashBase_NextFieldOffset = 0x20; static constexpr dart::compiler::target::word AOT_LocalHandle_ptr_offset = 0x0; static constexpr dart::compiler::target::word AOT_MarkingStackBlock_pointers_offset = 0x10; @@ -22719,6 +22775,8 @@ static constexpr dart::compiler::target::word AOT_LinkedHashBase_type_arguments_offset = 0x4; static constexpr dart::compiler::target::word AOT_LinkedHashBase_used_data_offset = 0x10; +static constexpr dart::compiler::target::word + AOT_LinkedHashBase_NextFieldOffset = 0x1c; static constexpr dart::compiler::target::word AOT_LocalHandle_ptr_offset = 0x0; static constexpr dart::compiler::target::word AOT_MarkingStackBlock_pointers_offset = 0x8; @@ -23562,6 +23620,8 @@ static constexpr dart::compiler::target::word AOT_LinkedHashBase_type_arguments_offset = 0x8; static constexpr dart::compiler::target::word AOT_LinkedHashBase_used_data_offset = 0x20; +static constexpr dart::compiler::target::word + AOT_LinkedHashBase_NextFieldOffset = 0x38; static constexpr dart::compiler::target::word AOT_LocalHandle_ptr_offset = 0x0; static constexpr dart::compiler::target::word AOT_MarkingStackBlock_pointers_offset = 0x10; diff --git a/runtime/vm/compiler/runtime_offsets_list.h b/runtime/vm/compiler/runtime_offsets_list.h index 267121398e2..e3000a5e25d 100644 --- a/runtime/vm/compiler/runtime_offsets_list.h +++ b/runtime/vm/compiler/runtime_offsets_list.h @@ -212,6 +212,7 @@ FIELD(LinkedHashBase, index_offset) \ FIELD(LinkedHashBase, type_arguments_offset) \ FIELD(LinkedHashBase, used_data_offset) \ + FIELD(LinkedHashBase, NextFieldOffset) \ FIELD(LocalHandle, ptr_offset) \ FIELD(MarkingStackBlock, pointers_offset) \ FIELD(MarkingStackBlock, top_offset) \ diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc index 4d733e461c4..e7840e0ebba 100644 --- a/runtime/vm/object.cc +++ b/runtime/vm/object.cc @@ -646,6 +646,11 @@ void Object::InitVtables() { builtin_vtables_[kUnmodifiableByteDataViewCid] = fake_handle.vtable(); } + { + LinkedHashBase fake_handle; + builtin_vtables_[kLinkedHashBaseCid] = fake_handle.vtable(); + } + { Instance fake_handle; builtin_vtables_[kByteBufferCid] = fake_handle.vtable(); @@ -2143,6 +2148,18 @@ ErrorPtr Object::Init(IsolateGroup* isolate_group, ASSERT(!lib.IsNull()); ASSERT(lib.ptr() == Library::CompactHashLibrary()); + + cls = Class::New( + kLinkedHashBaseCid, isolate_group, /*register_class=*/true, + /*is_abstract=*/true); + cls.set_type_arguments_field_offset( + LinkedHashBase::type_arguments_offset(), + RTN::LinkedHashBase::type_arguments_offset()); + cls.set_is_prefinalized(); + isolate_group->class_table()->Register(cls); + RegisterPrivateClass(cls, Symbols::_LinkedHashBase(), lib); + pending_classes.Add(cls); + cls = Class::New(isolate_group); object_store->set_map_impl_class(cls); cls.set_type_arguments_field_offset(Map::type_arguments_offset(), @@ -2624,6 +2641,10 @@ ErrorPtr Object::Init(IsolateGroup* isolate_group, isolate_group); object_store->set_growable_object_array_class(cls); + cls = Class::New( + kLinkedHashBaseCid, isolate_group, /*register_class=*/true, + /*is_abstract=*/true); + cls = Class::New(isolate_group); object_store->set_map_impl_class(cls); diff --git a/runtime/vm/object.h b/runtime/vm/object.h index 28b1894e938..46dd66637c0 100644 --- a/runtime/vm/object.h +++ b/runtime/vm/object.h @@ -12318,6 +12318,7 @@ class LinkedHashBase : public Instance { static intptr_t InstanceSize() { return RoundedAllocationSize(sizeof(UntaggedLinkedHashBase)); } + static intptr_t NextFieldOffset() { return sizeof(UntaggedLinkedHashBase); } static intptr_t type_arguments_offset() { return OFFSET_OF(UntaggedLinkedHashBase, type_arguments_); diff --git a/runtime/vm/symbol_list.h b/runtime/vm/symbol_list.h index b7da24a873b..d610bea7702 100644 --- a/runtime/vm/symbol_list.h +++ b/runtime/vm/symbol_list.h @@ -349,6 +349,7 @@ namespace dart { V(_GrowableListGenerateFactory, "_GrowableList.generate") \ V(_GrowableListLiteralFactory, "_GrowableList._literal") \ V(_GrowableListWithData, "_GrowableList._withData") \ + V(_LinkedHashBase, "_LinkedHashBase") \ V(_ImmutableList, "_ImmutableList") \ V(_Int16ArrayFactory, "Int16List.") \ V(_Int16ArrayView, "_Int16ArrayView") \ diff --git a/sdk/lib/_internal/vm_shared/lib/compact_hash.dart b/sdk/lib/_internal/vm_shared/lib/compact_hash.dart index 9986f76a992..df4b98e75c7 100644 --- a/sdk/lib/_internal/vm_shared/lib/compact_hash.dart +++ b/sdk/lib/_internal/vm_shared/lib/compact_hash.dart @@ -109,64 +109,8 @@ void _rehashObjects(List objects) { } } -// Common interface for [_HashFieldBase] and [_HashVMBase]. -abstract class _HashAbstractBase { - abstract Uint32List _index; - - abstract int _hashMask; - - abstract List _data; - - abstract int _usedData; - - abstract int _deletedKeys; -} - -abstract class _HashAbstractImmutableBase extends _HashAbstractBase { - Uint32List? get _indexNullable; -} - -abstract class _HashFieldBase implements _HashAbstractImmutableBase { - // Each occupied entry in _index is a fixed-size integer that encodes a pair: - // [ hash pattern for key | index of entry in _data ] - // The hash pattern is based on hashCode, but is guaranteed to be non-zero. - // The length of _index is always a power of two, and there is always at - // least one unoccupied entry. - // NOTE: When maps are deserialized, their _index and _hashMask is regenerated - // eagerly by _regenerateIndex. - Uint32List? _indexNullable = _uninitializedIndex; - - @pragma("vm:exact-result-type", "dart:typed_data#_Uint32List") - @pragma("vm:prefer-inline") - @pragma("wasm:prefer-inline") - Uint32List get _index => _indexNullable!; - - @pragma("vm:prefer-inline") - @pragma("wasm:prefer-inline") - void set _index(Uint32List value) => _indexNullable = value; - - // Cached in-place mask for the hash pattern component. - int _hashMask = _HashBase._UNINITIALIZED_HASH_MASK; - - // Fixed-length list of keys (set) or key/value at even/odd indices (map). - // - // Can be either a mutable or immutable list. - List _data = _uninitializedData; - - // Length of _data that is used (i.e., keys + values for a map). - int _usedData = 0; - - // Number of deleted keys. - int _deletedKeys = 0; - - // Note: All fields are initialized in a single constructor so that the VM - // recognizes they cannot hold null values. This makes a big (20%) performance - // difference on some operations. - _HashFieldBase(); -} - -// Base class for VM-internal classes; keep in sync with _HashFieldBase. -abstract class _HashVMBase implements _HashAbstractBase { +// Corresponds to `UntaggedLinkedHashBase` VM class. +abstract class _LinkedHashBase { @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", "dart:typed_data#_Uint32List") @pragma("vm:prefer-inline") @@ -206,11 +150,18 @@ abstract class _HashVMBase implements _HashAbstractBase { @pragma("vm:recognized", "other") @pragma("vm:prefer-inline") external void set _deletedKeys(int value); + + _LinkedHashBase() { + _index = _uninitializedIndex; + _hashMask = _HashBase._UNINITIALIZED_HASH_MASK; + _data = _uninitializedData; + _usedData = 0; + _deletedKeys = 0; + } } -// Base class for immutable VM-internal classes. -abstract class _HashVMImmutableBase extends _HashVMBase - implements _HashAbstractImmutableBase { +// Base class for immutable sets and maps. +abstract class _LinkedHashImmutableBase extends _LinkedHashBase { // The data is an immutable list rather than a mutable list. @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", "dart:core#_ImmutableList") @@ -229,10 +180,13 @@ abstract class _HashVMImmutableBase extends _HashVMBase external void set _index(Uint32List value); } -// This mixin can be applied to _HashFieldBase or _HashVMBase (for -// normal and VM-internalized classes, respectively), which provide the -// actual fields/accessors that this mixin assumes. -mixin _HashBase on _HashAbstractBase { +// This mixin can be applied to _LinkedHashBase or _LinkedHashImmutableBase. +// +// Note that _LinkedHashImmutableBase overrides certain accessors on +// _LinkedHashBase to provide behaviors specific to constant maps and sets. +// We use mixins to copy implementation methods that depend on these accessors +// and avoid polymorphism in the code. +mixin _HashBase on _LinkedHashBase { // The number of bits used for each component is determined by table size. // If initialized, the length of _index is (at least) twice the number of // entries in _data, and both are doubled when _data is full. Thus, _index @@ -378,7 +332,7 @@ external List get _uninitializedData; // literals also create instances of this class. @pragma("vm:entry-point") @pragma('dyn-module:language-impl:callable') -base class _Map extends _HashVMBase +base class _Map extends _LinkedHashBase with MapMixin, _HashBase, @@ -386,13 +340,7 @@ base class _Map extends _HashVMBase _LinkedHashMapMixin implements LinkedHashMap { @pragma('dyn-module:language-impl:callable') - _Map() { - _index = _uninitializedIndex; - _hashMask = _HashBase._UNINITIALIZED_HASH_MASK; - _data = _uninitializedData; - _usedData = 0; - _deletedKeys = 0; - } + _Map(); void addAll(Map other) { if (other case final _Map otherBase) { @@ -409,7 +357,7 @@ base class _Map extends _HashVMBase // this class for maps constructed from Dart constant maps. @pragma("vm:deeply-immutable") @pragma("vm:entry-point") -final class _ConstMap extends _HashVMImmutableBase +final class _ConstMap extends _LinkedHashImmutableBase with MapMixin, _HashBase, @@ -430,7 +378,7 @@ external _ConstMap createConstMapFromMapOfDeeplyImmutables( ); mixin _ImmutableLinkedHashMapMixin - on _LinkedHashMapMixin, _HashAbstractImmutableBase { + on _LinkedHashMapMixin, _LinkedHashImmutableBase { bool containsKey(Object? key) { if (_indexNullable == null) { _createIndex(); @@ -781,7 +729,7 @@ mixin _LinkedHashMapMixin on _HashBase, _EqualsAndHashCode { Iterable> get entries => _CompactEntriesIterable(this); } -base class CompactLinkedIdentityHashMap extends _HashFieldBase +base class CompactLinkedIdentityHashMap extends _LinkedHashBase with MapMixin, _HashBase, @@ -798,7 +746,7 @@ base class CompactLinkedIdentityHashMap extends _HashFieldBase } } -base class CompactLinkedCustomHashMap extends _HashFieldBase +base class CompactLinkedCustomHashMap extends _LinkedHashBase with MapMixin, _HashBase, @@ -941,7 +889,7 @@ class _CompactEntriesIterator implements Iterator> { // Does not check for concurrent modification since the table // is known to be immutable. class _CompactIterableImmutable extends Iterable { - // _HashBase with _HashVMImmutableBase. + // _HashBase with _LinkedHashImmutableBase. final _HashBase _table; // dart:core#_ImmutableList (sdk/lib/_internal/vm/lib/array.dart). final List _data; @@ -966,7 +914,7 @@ class _CompactIterableImmutable extends Iterable { } class _CompactIteratorImmutable implements Iterator { - // _HashBase with _HashVMImmutableBase. + // _HashBase with _LinkedHashImmutableBase. final _HashBase _table; // dart:core#_ImmutableList (sdk/lib/_internal/vm/lib/array.dart). final List _data; @@ -1172,7 +1120,7 @@ mixin _LinkedHashSetMixin on _HashBase, _EqualsAndHashCode { // class. @pragma("vm:entry-point") @pragma('dyn-module:language-impl:callable') -base class _Set extends _HashVMBase +base class _Set extends _LinkedHashBase with SetMixin, _HashBase, @@ -1180,13 +1128,7 @@ base class _Set extends _HashVMBase _LinkedHashSetMixin implements LinkedHashSet { @pragma('dyn-module:language-impl:callable') - _Set() { - _index = _uninitializedIndex; - _hashMask = _HashBase._UNINITIALIZED_HASH_MASK; - _data = _uninitializedData; - _usedData = 0; - _deletedKeys = 0; - } + _Set(); void addAll(Iterable other) { if (other case final _Set otherBase) { @@ -1205,7 +1147,7 @@ base class _Set extends _HashVMBase } @pragma("vm:entry-point") -base class _ConstSet extends _HashVMImmutableBase +base class _ConstSet extends _LinkedHashImmutableBase with SetMixin, _HashBase, @@ -1227,7 +1169,7 @@ base class _ConstSet extends _HashVMImmutableBase } mixin _ImmutableLinkedHashSetMixin - on Set, _LinkedHashSetMixin, _HashAbstractImmutableBase { + on Set, _LinkedHashSetMixin, _LinkedHashImmutableBase { E? lookup(Object? key) { if (_indexNullable == null) { _createIndex(); @@ -1288,7 +1230,7 @@ mixin _ImmutableLinkedHashSetMixin _CompactIteratorImmutable(this, _data, _usedData, -1, 1); } -base class CompactLinkedIdentityHashSet extends _HashFieldBase +base class CompactLinkedIdentityHashSet extends _LinkedHashBase with SetMixin, _HashBase, @@ -1311,7 +1253,7 @@ base class CompactLinkedIdentityHashSet extends _HashFieldBase Set cast() => Set.castFrom(this, newSet: _newEmpty); } -base class CompactLinkedCustomHashSet extends _HashFieldBase +base class CompactLinkedCustomHashSet extends _LinkedHashBase with SetMixin, _HashBase,