diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2016-12-25 00:44:33 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2016-12-28 13:00:28 +0900 |
| commit | 803bf010ca9a963abfab2ec348ae1c5c98f41bc2 (patch) | |
| tree | b523771edfc3c07d98aa5fb22c109eb5a75475bf /mrbgems | |
| parent | 6af8cc36b9403300091821ebef6629054aca8fc9 (diff) | |
| download | mruby-803bf010ca9a963abfab2ec348ae1c5c98f41bc2.tar.gz mruby-803bf010ca9a963abfab2ec348ae1c5c98f41bc2.zip | |
save/restore arena index around yield; ref #3359
Diffstat (limited to 'mrbgems')
| -rw-r--r-- | mrbgems/mruby-string-ext/src/string.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/mrbgems/mruby-string-ext/src/string.c b/mrbgems/mruby-string-ext/src/string.c index dfac907ec..d48028b4a 100644 --- a/mrbgems/mruby-string-ext/src/string.c +++ b/mrbgems/mruby-string-ext/src/string.c @@ -315,7 +315,7 @@ mrb_str_lines(mrb_state *mrb, mrb_value self) mrb_get_args(mrb, "&", &blk); result = mrb_ary_new(mrb); - + ai = mrb_gc_arena_save(mrb); if (!mrb_nil_p(blk)) { while (p < e) { t = p; @@ -324,6 +324,7 @@ mrb_str_lines(mrb_state *mrb, mrb_value self) len = (mrb_int) (p - t); arg = mrb_str_new(mrb, t, len); mrb_yield_argv(mrb, blk, 1, &arg); + mrb_gc_arena_restore(mrb, ai); if (b != RSTRING_PTR(self)) { ptrdiff_t diff = p - b; b = RSTRING_PTR(self); @@ -334,7 +335,6 @@ mrb_str_lines(mrb_state *mrb, mrb_value self) return self; } while (p < e) { - ai = mrb_gc_arena_save(mrb); t = p; while (p < e && *p != '\n') p++; if (*p == '\n') p++; |
