diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/enum_from_lib_used_as_type.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/enum_from_lib_used_as_type.dart.expect index 1443d95235a8..7a6dc010149c 100644 --- a/pkg/vm/testcases/transformations/type_flow/transformer/enum_from_lib_used_as_type.dart.expect +++ b/pkg/vm/testcases/transformations/type_flow/transformer/enum_from_lib_used_as_type.dart.expect @@ -22,6 +22,6 @@ class Class extends core::Object { synthetic constructor •() → self::Class : super core::Object::•() ; -[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3384,getterSelectorId:3385] method method([@vm.inferred-type.metadata=dart.core::Null? (value: null)] self::Enum e) → core::int +[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3396,getterSelectorId:3397] method method([@vm.inferred-type.metadata=dart.core::Null? (value: null)] self::Enum e) → core::int return [@vm.inferred-type.metadata=!] e.{core::_Enum::index}{core::int}; } diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/tree_shake_enum_from_lib.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/tree_shake_enum_from_lib.dart.expect index c16c8ac123e4..5bebd25df2b4 100644 --- a/pkg/vm/testcases/transformations/type_flow/transformer/tree_shake_enum_from_lib.dart.expect +++ b/pkg/vm/testcases/transformations/type_flow/transformer/tree_shake_enum_from_lib.dart.expect @@ -51,6 +51,6 @@ class ConstClass extends core::Object { synthetic constructor •() → self::ConstClass : super core::Object::•() ; -[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3388,getterSelectorId:3389] method method([@vm.inferred-type.metadata=dart.core::Null? (value: null)] self::ConstEnum e) → core::int +[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3400,getterSelectorId:3401] method method([@vm.inferred-type.metadata=dart.core::Null? (value: null)] self::ConstEnum e) → core::int return [@vm.inferred-type.metadata=!] e.{core::_Enum::index}{core::int}; } diff --git a/sdk/lib/_internal/vm/lib/compact_hash.dart b/sdk/lib/_internal/vm/lib/compact_hash.dart index f2b6fc0e41f7..6ed0c8019018 100644 --- a/sdk/lib/_internal/vm/lib/compact_hash.dart +++ b/sdk/lib/_internal/vm/lib/compact_hash.dart @@ -325,6 +325,11 @@ class _InternalImmutableLinkedHashMap extends _HashVMImmutableBase // Publish new index, uses store release semantics. _index = newIndex; } + + Iterable get keys => + new _CompactIterableImmutable(this, _data, _usedData, -2, 2); + Iterable get values => + new _CompactIterableImmutable(this, _data, _usedData, -1, 2); } // Implementation is from "Hacker's Delight" by Henry S. Warren, Jr., @@ -628,6 +633,7 @@ class _CompactLinkedCustomHashMap extends _HashFieldBase // and checks for concurrent modification. class _CompactIterable extends Iterable { final _HashBase _table; + // dart:core#_List (sdk/lib/_internal/vm/lib/array.dart). final List _data; final int _len; final int _offset; @@ -646,6 +652,7 @@ class _CompactIterable extends Iterable { class _CompactIterator implements Iterator { final _HashBase _table; + // dart:core#_List (sdk/lib/_internal/vm/lib/array.dart). final List _data; final int _len; int _offset; @@ -677,6 +684,58 @@ class _CompactIterator implements Iterator { E get current => _current as E; } +// Iterates through _data[_offset + _step], _data[_offset + 2*_step], ... +// and checks for concurrent modification. +class _CompactIterableImmutable extends Iterable { + // _HashBase with _HashVMImmutableBase. + final _HashBase _table; + // dart:core#_ImmutableList (sdk/lib/_internal/vm/lib/array.dart). + final List _data; + final int _len; + final int _offset; + final int _step; + + _CompactIterableImmutable( + this._table, this._data, this._len, this._offset, this._step); + + Iterator get iterator => + new _CompactIteratorImmutable(_table, _data, _len, _offset, _step); + + int get length => _table.length; + bool get isEmpty => length == 0; + bool get isNotEmpty => !isEmpty; +} + +class _CompactIteratorImmutable implements Iterator { + // _HashBase with _HashVMImmutableBase. + final _HashBase _table; + // dart:core#_ImmutableList (sdk/lib/_internal/vm/lib/array.dart). + final List _data; + final int _len; + int _offset; + final int _step; + final int _checkSum; + E? _current; + + _CompactIteratorImmutable( + _HashBase table, this._data, this._len, this._offset, this._step) + : _table = table, + _checkSum = table._checkSum; + + bool moveNext() { + _offset += _step; + if (_offset < _len) { + _current = internal.unsafeCast(_data[_offset]); + return true; + } else { + _current = null; + return false; + } + } + + E get current => _current as E; +} + abstract class _LinkedHashSetMixin implements _HashBase { int _hashCode(e); bool _equals(e1, e2); @@ -959,6 +1018,9 @@ class _CompactImmutableLinkedHashSet extends _HashVMImmutableBase // Returns a mutable set. Set toSet() => new _CompactLinkedHashSet()..addAll(this); + + Iterator get iterator => + new _CompactIteratorImmutable(this, _data, _usedData, -1, 1); } class _CompactLinkedIdentityHashSet extends _HashFieldBase