From 3718599e8623387adf79b47085b4f657ff3f6922 Mon Sep 17 00:00:00 2001 From: Yuichiro MASUI Date: Tue, 7 Aug 2012 04:04:22 +0900 Subject: Fixed memory leak when calling stack_extend in m->body.func --- src/vm.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'src/vm.c') diff --git a/src/vm.c b/src/vm.c index cbea3ee77..ac6dc9f1a 100644 --- a/src/vm.c +++ b/src/vm.c @@ -689,7 +689,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) struct RProc *m; struct RClass *c; mrb_callinfo *ci; - mrb_value recv; + mrb_value recv, result; mrb_sym mid = syms[GETARG_B(i)]; recv = regs[a]; @@ -731,7 +731,8 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) else { ci->nregs = n + 2; } - mrb->stack[0] = m->body.func(mrb, recv); + result = m->body.func(mrb, recv); + mrb->stack[0] = result; mrb->arena_idx = ai; if (mrb->exc) goto L_RAISE; /* pop stackpos */ -- cgit v1.2.3 From 87ba67f42d36ca001298644c2e4f2f3a26d5c40b Mon Sep 17 00:00:00 2001 From: Masamitsu MURASE Date: Mon, 13 Aug 2012 01:49:50 +0900 Subject: Modify exception handling. If an exception is raised before cipush is called in mrb_run, it should be handled in the outer mrb_run. --- src/vm.c | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'src/vm.c') diff --git a/src/vm.c b/src/vm.c index ac6dc9f1a..fa5a52d1f 100644 --- a/src/vm.c +++ b/src/vm.c @@ -20,6 +20,7 @@ #include #include #include +#include #define STACK_INIT_SIZE 128 #define CALLINFO_INIT_SIZE 32 @@ -402,6 +403,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) int ai = mrb->arena_idx; jmp_buf *prev_jmp = (jmp_buf *)mrb->jmp; jmp_buf c_jmp; + ptrdiff_t ciidx = mrb->ci - mrb->cibase; #ifdef DIRECT_THREADED static void *optable[] = { @@ -1028,6 +1030,10 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) ci = mrb->ci; eidx = mrb->ci->eidx; if (ci == mrb->cibase) goto L_STOP; + if (ciidx == ci - mrb->cibase){ + mrb->jmp = prev_jmp; + longjmp(*(jmp_buf*)mrb->jmp, 1); + } while (ci[0].ridx == ci[-1].ridx) { cipop(mrb); ci = mrb->ci; -- cgit v1.2.3 From 1ed39d5c05bd37c6633e7729efb8e7aa46d7fdda Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Mon, 13 Aug 2012 04:19:24 +0900 Subject: use TRUE/FALSE instead of 1/0 --- src/class.c | 6 +++--- src/codegen.c | 4 ++-- src/kernel.c | 4 ++-- src/object.c | 6 +++--- src/pool.c | 8 ++++---- src/string.c | 2 +- src/symbol.c | 2 +- src/variable.c | 42 +++++++++++++++++++++--------------------- src/vm.c | 4 ++-- 9 files changed, 39 insertions(+), 39 deletions(-) (limited to 'src/vm.c') diff --git a/src/class.c b/src/class.c index 8244a8637..d6bb85a58 100644 --- a/src/class.c +++ b/src/class.c @@ -1061,16 +1061,16 @@ mrb_obj_respond_to(struct RClass* c, mrb_sym mid) k = kh_get(mt, h, mid); if (k != kh_end(h)) { if (kh_value(h, k)) { - return 1; /* exist method */ + return TRUE; /* method exists */ } else { - return 0; + return FALSE; /* undefined method */ } } } c = c->super; } - return 0; /* no method */ + return FALSE; /* no method */ } int diff --git a/src/codegen.c b/src/codegen.c index 4f118753e..38d57d581 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -610,10 +610,10 @@ static int nosplat(node *t) { while (t) { - if ((intptr_t)t->car->car == NODE_SPLAT) return 0; + if ((intptr_t)t->car->car == NODE_SPLAT) return FALSE; t = t->cdr; } - return 1; + return TRUE; } static mrb_sym diff --git a/src/kernel.c b/src/kernel.c index 4e5931fba..1334d8f9f 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -37,8 +37,8 @@ mrb_obj_basic_to_s_p(mrb_state *mrb, mrb_value obj) { struct RProc *me = mrb_method_search(mrb, mrb_class(mrb, obj), mrb_intern(mrb, "to_s")); if (me && MRB_PROC_CFUNC_P(me) && (me->body.func == mrb_any_to_s)) - return 1; - return 0; + return TRUE; + return FALSE; } /* 15.3.1.3.17 */ diff --git a/src/object.c b/src/object.c index 26df48afd..20310d288 100644 --- a/src/object.c +++ b/src/object.c @@ -14,7 +14,7 @@ int mrb_obj_eq(mrb_state *mrb, mrb_value v1, mrb_value v2) { - if (v1.tt != v2.tt) return 0; + if (v1.tt != v2.tt) return FALSE; switch (v1.tt) { case MRB_TT_TRUE: return 1; @@ -498,10 +498,10 @@ mrb_obj_is_kind_of(mrb_state *mrb, mrb_value obj, struct RClass *c) while (cl) { if (cl == c || cl->mt == c->mt) - return 1/* TRUE */; + return TRUE; cl = cl->super; } - return 0/* FALSE */; + return FALSE; } static mrb_value diff --git a/src/pool.c b/src/pool.c index daa6d0f69..71e4b477d 100644 --- a/src/pool.c +++ b/src/pool.c @@ -123,7 +123,7 @@ mrb_pool_can_realloc(mrb_pool *pool, void *p, size_t len) { struct mrb_pool_page *page; - if (!pool) return 0; + if (!pool) return FALSE; len += ALIGN_PADDING(len); page = pool->pages; while (page) { @@ -131,12 +131,12 @@ mrb_pool_can_realloc(mrb_pool *pool, void *p, size_t len) size_t beg; beg = (char*)p - page->page; - if (beg + len > page->len) return 0; - return 1; + if (beg + len > page->len) return FALSE; + return TRUE; } page = page->next; } - return 0; + return FALSE; } void* diff --git a/src/string.c b/src/string.c index aef0ac88f..b749614dc 100644 --- a/src/string.c +++ b/src/string.c @@ -2296,7 +2296,7 @@ mrb_block_given_p() { /*if (ruby_frame->iter == ITER_CUR && ruby_block) return 1;*//*Qtrue*/ - return 0/*Qfalse*/; + return FALSE; } /* 15.2.10.5.37 */ diff --git a/src/symbol.c b/src/symbol.c index fdb0aa861..6b29ed350 100644 --- a/src/symbol.c +++ b/src/symbol.c @@ -236,7 +236,7 @@ is_special_global_name(const char* m) if (is_identchar(*m)) m += 1; break; default: - if (!ISDIGIT(*m)) return 0; + if (!ISDIGIT(*m)) return FALSE; do ++m; while (ISDIGIT(*m)); } return !*m; diff --git a/src/variable.c b/src/variable.c index 3f08849a7..187e8cdd4 100644 --- a/src/variable.c +++ b/src/variable.c @@ -122,16 +122,16 @@ iv_get(mrb_state *mrb, iv_tbl *t, mrb_sym sym, mrb_value *vp) mrb_sym key = seg->key[i]; if (!seg->next && i >= t->last_len) { - return 0; + return FALSE; } if (key == sym) { if (vp) *vp = seg->val[i]; - return 1; + return TRUE; } } seg = seg->next; } - return 0; + return FALSE; } static int @@ -146,18 +146,18 @@ iv_del(mrb_state *mrb, iv_tbl *t, mrb_sym sym, mrb_value *vp) mrb_sym key = seg->key[i]; if (!seg->next && i >= t->last_len) { - return 0; + return FALSE; } if (key == sym) { t->size--; seg->key[i] = 0; if (vp) *vp = seg->val[i]; - return 1; + return TRUE; } } seg = seg->next; } - return 0; + return FALSE; } static int @@ -173,11 +173,11 @@ iv_foreach(mrb_state *mrb, iv_tbl *t, iv_foreach_func *func, void *p) /* no value in last segment after last_len */ if (!seg->next && i >= t->last_len) { - return 0; + return FALSE; } if (key != 0) { n =(*func)(mrb, key, seg->val[i], p); - if (n > 0) return 0; + if (n > 0) return FALSE; if (n < 0) { t->size--; seg->key[i] = 0; @@ -186,7 +186,7 @@ iv_foreach(mrb_state *mrb, iv_tbl *t, iv_foreach_func *func, void *p) } seg = seg->next; } - return 1; + return TRUE; } static int @@ -290,9 +290,9 @@ iv_get(mrb_state *mrb, iv_tbl *t, mrb_sym sym, mrb_value *vp) k = kh_get(iv, h, sym); if (k != kh_end(h)) { if (vp) *vp = kh_value(h, k); - return 1; + return TRUE; } - return 0; + return FALSE; } static int @@ -307,10 +307,10 @@ iv_del(mrb_state *mrb, iv_tbl *t, mrb_sym sym, mrb_value *vp) mrb_value val = kh_value(h, k); kh_del(iv, h, k); if (vp) *vp = val; - return 1; + return TRUE; } } - return 0; + return FALSE; } static int @@ -324,14 +324,14 @@ iv_foreach(mrb_state *mrb, iv_tbl *t, iv_foreach_func *func, void *p) for (k = kh_begin(h); k != kh_end(h); k++) { if (kh_exist(h, k)){ n = (*func)(mrb, kh_key(h, k), kh_value(h, k), p); - if (n > 0) return 0; + if (n > 0) return FALSE; if (n < 0) { kh_del(iv, h, k); } } } } - return 1; + return TRUE; } static int @@ -486,13 +486,13 @@ mrb_obj_iv_defined(mrb_state *mrb, struct RObject *obj, mrb_sym sym) if (t) { return iv_get(mrb, t, sym, NULL); } - return 0; + return FALSE; } int mrb_iv_defined(mrb_state *mrb, mrb_value obj, mrb_sym sym) { - if (!obj_iv_p(obj)) return 0; + if (!obj_iv_p(obj)) return FALSE; return mrb_obj_iv_defined(mrb, mrb_obj_ptr(obj), sym); } @@ -670,7 +670,7 @@ mrb_const_defined(mrb_state *mrb, mrb_value mod, mrb_sym sym) struct RClass *m = mrb_class_ptr(mod); iv_tbl *t = m->iv; - if (!t) return 0; + if (!t) return FALSE; return iv_get(mrb, t, sym, NULL); } @@ -846,7 +846,7 @@ mrb_const_defined_0(mrb_state *mrb, struct RClass *klass, mrb_sym id, int exclud retry: while (tmp) { if (tmp->iv && iv_get(mrb, tmp->iv, id, NULL)) { - return 1; + return TRUE; } if (!recurse && (klass != mrb->object_class)) break; tmp = tmp->super; @@ -856,7 +856,7 @@ retry: tmp = mrb->object_class; goto retry; } - return (int)0/*Qfalse*/; + return FALSE; } int @@ -893,7 +893,7 @@ csym_i(mrb_state *mrb, mrb_sym sym, mrb_value v, void *p) if (mrb_type(v) == c->tt && mrb_class_ptr(v) == c) { a->sym = sym; - return 1; /* stop iteration*/ + return 1; /* stop iteration */ } return 0; } diff --git a/src/vm.c b/src/vm.c index fa5a52d1f..6cb421642 100644 --- a/src/vm.c +++ b/src/vm.c @@ -452,9 +452,9 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) CASE(OP_MOVE) { /* A B R(A) := R(B) */ -#if 0 +#if 1 regs[GETARG_A(i)] = regs[GETARG_B(i)]; -#elif 1 +#elif 0 int a = GETARG_A(i); int b = GETARG_B(i); -- cgit v1.2.3 From cda1709a35ad7d495ec1a08793cd88b78e20c444 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Mon, 13 Aug 2012 21:03:08 +0900 Subject: setjmp in mrb_funcall_with_block if mrb->jmp is empty --- src/class.c | 38 -------------------------------------- src/vm.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+), 38 deletions(-) (limited to 'src/vm.c') diff --git a/src/class.c b/src/class.c index d6bb85a58..795527263 100644 --- a/src/class.c +++ b/src/class.c @@ -855,44 +855,6 @@ mrb_method_search(mrb_state *mrb, struct RClass* c, mrb_sym mid) return m; } -#ifndef MRB_FUNCALL_ARGC_MAX -#define MRB_FUNCALL_ARGC_MAX 16 -#endif - -mrb_value -mrb_funcall(mrb_state *mrb, mrb_value self, const char *name, int argc, ...) -{ - mrb_sym mid = mrb_intern(mrb, name); - va_list ap; - int i; - - if (argc == 0) { - return mrb_funcall_argv(mrb, self, mid, 0, 0); - } - else if (argc == 1) { - mrb_value v; - - va_start(ap, argc); - v = va_arg(ap, mrb_value); - va_end(ap); - return mrb_funcall_argv(mrb, self, mid, 1, &v); - } - else { - mrb_value argv[MRB_FUNCALL_ARGC_MAX]; - - if (argc > MRB_FUNCALL_ARGC_MAX) { - mrb_raise(mrb, E_ARGUMENT_ERROR, "Too long arguments. (limit=%d)", MRB_FUNCALL_ARGC_MAX); - } - - va_start(ap, argc); - for (i = 0; i < argc; i++) { - argv[i] = va_arg(ap, mrb_value); - } - va_end(ap); - return mrb_funcall_argv(mrb, self, mid, argc, argv); - } -} - void mrb_obj_call_init(mrb_state *mrb, mrb_value obj, int argc, mrb_value *argv) { diff --git a/src/vm.c b/src/vm.c index 6cb421642..c27fdfbab 100644 --- a/src/vm.c +++ b/src/vm.c @@ -21,6 +21,7 @@ #include #include #include +#include #define STACK_INIT_SIZE 128 #define CALLINFO_INIT_SIZE 32 @@ -179,6 +180,44 @@ ecall(mrb_state *mrb, int i) if (!mrb->exc) mrb->exc = exc; } +#ifndef MRB_FUNCALL_ARGC_MAX +#define MRB_FUNCALL_ARGC_MAX 16 +#endif + +mrb_value +mrb_funcall(mrb_state *mrb, mrb_value self, const char *name, int argc, ...) +{ + mrb_sym mid = mrb_intern(mrb, name); + va_list ap; + int i; + + if (argc == 0) { + return mrb_funcall_argv(mrb, self, mid, 0, 0); + } + else if (argc == 1) { + mrb_value v; + + va_start(ap, argc); + v = va_arg(ap, mrb_value); + va_end(ap); + return mrb_funcall_argv(mrb, self, mid, 1, &v); + } + else { + mrb_value argv[MRB_FUNCALL_ARGC_MAX]; + + if (argc > MRB_FUNCALL_ARGC_MAX) { + mrb_raise(mrb, E_ARGUMENT_ERROR, "Too long arguments. (limit=%d)", MRB_FUNCALL_ARGC_MAX); + } + + va_start(ap, argc); + for (i = 0; i < argc; i++) { + argv[i] = va_arg(ap, mrb_value); + } + va_end(ap); + return mrb_funcall_argv(mrb, self, mid, argc, argv); + } +} + mrb_value mrb_funcall_with_block(mrb_state *mrb, mrb_value self, mrb_sym mid, int argc, mrb_value *argv, mrb_value blk) { @@ -189,6 +228,20 @@ mrb_funcall_with_block(mrb_state *mrb, mrb_value self, mrb_sym mid, int argc, mr int n = mrb->ci->nregs; mrb_value val; + if (!mrb->jmp) { + jmp_buf c_jmp; + + if (setjmp(c_jmp) != 0) { /* error */ + mrb->jmp = 0; + return mrb_nil_value(); + } + mrb->jmp = &c_jmp; + /* recursive call */ + val = mrb_funcall_with_block(mrb, self, mid, argc, argv, blk); + mrb->jmp = 0; + return val; + } + if (argc < 0) { mrb_raise(mrb, E_ARGUMENT_ERROR, "negative argc for funcall (%d)", argc); } -- cgit v1.2.3