summaryrefslogtreecommitdiffstats
path: root/tests/006/freeform-3.txr
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2021-01-25 20:21:07 -0800
committerKaz Kylheku <kaz@kylheku.com>2021-01-25 15:53:23 -0800
commit2e6af871326f4eb6a2674034c5a02afca2877f26 (patch)
tree929e12b547a678a05d7bb640203eb4264692ccb7 /tests/006/freeform-3.txr
parent381e0669fc3d0771a2c236ad816b6609cb4ff61c (diff)
downloadtxr-2e6af871326f4eb6a2674034c5a02afca2877f26.tar.gz
txr-2e6af871326f4eb6a2674034c5a02afca2877f26.tar.bz2
txr-2e6af871326f4eb6a2674034c5a02afca2877f26.zip
lazy-sub-str: bugfix: invalid substructure sharing.
This addresses a bug manifesting itself as a regression in the behavior of @(freeform), which was reported by Frank Schwidom. The sub_str operation calls lazy_subs_str for a lazy string. But lazy_sub_str again relies on sub_str for extracting part of the lazy string prefix. But sub_str can potentially return the whole object rather than a copy of a substring of it. In this case, lazy_sub_str produces a new lazy string object which shares the prefix string object with the original lazy string. This is incorrect because the lazy string data type destructively manipulates the prefix. It means that operations one one lazy string are mucking with the prefix of another lazy string. * lib.c (lazy_sub_str): When creating the new lazy string object, make a copy of the prefix string pulled from the original. We do the carefully: the copy of the prefix is made before the make_obj call which allocates the new lazy string, otherwise we create a wrong-way assignment from the perspective of generational GC. * tests/006/freeform-4.txr: New test case, from Frank. * tests/006/freeform-4.expected: Expected output of test case.
Diffstat (limited to 'tests/006/freeform-3.txr')
0 files changed, 0 insertions, 0 deletions