Skip to content

Commit 7366dbe

Browse files
committed
Remove unnecessary restrictions on bulk reads.
1 parent 6119d2d commit 7366dbe

1 file changed

Lines changed: 9 additions & 30 deletions

File tree

src/BizHawk.Emulation.Common/Base Implementations/MemoryDomain.cs

Lines changed: 9 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -90,10 +90,7 @@ public virtual void BulkPeekByte(Range<long> addresses, byte[] values)
9090
if (addresses is null) throw new ArgumentNullException(paramName: nameof(addresses));
9191
if (values is null) throw new ArgumentNullException(paramName: nameof(values));
9292

93-
if ((long)addresses.Count() != values.Length)
94-
{
95-
throw new InvalidOperationException("Invalid length of values array");
96-
}
93+
if (addresses.Count() > (uint)values.Length) throw new ArgumentException($"Length of {nameof(values)} must be at least {nameof(addresses)} count.", nameof(values));
9794

9895
using (this.EnterExit())
9996
{
@@ -109,22 +106,13 @@ public virtual void BulkPeekUshort(Range<long> addresses, bool bigEndian, ushort
109106
if (addresses is null) throw new ArgumentNullException(paramName: nameof(addresses));
110107
if (values is null) throw new ArgumentNullException(paramName: nameof(values));
111108

112-
var start = addresses.Start;
113-
var end = addresses.EndInclusive + 1;
114-
115-
if ((start & 1) != 0 || (end & 1) != 0)
116-
throw new InvalidOperationException("The API contract doesn't define what to do for unaligned reads and writes!");
117-
118-
if (values.LongLength * 2 != end - start)
119-
{
120-
// a longer array could be valid, but nothing needs that so don't support it for now
121-
throw new InvalidOperationException("Invalid length of values array");
122-
}
109+
if (addresses.Count() > (uint)values.Length * sizeof(ushort)) throw new ArgumentException($"Length of {nameof(values)} must be at least {nameof(addresses)} count.", nameof(values));
123110

124111
using (this.EnterExit())
125112
{
126-
for (var i = 0; i < values.Length; i++, start += 2)
127-
values[i] = PeekUshort(start, bigEndian);
113+
long address = addresses.Start;
114+
for (var i = 0; i < values.Length; i++, address += sizeof(ushort))
115+
values[i] = PeekUshort(address, bigEndian);
128116
}
129117
}
130118

@@ -133,22 +121,13 @@ public virtual void BulkPeekUint(Range<long> addresses, bool bigEndian, uint[] v
133121
if (addresses is null) throw new ArgumentNullException(paramName: nameof(addresses));
134122
if (values is null) throw new ArgumentNullException(paramName: nameof(values));
135123

136-
var start = addresses.Start;
137-
var end = addresses.EndInclusive + 1;
138-
139-
if ((start & 3) != 0 || (end & 3) != 0)
140-
throw new InvalidOperationException("The API contract doesn't define what to do for unaligned reads and writes!");
141-
142-
if (values.LongLength * 4 != end - start)
143-
{
144-
// a longer array could be valid, but nothing needs that so don't support it for now
145-
throw new InvalidOperationException("Invalid length of values array");
146-
}
124+
if (addresses.Count() > (uint)values.Length * sizeof(uint)) throw new ArgumentException($"Length of {nameof(values)} must be at least {nameof(addresses)} count.", nameof(values));
147125

148126
using (this.EnterExit())
149127
{
150-
for (var i = 0; i < values.Length; i++, start += 4)
151-
values[i] = PeekUint(start, bigEndian);
128+
var address = addresses.Start;
129+
for (var i = 0; i < values.Length; i++, address += sizeof(uint))
130+
values[i] = PeekUint(address, bigEndian);
152131
}
153132
}
154133

0 commit comments

Comments
 (0)