diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/etc.c | 2 | ||||
| -rw-r--r-- | src/gc.c | 14 | ||||
| -rw-r--r-- | src/parse.y | 11 | ||||
| -rw-r--r-- | src/proc.c | 2 | ||||
| -rw-r--r-- | src/string.c | 11 | ||||
| -rw-r--r-- | src/symbol.c | 4 | ||||
| -rw-r--r-- | src/vm.c | 35 |
7 files changed, 43 insertions, 36 deletions
@@ -108,7 +108,7 @@ mrb_obj_id(mrb_value obj) { mrb_int tt = mrb_type(obj); -#define MakeID2(p,t) (((intptr_t)(p))^(t)) +#define MakeID2(p,t) (mrb_int)(((intptr_t)(p))^(t)) #define MakeID(p) MakeID2(p,tt) switch (tt) { @@ -441,7 +441,16 @@ mark_context_stack(mrb_state *mrb, struct mrb_context *c) if (c->ci) e += c->ci->nregs; if (c->stbase + e > c->stend) e = c->stend - c->stbase; for (i=0; i<e; i++) { - mrb_gc_mark_value(mrb, c->stbase[i]); + mrb_value v = c->stbase[i]; + + if (!mrb_immediate_p(v)) { + if (mrb_basic_ptr(v)->tt == MRB_TT_FREE) { + c->stbase[i] = mrb_nil_value(); + } + else { + mrb_gc_mark(mrb, mrb_basic_ptr(v)); + } + } } } @@ -531,7 +540,7 @@ gc_mark_children(mrb_state *mrb, struct RBasic *obj) { struct mrb_context *c = ((struct RFiber*)obj)->cxt; - mark_context(mrb, c); + if (c) mark_context(mrb, c); } break; @@ -745,6 +754,7 @@ gc_gray_mark(mrb_state *mrb, struct RBasic *obj) size_t i; mrb_callinfo *ci; + if (!c) break; /* mark stack */ i = c->stack - c->stbase; if (c->ci) i += c->ci->nregs; diff --git a/src/parse.y b/src/parse.y index 0d281feeb..aab1aaa40 100644 --- a/src/parse.y +++ b/src/parse.y @@ -3429,7 +3429,7 @@ peek_n(parser_state *p, int c, int n) list = push(list, (node*)(intptr_t)c0); } while(n--); if (p->pb) { - p->pb = append(p->pb, (node*)list); + p->pb = append((node*)list, p->pb); } else { p->pb = list; @@ -4189,8 +4189,13 @@ parser_yylex(parser_state *p) case '=': if (p->column == 1) { - if (peeks(p, "begin\n")) { - skips(p, "\n=end\n"); + if (peeks(p, "begin ") || peeks(p, "begin\n")) { + if (skips(p, "\n=end ")) { + goto retry; + } + if (skips(p, "\n=end\n")) { + goto retry; + } goto retry; } } diff --git a/src/proc.c b/src/proc.c index fa4c28fc8..b29bd5977 100644 --- a/src/proc.c +++ b/src/proc.c @@ -43,7 +43,7 @@ closure_setup(mrb_state *mrb, struct RProc *p, int nlocals) e = (struct REnv*)mrb_obj_alloc(mrb, MRB_TT_ENV, (struct RClass*)mrb->c->ci->proc->env); MRB_ENV_STACK_LEN(e)= (unsigned int)nlocals; e->mid = mrb->c->ci->mid; - e->cioff = mrb->c->ci - mrb->c->cibase; + e->cioff = mrb->c->ci - mrb->c->cibase; e->stack = mrb->c->stack; mrb->c->ci->env = e; } diff --git a/src/string.c b/src/string.c index ac50dd33e..aa4f6bed5 100644 --- a/src/string.c +++ b/src/string.c @@ -5,6 +5,7 @@ */ #include <ctype.h> +#include <float.h> #include <limits.h> #include <stddef.h> #include <stdlib.h> @@ -165,13 +166,6 @@ mrb_str_resize(mrb_state *mrb, mrb_value str, mrb_int len) #define mrb_obj_alloc_string(mrb) ((struct RString*)mrb_obj_alloc((mrb), MRB_TT_STRING, (mrb)->string_class)) -/* char offset to byte offset */ -int -mrb_str_offset(mrb_state *mrb, mrb_value str, int pos) -{ - return pos; -} - static struct RString* str_new(mrb_state *mrb, const char *p, size_t len) { @@ -2159,9 +2153,6 @@ mrb_cstr_to_dbl(mrb_state *mrb, const char * p, mrb_bool badcheck) { char *end; double d; -#if !defined(DBL_DIG) -# define DBL_DIG 16 -#endif enum {max_width = 20}; #define OutOfRange() (((w = end - p) > max_width) ? \ diff --git a/src/symbol.c b/src/symbol.c index 21bf1db7c..cf8f549c5 100644 --- a/src/symbol.c +++ b/src/symbol.c @@ -47,7 +47,7 @@ sym_intern(mrb_state *mrb, const char *name, size_t len, mrb_bool lit) mrb_raise(mrb, E_ARGUMENT_ERROR, "symbol length too long"); } sname.lit = lit; - sname.len = len; + sname.len = (uint16_t)len; sname.name = name; k = kh_get(n2s, mrb, h, sname); if (k != kh_end(h)) @@ -103,7 +103,7 @@ mrb_check_intern(mrb_state *mrb, const char *name, size_t len) if (len > UINT16_MAX) { mrb_raise(mrb, E_ARGUMENT_ERROR, "symbol length too long"); } - sname.len = len; + sname.len = (uint16_t)len; sname.name = name; k = kh_get(n2s, mrb, h, sname); @@ -160,14 +160,14 @@ stack_extend_alloc(mrb_state *mrb, int room) } static inline void -stack_extend(mrb_state *mrb, int room, int init, int keep) +stack_extend(mrb_state *mrb, int room, int keep) { if (mrb->c->stack + room >= mrb->c->stend) { stack_extend_alloc(mrb, room); } - if (init > keep) { + if (room > keep) { /* do not leave uninitialized malloc region */ - stack_clear(&(mrb->c->stack[keep]), init - keep); + stack_clear(&(mrb->c->stack[keep]), room - keep); } } @@ -234,6 +234,7 @@ cipush(mrb_state *mrb) ci->env = 0; ci->pc = 0; ci->err = 0; + ci->proc = 0; return ci; } @@ -380,11 +381,11 @@ mrb_funcall_with_block(mrb_state *mrb, mrb_value self, mrb_sym mid, mrb_int argc mrb->c->stack = mrb->c->stack + n; if (MRB_PROC_CFUNC_P(p)) { ci->nregs = argc + 2; - stack_extend(mrb, ci->nregs, 0, 0); + stack_extend(mrb, ci->nregs, 0); } else { ci->nregs = p->body.irep->nregs + n; - stack_extend(mrb, ci->nregs, p->body.irep->nlocals, argc+2); + stack_extend(mrb, ci->nregs, argc+2); } mrb->c->stack[0] = self; if (undef) { @@ -513,11 +514,11 @@ mrb_yield_with_class(mrb_state *mrb, mrb_value b, mrb_int argc, const mrb_value mrb->c->stack = mrb->c->stack + n; if (MRB_PROC_CFUNC_P(p)) { ci->nregs = argc + 2; - stack_extend(mrb, ci->nregs, 0, 0); + stack_extend(mrb, ci->nregs, 0); } else { ci->nregs = p->body.irep->nregs + 1; - stack_extend(mrb, ci->nregs, p->body.irep->nlocals, argc+2); + stack_extend(mrb, ci->nregs, argc+2); } mrb->c->stack[0] = self; @@ -682,7 +683,7 @@ RETRY_TRY_BLOCK: if (!mrb->c->stack) { stack_init(mrb); } - stack_extend(mrb, irep->nregs, irep->nlocals, stack_keep); + stack_extend(mrb, irep->nregs, stack_keep); mrb->c->ci->proc = proc; mrb->c->ci->nregs = irep->nregs + 1; regs = mrb->c->stack; @@ -1047,11 +1048,11 @@ RETRY_TRY_BLOCK: ci->nregs = irep->nregs; if (n == CALL_MAXARGS) { ci->argc = -1; - stack_extend(mrb, (irep->nregs < 3) ? 3 : irep->nregs, irep->nlocals, 3); + stack_extend(mrb, (irep->nregs < 3) ? 3 : irep->nregs, 3); } else { ci->argc = n; - stack_extend(mrb, irep->nregs, irep->nlocals, n+2); + stack_extend(mrb, irep->nregs, n+2); } regs = mrb->c->stack; pc = irep->iseq; @@ -1111,10 +1112,10 @@ RETRY_TRY_BLOCK: syms = irep->syms; ci->nregs = irep->nregs; if (ci->argc < 0) { - stack_extend(mrb, (irep->nregs < 3) ? 3 : irep->nregs, irep->nlocals, 3); + stack_extend(mrb, (irep->nregs < 3) ? 3 : irep->nregs, 3); } else { - stack_extend(mrb, irep->nregs, irep->nlocals, ci->argc+2); + stack_extend(mrb, irep->nregs, ci->argc+2); } regs = mrb->c->stack; regs[0] = m->env->stack[0]; @@ -1186,10 +1187,10 @@ RETRY_TRY_BLOCK: syms = irep->syms; ci->nregs = irep->nregs; if (n == CALL_MAXARGS) { - stack_extend(mrb, (irep->nregs < 3) ? 3 : irep->nregs, irep->nlocals, 3); + stack_extend(mrb, (irep->nregs < 3) ? 3 : irep->nregs, 3); } else { - stack_extend(mrb, irep->nregs, irep->nlocals, ci->argc+2); + stack_extend(mrb, irep->nregs, ci->argc+2); } regs = mrb->c->stack; pc = irep->iseq; @@ -1532,10 +1533,10 @@ RETRY_TRY_BLOCK: pool = irep->pool; syms = irep->syms; if (ci->argc < 0) { - stack_extend(mrb, (irep->nregs < 3) ? 3 : irep->nregs, irep->nlocals, 3); + stack_extend(mrb, (irep->nregs < 3) ? 3 : irep->nregs, 3); } else { - stack_extend(mrb, irep->nregs, irep->nlocals, ci->argc+2); + stack_extend(mrb, irep->nregs, ci->argc+2); } regs = mrb->c->stack; pc = irep->iseq; @@ -2172,7 +2173,7 @@ RETRY_TRY_BLOCK: irep = p->body.irep; pool = irep->pool; syms = irep->syms; - stack_extend(mrb, irep->nregs, irep->nlocals, 1); + stack_extend(mrb, irep->nregs, 1); ci->nregs = irep->nregs; regs = mrb->c->stack; pc = irep->iseq; |
