summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2010-10-03 21:41:28 -0700
committerKaz Kylheku <kaz@kylheku.com>2010-10-03 21:41:28 -0700
commit20bec5ff6a3bfb4ffa7ae475f762a20ac42df41b (patch)
tree02929776a57ea839d6fbf487cb6275dc8db50296
parent85b8ba36fbf879f7dc8304340fb5187735b6cb37 (diff)
downloadtxr-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--ChangeLog10
-rw-r--r--lib.c12
-rw-r--r--lib.h2
3 files changed, 23 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index ee4b19cd..6ec76f4d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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.
diff --git a/lib.c b/lib.c
index 99edd835..4d3c511a 100644
--- a/lib.c
+++ b/lib.c
@@ -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;
}
diff --git a/lib.h b/lib.h
index 233e4a0a..f1022c67 100644
--- a/lib.h
+++ b/lib.h
@@ -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 {