@@ -331,18 +331,34 @@ void copyHeapEquableArray(
331331 foreach (i; 0 .. count) {
332332 dst[i]._serialized = src[i]._serialized;
333333 dst[i]._kind = src[i]._kind;
334- dst[i]._elementCount = src[i]._elementCount;
335- dst[i]._elements = cast (HeapEquableValue* ) src[i]._elements;
336334 dst[i]._serialized.incrementRefCount();
335+ dst[i]._objectRef = cast (Object ) src[i]._objectRef;
336+
337+ // Deep copy nested elements
338+ if (src[i]._elements ! is null && src[i]._elementCount > 0 ) {
339+ dst[i]._elements = duplicateHeapEquableArray(src[i]._elements, src[i]._elementCount);
340+ dst[i]._elementCount = (dst[i]._elements ! is null ) ? src[i]._elementCount : 0 ;
341+ } else {
342+ dst[i]._elements = null ;
343+ dst[i]._elementCount = 0 ;
344+ }
337345 }
338346}
339347
340348void copyHeapEquableElement (HeapEquableValue* dst, ref HeapEquableValue src) @trusted @nogc nothrow {
341349 dst._serialized = src._serialized;
342350 dst._kind = src._kind;
343- dst._elementCount = src._elementCount;
344- dst._elements = src._elements;
345351 dst._serialized.incrementRefCount();
352+ dst._objectRef = src._objectRef;
353+
354+ // Deep copy nested elements
355+ if (src._elements ! is null && src._elementCount > 0 ) {
356+ dst._elements = duplicateHeapEquableArray(src._elements, src._elementCount);
357+ dst._elementCount = (dst._elements ! is null ) ? src._elementCount : 0 ;
358+ } else {
359+ dst._elements = null ;
360+ dst._elementCount = 0 ;
361+ }
346362}
347363
348364HeapEquableValue* duplicateHeapEquableArray (
@@ -377,6 +393,10 @@ HeapEquableValue[] allocateSingleGCElement(ref const HeapEquableValue value) @tr
377393 try {
378394 auto result = new HeapEquableValue[1 ];
379395 result[0 ] = value;
396+ // Clear the nested elements pointer so GC won't try to free malloc'd memory.
397+ // The copy still has valid serialized data for comparison.
398+ result[0 ]._elements = null ;
399+ result[0 ]._elementCount = 0 ;
380400 return result;
381401 } catch (Exception ) {
382402 return [];
@@ -388,6 +408,10 @@ HeapEquableValue[] copyToGCArray(const HeapEquableValue* elements, size_t count)
388408 auto result = new HeapEquableValue[count];
389409 foreach (i; 0 .. count) {
390410 result[i] = elements[i];
411+ // Clear the nested elements pointer so GC won't try to free malloc'd memory.
412+ // The copy still has valid serialized data for comparison.
413+ result[i]._elements = null ;
414+ result[i]._elementCount = 0 ;
391415 }
392416 return result;
393417 } catch (Exception ) {
0 commit comments