diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2013-02-03 16:07:56 -0800 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2013-02-03 16:07:56 -0800 |
| commit | 0f68b90a9156d3251b22c89423ae3f710980d2c9 (patch) | |
| tree | fb6d7053e8276f4942a9dccfe1b0e00be373803e /src | |
| parent | d3626f6b7da64c2f897b24df4b4380be75604903 (diff) | |
| parent | eaf32e02e0501d2f46aefd78a4fee9288073091e (diff) | |
| download | mruby-0f68b90a9156d3251b22c89423ae3f710980d2c9.tar.gz mruby-0f68b90a9156d3251b22c89423ae3f710980d2c9.zip | |
Merge pull request #817 from masamitsu-murase/restore_arena_in_string_split
Restore arena in `String#split`.
Diffstat (limited to 'src')
| -rw-r--r-- | src/string.c | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/src/string.c b/src/string.c index df74bb3c8..99ea9753e 100644 --- a/src/string.c +++ b/src/string.c @@ -2141,6 +2141,7 @@ mrb_str_split_m(mrb_state *mrb, mrb_value str) end = beg; while (ptr < eptr) { + int ai = mrb_gc_arena_save(mrb); c = (unsigned char)*ptr++; if (skip) { if (ascii_isspace(c)) { @@ -2154,6 +2155,7 @@ mrb_str_split_m(mrb_state *mrb, mrb_value str) } else if (ascii_isspace(c)) { mrb_ary_push(mrb, result, mrb_str_subseq(mrb, str, beg, end-beg)); + mrb_gc_arena_restore(mrb, ai); skip = 1; beg = ptr - bptr; if (lim >= 0) ++i; @@ -2170,18 +2172,22 @@ mrb_str_split_m(mrb_state *mrb, mrb_value str) long slen = RSTRING_LEN(spat); if (slen == 0) { + int ai = mrb_gc_arena_save(mrb); while (ptr < eptr) { mrb_ary_push(mrb, result, mrb_str_subseq(mrb, str, ptr-temp, 1)); + mrb_gc_arena_restore(mrb, ai); ptr++; if (lim >= 0 && lim <= ++i) break; } } else { char *sptr = RSTRING_PTR(spat); + int ai = mrb_gc_arena_save(mrb); while (ptr < eptr && (end = mrb_memsearch(sptr, slen, ptr, eptr - ptr)) >= 0) { mrb_ary_push(mrb, result, mrb_str_subseq(mrb, str, ptr - temp, end)); + mrb_gc_arena_restore(mrb, ai); ptr += end + slen; if (lim >= 0 && lim <= ++i) break; } @@ -2198,14 +2204,18 @@ mrb_str_split_m(mrb_state *mrb, mrb_value str) struct re_registers *regs; while ((end = mrb_reg_search(mrb, spat, str, start, 0)) >= 0) { + int ai; regs = RMATCH_REGS(mrb_backref_get(mrb)); + ai = mrb_gc_arena_save(mrb); if (start == end && BEG(0) == END(0)) { if (!ptr) { mrb_ary_push(mrb, result, mrb_str_new_empty(mrb, str)); + mrb_gc_arena_restore(mrb, ai); break; } else if (last_null == 1) { mrb_ary_push(mrb, result, mrb_str_subseq(mrb, str, beg, len)); + mrb_gc_arena_restore(mrb, ai); beg = start; } else { @@ -2219,6 +2229,7 @@ mrb_str_split_m(mrb_state *mrb, mrb_value str) } else { mrb_ary_push(mrb, result, mrb_str_subseq(mrb, str, beg, end-beg)); + mrb_gc_arena_restore(mrb, ai); beg = start = END(0); } last_null = 0; @@ -2230,6 +2241,7 @@ mrb_str_split_m(mrb_state *mrb, mrb_value str) else tmp = mrb_str_subseq(mrb, str, BEG(idx), END(idx)-BEG(idx)); mrb_ary_push(mrb, result, tmp); + mrb_gc_arena_restore(mrb, ai); } if (lim >= 0 && lim <= ++i) break; } |
