diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2013-08-26 16:33:27 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2013-08-26 16:33:27 +0900 |
| commit | f3c8cf673556ad6420dbe4e21ee532b1a68b3301 (patch) | |
| tree | bd47c6c32df5b4d58beed662e0f9735ce5c99338 /src | |
| parent | f18837886ca0b41e3ee54df0655ee332eca22e3f (diff) | |
| download | mruby-f3c8cf673556ad6420dbe4e21ee532b1a68b3301.tar.gz mruby-f3c8cf673556ad6420dbe4e21ee532b1a68b3301.zip | |
do not use mrb_alloca() that keeps memory until mrb_state freed
Diffstat (limited to 'src')
| -rw-r--r-- | src/backtrace.c | 22 |
1 files changed, 4 insertions, 18 deletions
diff --git a/src/backtrace.c b/src/backtrace.c index a70330add..77906e843 100644 --- a/src/backtrace.c +++ b/src/backtrace.c @@ -31,7 +31,7 @@ static void get_backtrace_i(mrb_state *mrb, void *stream, int level, const char *format, ...) { va_list ap; - mrb_value ary; + mrb_value ary, str; int len, ai; if (level > 0) { @@ -42,24 +42,10 @@ get_backtrace_i(mrb_state *mrb, void *stream, int level, const char *format, ... ary = mrb_obj_value((struct RArray*)stream); va_start(ap, format); len = vsnprintf(NULL, 0, format, ap); + str = mrb_str_new(mrb, 0, len); + vsnprintf(RSTRING_PTR(str), len, format, ap); + mrb_ary_push(mrb, ary, str); va_end(ap); - - if (len < MIN_BUFSIZE) { - char buf[MIN_BUFSIZE + 1]; - - va_start(ap, format); - vsnprintf(buf, MIN_BUFSIZE, format, ap); - va_end(ap); - mrb_ary_push(mrb, ary, mrb_str_new(mrb, buf, len)); - } - else { - char *buf = (char*)mrb_alloca(mrb, len + 1); - - va_start(ap, format); - vsnprintf(buf, len, format, ap); - va_end(ap); - mrb_ary_push(mrb, ary, mrb_str_new(mrb, buf, len)); - } mrb_gc_arena_restore(mrb, ai); } |
