From a9d41d03d13b369118a5e12a42898d8af894107f Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Sat, 4 Oct 2014 08:14:31 -0700 Subject: Keep regex source code in regex objects, in anticipation of pretty-printing. Fix object construction bugs. * regex.c (struct regex): New member, source. (regex_mark): Ensure source is visited by garbage collector. (regex_compile): Store regex_sexp in source. Fix violations of section 3.2 of HACKING document. --- ChangeLog | 10 ++++++++++ regex.c | 15 +++++++++++++-- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index 9fb4c8ba..db72ecee 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2014-10-04 Kaz Kylheku + + Keep regex source code in regex objects, in anticipation + of pretty-printing. Fix object construction bugs. + + * regex.c (struct regex): New member, source. + (regex_mark): Ensure source is visited by garbage collector. + (regex_compile): Store regex_sexp in source. + Fix violations of section 3.2 of HACKING document. + 2014-10-03 Kaz Kylheku Eliminating the extra list wrapping applied to regular diff --git a/regex.c b/regex.c index 8c93c964..df07cf74 100644 --- a/regex.c +++ b/regex.c @@ -60,6 +60,7 @@ typedef struct regex { struct nfa nfa; val dv; } r; + val source; } regex_t; /* @@ -1301,6 +1302,7 @@ static void regex_mark(val obj) regex_t *regex = (regex_t *) obj->co.handle; if (regex->kind == REGEX_DV) gc_mark(regex->r.dv); + gc_mark(regex->source); } static struct cobj_ops regex_obj_ops = { @@ -1663,14 +1665,23 @@ val regex_compile(val regex_sexp, val error_stream) return if2(regex_sexp, regex_compile(regex_sexp, error_stream)); } else if (opt_derivative_regex || regex_requires_dv(regex_sexp)) { regex_t *regex = (regex_t *) chk_malloc(sizeof *regex); + val ret; regex->kind = REGEX_DV; + regex->r.dv = nil; + regex->source = nil; + ret = cobj((mem_t *) regex, regex_s, ®ex_obj_ops); regex->r.dv = dv_compile_regex(regex_sexp); - return cobj((mem_t *) regex, regex_s, ®ex_obj_ops); + regex->source = regex_sexp; + return ret; } else { regex_t *regex = (regex_t *) chk_malloc(sizeof *regex); + val ret; regex->kind = REGEX_NFA; + regex->source = nil; + ret = cobj((mem_t *) regex, regex_s, ®ex_obj_ops); regex->r.nfa = nfa_compile_regex(regex_sexp); - return cobj((mem_t *) regex, regex_s, ®ex_obj_ops); + regex->source = regex_sexp; + return ret; } } -- cgit v1.2.3