Deep copies are easily performed using Pickles. An object graph is Pickled to a text writer into a TEXT. Then, a copy is created by unpickling a new object graph from a text reader created from the TEXT.
Shallow copies are less often needed but may be performed with the following procedure:
PROCEDURE Duplicate (r: REFANY): REFANY = VAR tc := TYPECODE (r); n_dims : INTEGER; res : REFANY; shape : RTHeapRep.ArrayShape; BEGIN IF (r = NIL) THEN RETURN NIL END; (* allocate a new object of the same type (and shape) as the old one *) RTHeapRep.UnsafeGetShape (r, n_dims, shape); IF (n_dims <= 0) THEN res := RTAllocator.NewTraced (tc); ELSE res := RTAllocator.NewTracedArray (tc, SUBARRAY(shape^, 0, n_dims)); END; (* copy the old data into the new object *) RTMisc.Copy (RTHeap.GetDataAdr (r), RTHeap.GetDataAdr (res), RTHeap.GetDataSize (r)); RETURN res; END Duplicate;