public DwarfAbbreviationItem GetOrCreate(DwarfAbbreviationItemKey itemKey) { if (!_mapKeyToItem.TryGetValue(itemKey, out var item)) { item = new DwarfAbbreviationItem(_nextCode, itemKey.Tag, itemKey.HasChildren, itemKey.Descriptors) { Parent = this }; if (_mapItems.Count > 0) { _mapItems[_nextCode] = item; } else { _items.Add(item); } _mapKeyToItem[itemKey] = item; _nextCode++; } return(item); }
private bool TryReadNext(DwarfReader reader) { var startOffset = (ulong)reader.Offset; var code = reader.ReadULEB128(); if (code == 0) { return(false); } var item = new DwarfAbbreviationItem { Offset = startOffset, Code = code }; var index = code - 1; bool canAddToList = _mapItems.Count == 0 && index < int.MaxValue && _items.Count == (int)index; item.ReadInternal(reader); if (canAddToList) { _items.Add(item); _nextCode++; } else { if (_mapItems.Count == 0) { for (var i = 0; i < _items.Count; i++) { var previousItem = _items[i]; _mapItems.Add((ulong)i + 1, previousItem); } _items.Clear(); } // TODO: check collisions if (_mapItems.ContainsKey(code)) { reader.Diagnostics.Error(DiagnosticId.DWARF_ERR_InvalidData, $"Invalid code {code} found while another code already exists in this abbreviation."); return(false); } _mapItems.Add(code, item); _nextCode = Math.Max(code, _nextCode) + 1; } var key = new DwarfAbbreviationItemKey(item.Tag, item.HasChildren, item.Descriptors); _mapKeyToItem.Add(key, item); return(true); }