diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2010-10-03 21:41:28 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2010-10-03 21:41:28 -0700 |
commit | 20bec5ff6a3bfb4ffa7ae475f762a20ac42df41b (patch) | |
tree | 02929776a57ea839d6fbf487cb6275dc8db50296 /lib.c | |
parent | 85b8ba36fbf879f7dc8304340fb5187735b6cb37 (diff) | |
download | txr-20bec5ff6a3bfb4ffa7ae475f762a20ac42df41b.tar.gz txr-20bec5ff6a3bfb4ffa7ae475f762a20ac42df41b.tar.bz2 txr-20bec5ff6a3bfb4ffa7ae475f762a20ac42df41b.zip |
* lib.h (lazy_string): Fix incorrect comment.
* lib.c (split_str, split_str_set): It is necessary to protect input
parameters against GC, because we cache their internal pointers,
after which we no longer refer to the objects themselves. Moreover,
we perform object allocation, and then keep using the internal
pointers.
Diffstat (limited to 'lib.c')
-rw-r--r-- | lib.c | 12 |
1 files changed, 12 insertions, 0 deletions
@@ -999,6 +999,9 @@ val split_str(val str, val sep) const wchar_t *csep = c_str(sep); size_t len_sep = c_num(length_str(sep)); + prot1(&str); + prot1(&sep); + list_collect_decl (out, iter); for (; *cstr != 0; cstr += len_sep) { @@ -1010,6 +1013,9 @@ val split_str(val str, val sep) cstr += span; } + rel1(&sep); + rel1(&str); + return out; } @@ -1019,6 +1025,9 @@ val split_str_set(val str, val set) const wchar_t *cset = c_str(set); list_collect_decl (out, iter); + prot1(&str); + prot1(&set); + for (; *cstr != 0; cstr++) { size_t span = wcscspn(cstr, cset); val piece = mkustring(num(span)); @@ -1027,6 +1036,9 @@ val split_str_set(val str, val set) cstr += span; } + rel1(&set); + rel1(&str); + return out; } |