summaryrefslogtreecommitdiffhomepage
path: root/mrbgems/mruby-string-ext
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2016-12-25 00:44:33 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2016-12-28 13:00:28 +0900
commit803bf010ca9a963abfab2ec348ae1c5c98f41bc2 (patch)
treeb523771edfc3c07d98aa5fb22c109eb5a75475bf /mrbgems/mruby-string-ext
parent6af8cc36b9403300091821ebef6629054aca8fc9 (diff)
downloadmruby-803bf010ca9a963abfab2ec348ae1c5c98f41bc2.tar.gz
mruby-803bf010ca9a963abfab2ec348ae1c5c98f41bc2.zip
save/restore arena index around yield; ref #3359
Diffstat (limited to 'mrbgems/mruby-string-ext')
-rw-r--r--mrbgems/mruby-string-ext/src/string.c4
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++;