From f2da76b6ef3c0d96fa8b1526f96d0037a9411879 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Tue, 16 Oct 2012 22:24:40 +0900 Subject: register number adjustment for case statement was wrong; close #487 --- src/codegen.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'src/codegen.c') diff --git a/src/codegen.c b/src/codegen.c index 50d3e3d3b..0077f5593 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -1200,17 +1200,17 @@ codegen(codegen_scope *s, node *tree, int val) genop(s, MKOP_sBx(OP_JMP, 0)); dispatch_linked(s, pos2); } - pop(); + pop(); /* pop HEAD */ codegen(s, tree->car->cdr, val); - pop(); + if (val) pop(); tmp = new_label(s); genop(s, MKOP_sBx(OP_JMP, pos3)); pos3 = tmp; if (pos1) dispatch(s, pos1); tree = tree->cdr; - push(); + push(); /* push HEAD */ } - pop(); + pop(); /* pop HEAD */ genop(s, MKOP_A(OP_LOADNIL, cursp())); if (val) push(); if (pos3) dispatch_linked(s, pos3); -- cgit v1.2.3 From 18dd60c162c2e5e9909864333cc1013df471cdd9 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Tue, 16 Oct 2012 23:47:16 +0900 Subject: remove wasting stack space --- src/codegen.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/codegen.c') diff --git a/src/codegen.c b/src/codegen.c index 0077f5593..f195c378a 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -2055,7 +2055,7 @@ scope_new(mrb_state *mrb, codegen_scope *prev, node *lv) p->syms = (mrb_sym*)mrb_malloc(mrb, sizeof(mrb_sym)*256); p->lv = lv; - p->sp += node_len(lv)+2; + p->sp += node_len(lv)+1; /* add self */ p->nlocals = p->sp; p->ai = mrb->arena_idx; -- cgit v1.2.3 From 8d6f1b04a1f326e3668fd1b2aa0978c2bb38b3ff Mon Sep 17 00:00:00 2001 From: Takashi Sogabe Date: Wed, 17 Oct 2012 12:55:50 +0900 Subject: Fix disappearance of a local variable when return statement is called Commit of #18dd60c causes disappearance of a local variable if return statement is called without arguments. This patch fixes incorrect value of stack pointer. test program: def test_return_cond return if nil obj = 123 p obj p obj.class end test_return_cond output(commit #18dd60c): main Object output(includes this patch): 123 Fixnum --- src/codegen.c | 1 + 1 file changed, 1 insertion(+) (limited to 'src/codegen.c') diff --git a/src/codegen.c b/src/codegen.c index f195c378a..27f217ebe 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -1490,6 +1490,7 @@ codegen(codegen_scope *s, node *tree, int val) else { genop_peep(s, MKOP_AB(OP_RETURN, cursp(), OP_R_NORMAL), NOVAL); } + push(); break; case NODE_YIELD: -- cgit v1.2.3 From 651e8b7e9c513cda100d88216d54ceeb93234f65 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Fri, 19 Oct 2012 23:04:20 +0900 Subject: empty NODE_BEGIN should push nil; close #496 --- src/codegen.c | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'src/codegen.c') diff --git a/src/codegen.c b/src/codegen.c index 27f217ebe..d42a099c8 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -951,6 +951,10 @@ codegen(codegen_scope *s, node *tree, int val) tree = tree->cdr; switch (nt) { case NODE_BEGIN: + if (val && !tree) { + genop(s, MKOP_A(OP_LOADNIL, cursp())); + push(); + } while (tree) { codegen(s, tree->car, tree->cdr ? NOVAL : val); tree = tree->cdr; -- cgit v1.2.3 From da637cac4a3520f7d6d9a69b392be4309f36ef5b Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Sat, 20 Oct 2012 03:30:58 +0900 Subject: should handle break in rescue --- src/codegen.c | 3 +++ src/vm.c | 1 - 2 files changed, 3 insertions(+), 1 deletion(-) (limited to 'src/codegen.c') diff --git a/src/codegen.c b/src/codegen.c index d42a099c8..19a5835fa 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -2146,6 +2146,9 @@ loop_break(codegen_scope *s, node *tree) genop_peep(s, MKOP_A(OP_POPERR, 1), NOVAL); loop = loop->prev; } + while (loop->type == LOOP_RESCUE) { + loop = loop->prev; + } if (loop->type == LOOP_NORMAL) { int tmp; diff --git a/src/vm.c b/src/vm.c index 14efb38f8..a779565be 100644 --- a/src/vm.c +++ b/src/vm.c @@ -1134,7 +1134,6 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) ci = mrb->ci; break; case OP_R_BREAK: - if (!proc->env) goto NORMAL_RETURN; if (proc->env->cioff < 0) { localjump_error(mrb, "break"); goto L_RAISE; -- cgit v1.2.3 From 89a18e4f22de80b836f9d6c3167d71b7078a31bb Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Sat, 20 Oct 2012 03:59:13 +0900 Subject: unexpect break/next/redo/retry should raise LocalJumpError --- src/codegen.c | 2 +- src/vm.c | 8 +++++++- test/t/localjumperror.rb | 7 ++++++- test/t/runtimeerror.rb | 10 +--------- 4 files changed, 15 insertions(+), 12 deletions(-) (limited to 'src/codegen.c') diff --git a/src/codegen.c b/src/codegen.c index 19a5835fa..2482209cc 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -911,7 +911,7 @@ raise_error(codegen_scope *s, const char *msg) { int idx = new_lit(s, mrb_str_new_cstr(s->mrb, msg)); - genop(s, MKOP_ABx(OP_ERR, 0, idx)); + genop(s, MKOP_ABx(OP_ERR, 1, idx)); } static double diff --git a/src/vm.c b/src/vm.c index a779565be..a68d089cc 100644 --- a/src/vm.c +++ b/src/vm.c @@ -1817,8 +1817,14 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) CASE(OP_ERR) { /* Bx raise RuntimeError with message Lit(Bx) */ mrb_value msg = pool[GETARG_Bx(i)]; - mrb_value exc = mrb_exc_new3(mrb, E_RUNTIME_ERROR, msg); + mrb_value exc; + if (GETARG_A(i) == 0) { + exc = mrb_exc_new3(mrb, E_RUNTIME_ERROR, msg); + } + else { + exc = mrb_exc_new3(mrb, E_LOCALJUMP_ERROR, msg); + } mrb->exc = (struct RObject*)mrb_object(exc); goto L_RAISE; } diff --git a/test/t/localjumperror.rb b/test/t/localjumperror.rb index 9d1df9594..ebcec0670 100644 --- a/test/t/localjumperror.rb +++ b/test/t/localjumperror.rb @@ -2,7 +2,12 @@ # LocalJumpError ISO Test assert('LocalJumoError', '15.2.25') do - LocalJumpError.class == Class + begin + # this will cause an exception due to the wrong location + retry + rescue => e1 + end + LocalJumpError.class == Class and e1.class == LocalJumpError end # TODO 15.2.25.2.1 LocalJumpError#exit_value diff --git a/test/t/runtimeerror.rb b/test/t/runtimeerror.rb index 9157293cd..3e0636186 100644 --- a/test/t/runtimeerror.rb +++ b/test/t/runtimeerror.rb @@ -2,13 +2,5 @@ # RuntimeError ISO Test assert('RuntimeError', '15.2.28') do - e2 = nil - begin - # this will cause an exception due to the wrong location - retry - rescue => e1 - e2 = e1 - end - - RuntimeError.class == Class and e2.class == RuntimeError + RuntimeError.class == Class end -- cgit v1.2.3 From 750b7c209c2200a602438a75206f5c3c8391f69e Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Sat, 20 Oct 2012 08:44:25 +0900 Subject: pop register stack before rescue --- src/codegen.c | 1 + 1 file changed, 1 insertion(+) (limited to 'src/codegen.c') diff --git a/src/codegen.c b/src/codegen.c index 2482209cc..7d10ffce8 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -972,6 +972,7 @@ codegen(codegen_scope *s, node *tree, int val) lp->pc1 = onerr; if (tree->car) { codegen(s, tree->car, val); + if (val) pop(); } lp->type = LOOP_RESCUE; noexc = new_label(s); -- cgit v1.2.3 From 7fe6d00ff54fe5cb746ef9370b91d2251751e21f Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Sat, 20 Oct 2012 09:48:04 +0900 Subject: avoid duplicated OP_RETURN --- src/codegen.c | 2 ++ 1 file changed, 2 insertions(+) (limited to 'src/codegen.c') diff --git a/src/codegen.c b/src/codegen.c index 7d10ffce8..1f087b2cd 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -267,6 +267,8 @@ genop_peep(codegen_scope *s, mrb_code i, int val) break; case OP_RETURN: switch (c0) { + case OP_RETURN: + return; case OP_MOVE: s->iseq[s->pc-1] = MKOP_AB(OP_RETURN, GETARG_B(i0), OP_R_NORMAL); return; -- cgit v1.2.3 From 413528ce803135dd63423047accaea142c283fcd Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Tue, 23 Oct 2012 11:35:26 +0900 Subject: adjust regsiter stack for NODE_OP_ASGN; close #499 --- src/codegen.c | 1 + 1 file changed, 1 insertion(+) (limited to 'src/codegen.c') diff --git a/src/codegen.c b/src/codegen.c index 1f087b2cd..df5bc2acf 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -1403,6 +1403,7 @@ codegen(codegen_scope *s, node *tree, int val) codegen(s, tree->cdr->cdr->car, VAL); pop(); gen_assignment(s, tree->car, cursp(), val); + if (val) pop(); dispatch(s, pos); break; } -- cgit v1.2.3 From 09376f9b2a6ce2c56f5a4fc7abb88ea4e68c59e3 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Tue, 23 Oct 2012 14:14:26 +0900 Subject: skip useless OP_MOVE in peephole optimization --- src/codegen.c | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'src/codegen.c') diff --git a/src/codegen.c b/src/codegen.c index df5bc2acf..b0e6f8fd1 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -170,6 +170,10 @@ genop_peep(codegen_scope *s, mrb_code i, int val) switch (c1) { case OP_MOVE: + if (GETARG_A(i) == GETARG_B(i)) { + /* skip useless OP_MOVE */ + return; + } if (val) break; switch (c0) { case OP_MOVE: -- cgit v1.2.3 From 32f9cdc97d769554f01543ede73a702e0c973346 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Tue, 23 Oct 2012 14:15:29 +0900 Subject: adjust regsiter stack for NODE_OP_ASGN that use OP_SEND --- src/codegen.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) (limited to 'src/codegen.c') diff --git a/src/codegen.c b/src/codegen.c index b0e6f8fd1..2d01ed701 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -853,8 +853,11 @@ gen_assignment(codegen_scope *s, node *node, int sp, int val) case NODE_CALL: push(); - gen_call(s, node, attrsym(s, sym(node->cdr->car)), sp, val); - val = NOVAL; /* push should have done in gen_call() */ + gen_call(s, node, attrsym(s, sym(node->cdr->car)), sp, NOVAL); + pop(); + if (val) { + genop_peep(s, MKOP_AB(OP_MOVE, cursp(), sp), val); + } break; default: -- cgit v1.2.3 From 1933e2660c86c0731806993a9a212116bb454622 Mon Sep 17 00:00:00 2001 From: Masaki Muranaka Date: Wed, 24 Oct 2012 17:00:54 +0900 Subject: Use substitution instead of memset in structure initialization. --- include/mruby/data.h | 2 +- src/codegen.c | 8 ++++++-- src/gc.c | 3 ++- src/load.c | 8 ++++++-- src/parse.y | 3 ++- src/proc.c | 3 ++- src/state.c | 8 ++++++-- src/vm.c | 9 +++++---- 8 files changed, 30 insertions(+), 14 deletions(-) (limited to 'src/codegen.c') diff --git a/include/mruby/data.h b/include/mruby/data.h index ad91e0044..b9bedb3f9 100644 --- a/include/mruby/data.h +++ b/include/mruby/data.h @@ -30,7 +30,7 @@ struct RData *mrb_data_object_alloc(mrb_state *mrb, struct RClass* klass, void * #define Data_Make_Struct(mrb,klass,strct,type,sval) (\ sval = mrb_malloc(mrb, sizeof(strct)),\ - memset(sval, 0, sizeof(strct)),\ + { static const strct zero = { 0 }; *sval = zero},\ Data_Wrap_Struct(mrb,klass,type,sval)\ ) diff --git a/src/codegen.c b/src/codegen.c index 2d01ed701..7c3182599 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -453,7 +453,10 @@ new_sym(codegen_scope *s, mrb_sym sym) } if (s->slen > 125 && s->slen < 256) { s->syms = (mrb_sym *)codegen_realloc(s, s->syms, sizeof(mrb_sym)*65536); - memset(s->syms+s->slen, 0, sizeof(mrb_sym)*(256-s->slen)); + for (i = 0; i < 256 - s->slen; i++) { + static const mrb_sym mrb_sym_zero = { 0 }; + s->syms[i + s->slen] = mrb_sym_zero; + } s->slen = 256; } s->syms[s->slen] = sym; @@ -2049,11 +2052,12 @@ codegen(codegen_scope *s, node *tree, int val) static codegen_scope* scope_new(mrb_state *mrb, codegen_scope *prev, node *lv) { + static const codegen_scope codegen_scope_zero = { 0 }; mrb_pool *pool = mrb_pool_open(mrb); codegen_scope *p = (codegen_scope *)mrb_pool_alloc(pool, sizeof(codegen_scope)); if (!p) return 0; - memset(p, 0, sizeof(codegen_scope)); + *p = codegen_scope_zero; p->mrb = mrb; p->mpool = pool; if (!prev) return p; diff --git a/src/gc.c b/src/gc.c index 46699aea3..d92a231b8 100644 --- a/src/gc.c +++ b/src/gc.c @@ -326,6 +326,7 @@ struct RBasic* mrb_obj_alloc(mrb_state *mrb, enum mrb_vtype ttype, struct RClass *cls) { struct RBasic *p; + static const RVALUE RVALUE_zero = { 0 }; #ifdef MRB_GC_STRESS mrb_garbage_collect(mrb); @@ -345,7 +346,7 @@ mrb_obj_alloc(mrb_state *mrb, enum mrb_vtype ttype, struct RClass *cls) mrb->live++; gc_protect(mrb, p); - memset(p, 0, sizeof(RVALUE)); + *(RVALUE *)p = RVALUE_zero; p->tt = ttype; p->c = cls; paint_partial_white(mrb, p); diff --git a/src/load.c b/src/load.c index a2ae4100b..751c2619b 100644 --- a/src/load.c +++ b/src/load.c @@ -448,7 +448,10 @@ read_rite_irep_record(mrb_state *mrb, unsigned char *src, mrb_irep *irep, uint32 goto error_exit; } - memset(irep->syms, 0, sizeof(mrb_sym)*(irep->slen)); + for (i = 0; i < irep->slen; i++) { + static const mrb_sym mrb_sym_zero = { 0 }; + *irep->syms = mrb_sym_zero; + } for (i=0; islen; i++) { snl = bin_to_uint16(src); //symbol name length src += MRB_DUMP_SIZE_OF_SHORT; @@ -509,11 +512,12 @@ mrb_read_irep(mrb_state *mrb, const char *bin) mrb_add_irep(mrb, sirep + nirep); for (n=0,i=sirep; nirep[i] = (mrb_irep *)mrb_malloc(mrb, sizeof(mrb_irep))) == NULL) { ret = MRB_DUMP_GENERAL_FAILURE; goto error_exit; } - memset(mrb->irep[i], 0, sizeof(mrb_irep)); + *mrb->irep[i] = mrb_irep_zero; } src += sizeof(bin_header) + MRB_DUMP_SIZE_OF_SHORT; //header + crc diff --git a/src/parse.y b/src/parse.y index b903ac840..cffb6ba09 100644 --- a/src/parse.y +++ b/src/parse.y @@ -4747,13 +4747,14 @@ mrb_parser_new(mrb_state *mrb) { mrb_pool *pool; parser_state *p; + static const parser_state parser_state_zero = { 0 }; pool = mrb_pool_open(mrb); if (!pool) return 0; p = (parser_state *)mrb_pool_alloc(pool, sizeof(parser_state)); if (!p) return 0; - memset(p, 0, sizeof(parser_state)); + *p = parser_state_zero; p->mrb = mrb; p->pool = pool; p->in_def = p->in_single = 0; diff --git a/src/proc.c b/src/proc.c index 3321c2a91..07834e86d 100644 --- a/src/proc.c +++ b/src/proc.c @@ -149,11 +149,12 @@ mrb_init_proc(mrb_state *mrb) { struct RProc *m; mrb_irep *call_irep = (mrb_irep *)mrb_alloca(mrb, sizeof(mrb_irep)); + static const mrb_irep mrb_irep_zero = { 0 }; if ( call_iseq == NULL || call_irep == NULL ) return; - memset(call_irep, 0, sizeof(mrb_irep)); + *call_irep = mrb_irep_zero; call_irep->flags = MRB_ISEQ_NO_FREE; call_irep->idx = -1; call_irep->iseq = call_iseq; diff --git a/src/state.c b/src/state.c index 991be310e..8bd222fb5 100644 --- a/src/state.c +++ b/src/state.c @@ -16,10 +16,11 @@ void mrb_init_ext(mrb_state*); mrb_state* mrb_open_allocf(mrb_allocf f, void *ud) { + static const mrb_state mrb_state_zero = { 0 }; mrb_state *mrb = (mrb_state *)(f)(NULL, NULL, sizeof(mrb_state), ud); if (mrb == NULL) return NULL; - memset(mrb, 0, sizeof(mrb_state)); + *mrb = mrb_state_zero; mrb->ud = ud; mrb->allocf = f; mrb->current_white_part = MRB_GC_WHITE_A; @@ -119,12 +120,15 @@ mrb_add_irep(mrb_state *mrb, int idx) mrb->irep_capa = max; } else if (mrb->irep_capa <= idx) { + int i; size_t old_capa = mrb->irep_capa; while (mrb->irep_capa <= idx) { mrb->irep_capa *= 2; } mrb->irep = (mrb_irep **)mrb_realloc(mrb, mrb->irep, sizeof(mrb_irep*)*mrb->irep_capa); - memset(mrb->irep + old_capa, 0, sizeof(mrb_irep*) * (mrb->irep_capa - old_capa)); + for (i = old_capa; i < mrb->irep_capa - old_capa; i++) { + mrb->irep[i] = NULL; + } } } diff --git a/src/vm.c b/src/vm.c index 693e2413a..120e0d4c0 100644 --- a/src/vm.c +++ b/src/vm.c @@ -100,15 +100,16 @@ stack_extend(mrb_state *mrb, int room, int keep) envadjust(mrb, oldbase, mrb->stbase); } if (room > keep) { -#ifndef MRB_NAN_BOXING - memset(mrb->stack+keep, 0, sizeof(mrb_value) * (room-keep)); -#else int i; for (i=keep; istack[i] = mrb_value_zero; +#else SET_NIL_VALUE(mrb->stack[i]); - } #endif + } } } -- cgit v1.2.3 From 15f46a1feba74cba4f25ec99df79a3f1e07b0b09 Mon Sep 17 00:00:00 2001 From: Yuichiro MASUI Date: Sat, 27 Oct 2012 14:26:50 +0900 Subject: define convert method mrb_int/mrb_float with C string --- include/mrbconf.h | 9 ++++++++- src/codegen.c | 4 ++-- src/dump.c | 8 ++++---- src/load.c | 4 ++-- src/numeric.c | 10 +++++----- 5 files changed, 21 insertions(+), 14 deletions(-) (limited to 'src/codegen.c') diff --git a/include/mrbconf.h b/include/mrbconf.h index 76c1b37f9..841ef1823 100644 --- a/include/mrbconf.h +++ b/include/mrbconf.h @@ -55,19 +55,26 @@ #ifdef MRB_USE_FLOAT typedef float mrb_float; +#define mrb_float_to_str(buf, i) sprintf((buf), "%.7e", (i)) +#define str_to_mrb_float(buf) (mrb_float)strtof((buf),NULL) #else typedef double mrb_float; +#define mrb_float_to_str(buf, i) sprintf((buf), "%.16e", (i)) +#define str_to_mrb_float(buf) (mrb_float)strtod((buf),NULL) #endif -#define readfloat(p) (mrb_float)strtod((p),NULL) #ifdef MRB_NAN_BOXING typedef int32_t mrb_int; #define MRB_INT_MIN INT32_MIN #define MRB_INT_MAX INT32_MAX +#define mrb_int_to_str(buf, i) sprintf((buf), "%d", (i)) +#define str_to_mrb_int(buf) (mrb_int)strtol((buf), NULL, 10); #else typedef int mrb_int; #define MRB_INT_MIN INT_MIN #define MRB_INT_MAX INT_MAX +#define mrb_int_to_str(buf, i) sprintf((buf), "%d", (i)) +#define str_to_mrb_int(buf) (mrb_int)strtol((buf), NULL, 10); #endif typedef short mrb_sym; diff --git a/src/codegen.c b/src/codegen.c index 2d01ed701..9bba9de71 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -1738,7 +1738,7 @@ codegen(codegen_scope *s, node *tree, int val) case NODE_FLOAT: if (val) { char *p = (char*)tree; - mrb_float f = readfloat(p); + mrb_float f = str_to_mrb_float(p); int off = new_lit(s, mrb_float_value(f)); genop(s, MKOP_ABx(OP_LOADL, cursp(), off)); @@ -1754,7 +1754,7 @@ codegen(codegen_scope *s, node *tree, int val) case NODE_FLOAT: { char *p = (char*)tree; - mrb_float f = readfloat(p); + mrb_float f = str_to_mrb_float(p); int off = new_lit(s, mrb_float_value(-f)); genop(s, MKOP_ABx(OP_LOADL, cursp(), off)); diff --git a/src/dump.c b/src/dump.c index 15e11153e..5100014d9 100644 --- a/src/dump.c +++ b/src/dump.c @@ -226,11 +226,11 @@ get_pool_block_size(mrb_state *mrb, mrb_irep *irep, int type) switch (mrb_type(irep->pool[pool_no])) { case MRB_TT_FIXNUM: - len = sprintf( buf, "%d", mrb_fixnum(irep->pool[pool_no])); + len = mrb_int_to_str( buf, mrb_fixnum(irep->pool[pool_no])); size += (uint32_t)len; break; case MRB_TT_FLOAT: - len = sprintf( buf, "%.16e", mrb_float(irep->pool[pool_no])); + len = mrb_float_to_str( buf, mrb_float(irep->pool[pool_no])); size += (uint32_t)len; break; case MRB_TT_STRING: @@ -346,11 +346,11 @@ write_pool_block(mrb_state *mrb, mrb_irep *irep, char *buf, int type) switch (mrb_type(irep->pool[pool_no])) { case MRB_TT_FIXNUM: - len = sprintf(char_buf, "%d", mrb_fixnum(irep->pool[pool_no])); + len = mrb_int_to_str(char_buf, mrb_fixnum(irep->pool[pool_no])); break; case MRB_TT_FLOAT: - len = sprintf(char_buf, "%.16e", mrb_float(irep->pool[pool_no])); + len = mrb_float_to_str(char_buf, mrb_float(irep->pool[pool_no])); break; case MRB_TT_STRING: diff --git a/src/load.c b/src/load.c index a2ae4100b..1575ffb4d 100644 --- a/src/load.c +++ b/src/load.c @@ -405,12 +405,12 @@ read_rite_irep_record(mrb_state *mrb, unsigned char *src, mrb_irep *irep, uint32 switch (tt) { //pool data case MRB_TT_FIXNUM: - fix_num = strtol(buf, NULL, 10); + fix_num = str_to_mrb_int(buf); irep->pool[i] = mrb_fixnum_value(fix_num); break; case MRB_TT_FLOAT: - f = readfloat(buf); + f = str_to_mrb_float(buf); irep->pool[i] = mrb_float_value(f); break; diff --git a/src/numeric.c b/src/numeric.c index 102e52827..c1491ac51 100644 --- a/src/numeric.c +++ b/src/numeric.c @@ -246,8 +246,8 @@ flodivmod(mrb_state *mrb, mrb_float x, mrb_float y, mrb_float *divp, mrb_float * mrb_float div, mod; if (y == 0.0) { - *divp = strtod("inf", NULL); - *modp = strtod("nan", NULL); + *divp = str_to_mrb_float("inf"); + *modp = str_to_mrb_float("nan"); return; } mod = fmod(x, y); @@ -778,7 +778,7 @@ fix_mod(mrb_state *mrb, mrb_value x) mrb_int mod; if (mrb_fixnum(y) == 0) { - return mrb_float_value(strtod("nan", NULL)); + return mrb_float_value(str_to_mrb_float("nan")); } fixdivmod(mrb, a, mrb_fixnum(y), 0, &mod); return mrb_fixnum_value(mod); @@ -807,8 +807,8 @@ fix_divmod(mrb_state *mrb, mrb_value x) mrb_int div, mod; if (mrb_fixnum(y) == 0) { - return mrb_assoc_new(mrb, mrb_float_value(strtod("inf", NULL)), - mrb_float_value(strtod("nan", NULL))); + return mrb_assoc_new(mrb, mrb_float_value(str_to_mrb_float("inf")), + mrb_float_value(str_to_mrb_float("nan"))); } fixdivmod(mrb, mrb_fixnum(x), mrb_fixnum(y), &div, &mod); return mrb_assoc_new(mrb, mrb_fixnum_value(div), mrb_fixnum_value(mod)); -- cgit v1.2.3 From 35699424a9e2d286fcbf3ac040f4e2a2b1027f0b Mon Sep 17 00:00:00 2001 From: Kouki Ooyatsu Date: Wed, 31 Oct 2012 20:15:39 +0900 Subject: fix: broken variable reference, use 'next' statement Because the tree is gone pop() even if it is empty. --- src/codegen.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'src/codegen.c') diff --git a/src/codegen.c b/src/codegen.c index ebc9b32de..ca2269d85 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -1556,8 +1556,10 @@ codegen(codegen_scope *s, node *tree, int val) genop(s, MKOP_sBx(OP_JMP, s->loop->pc1 - s->pc)); } else { - codegen(s, tree, VAL); - pop(); + if (tree) { + codegen(s, tree, VAL); + pop(); + } genop_peep(s, MKOP_AB(OP_RETURN, cursp(), OP_R_NORMAL), NOVAL); } if (val) push(); -- cgit v1.2.3