@@ -239,10 +239,73 @@ contract DynamicArrayLibTest is SoladyTest {
239239 }
240240 }
241241
242- function testDynamicArrayCopy (uint256 [] memory data ) public {
242+ function testDynamicArrayCopyOrAllSlice () public {
243+ uint256 [] memory data;
244+ uint256 [] memory data2 = new uint256 [](1 );
245+ data2[0 ] = 600972374956821603611096798192277940001591154517179782006087886208744463727 ;
246+ this .testDynamicArrayCopyOrAllSlice (data, data2, 0 );
247+ }
248+
249+ function testDynamicArrayCopyOrAllSlice (
250+ uint256 [] calldata data ,
251+ uint256 [] calldata data2 ,
252+ uint256 r
253+ ) public {
254+ DynamicArrayLib.DynamicArray memory a;
255+ DynamicArrayLib.DynamicArray memory b;
256+ DynamicArrayLib.DynamicArray memory aCopy;
257+ for (uint256 i; i < data.length ; ++ i) {
258+ a.p (data[i] & (2 ** 160 - 1 ));
259+ b.p (data[i]);
260+ if (r & 2 == 0 ) {
261+ _checkMemory (a.data);
262+ _checkMemory (b.data);
263+ }
264+ }
265+ bytes32 h = keccak256 (abi.encodePacked (b.data));
266+ aCopy = r & 1 == 0 ? a.copy () : a.slice (0 );
267+ /// @solidity memory-safe-assembly
268+ assembly {
269+ log0 (a, 0x20 )
270+ log0 (b, 0x20 )
271+ log0 (aCopy, 0x20 )
272+ }
273+ for (uint256 i; i < data2.length ; ++ i) {
274+ aCopy.p (data2[i]);
275+ }
276+ /// @solidity memory-safe-assembly
277+ assembly {
278+ log0 (a, 0x20 )
279+ log0 (b, 0x20 )
280+ log0 (aCopy, 0x20 )
281+ }
282+ for (uint256 i; i < data2.length ; ++ i) {
283+ a.p (data2[i]);
284+ }
285+ /// @solidity memory-safe-assembly
286+ assembly {
287+ log0 (a, 0x20 )
288+ log0 (b, 0x20 )
289+ log0 (aCopy, 0x20 )
290+ }
291+ assertEq (a.data, aCopy.data);
292+ assertEq (keccak256 (abi.encodePacked (b.data)), h);
293+ }
294+
295+ function testDynamicArrayCopy (uint256 [] memory data , uint256 r ) public {
296+ if (r & 0xff00 == 0 ) {
297+ /// @solidity memory-safe-assembly
298+ assembly {
299+ data := 0x60
300+ }
301+ }
243302 DynamicArrayLib.DynamicArray memory a;
244303 a.data = data;
245304 DynamicArrayLib.DynamicArray memory b = a.copy ();
305+ if (r & 2 == 0 ) {
306+ _checkMemory (a.data);
307+ _checkMemory (b.data);
308+ }
246309 assertEq (a.data, b.data);
247310 a.p (1 );
248311 assertNotEq (a.data, b.data);
0 commit comments