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 | |
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.
-rw-r--r-- | ChangeLog | 10 | ||||
-rw-r--r-- | lib.c | 12 | ||||
-rw-r--r-- | lib.h | 2 |
3 files changed, 23 insertions, 1 deletions
@@ -1,3 +1,13 @@ +2010-10-03 Kaz Kylheku <kkylheku@gmail.com> + + * 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. + 2010-09-30 Kaz Kylheku <kkylheku@gmail.com> * txr.1: Fix formatting problem. @@ -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; } @@ -137,7 +137,7 @@ struct lazy_string { type_t type; val prefix; /* actual string part */ val list; /* remaining list */ - val opts; /* ( limit . sepstring ) */ + val opts; /* ( separator . limit ) */ }; struct cobj { |