diff options
| -rw-r--r-- | include/mruby/hash.h | 9 | ||||
| -rw-r--r-- | include/mruby/version.h | 6 | ||||
| -rw-r--r-- | mrbgems/mruby-compiler/core/codegen.c | 4 | ||||
| -rw-r--r-- | mrbgems/mruby-compiler/core/parse.y | 29 | ||||
| -rw-r--r-- | mrbgems/mruby-error/src/exception.c | 10 | ||||
| -rw-r--r-- | mrbgems/mruby-sprintf/src/sprintf.c | 7 | ||||
| -rw-r--r-- | src/error.c | 11 |
7 files changed, 48 insertions, 28 deletions
diff --git a/include/mruby/hash.h b/include/mruby/hash.h index 48a858e0e..0052a1105 100644 --- a/include/mruby/hash.h +++ b/include/mruby/hash.h @@ -95,7 +95,7 @@ MRB_API mrb_value mrb_hash_fetch(mrb_state *mrb, mrb_value hash, mrb_value key, * @param mrb The mruby state reference. * @param hash The target hash. * @param key The key to delete. - * @return The deleted value. + * @return The deleted value. This value is not protected from GC. Use `mrb_gc_protect()` if necessary. */ MRB_API mrb_value mrb_hash_delete_key(mrb_state *mrb, mrb_value hash, mrb_value key); @@ -197,13 +197,6 @@ MRB_API mrb_value mrb_hash_dup(mrb_state *mrb, mrb_value hash); */ MRB_API void mrb_hash_merge(mrb_state *mrb, mrb_value hash1, mrb_value hash2); -/* declaration of struct mrb_hash_value */ -/* be careful when you touch the internal */ -typedef struct { - mrb_value v; - mrb_int n; -} mrb_hash_value; - /* RHASH_TBL allocates st_table if not available. */ #define RHASH(obj) ((struct RHash*)(mrb_ptr(obj))) #define RHASH_TBL(h) (RHASH(h)->ht) diff --git a/include/mruby/version.h b/include/mruby/version.h index 3140ea481..1c7655a47 100644 --- a/include/mruby/version.h +++ b/include/mruby/version.h @@ -106,9 +106,9 @@ MRB_BEGIN_DECL /* * mruby's version, and release date. */ -#define MRUBY_DESCRIPTION \ - "mruby " MRUBY_VERSION \ - " (" MRUBY_RELEASE_DATE ") " \ +#define MRUBY_DESCRIPTION \ + "mruby " MRUBY_VERSION \ + " (" MRUBY_RELEASE_DATE ")" \ /* * mruby's copyright information. diff --git a/mrbgems/mruby-compiler/core/codegen.c b/mrbgems/mruby-compiler/core/codegen.c index 0af76bd17..e422c7bea 100644 --- a/mrbgems/mruby-compiler/core/codegen.c +++ b/mrbgems/mruby-compiler/core/codegen.c @@ -2385,10 +2385,6 @@ codegen(codegen_scope *s, node *tree, int val) } break; - case NODE_DEFINED: - codegen(s, tree, val); - break; - case NODE_BACK_REF: if (val) { char buf[] = {'$', nchar(tree)}; diff --git a/mrbgems/mruby-compiler/core/parse.y b/mrbgems/mruby-compiler/core/parse.y index 57b03cba5..b2c31ed17 100644 --- a/mrbgems/mruby-compiler/core/parse.y +++ b/mrbgems/mruby-compiler/core/parse.y @@ -6912,7 +6912,7 @@ mrb_parser_dump(mrb_state *mrb, node *tree, int offset) break; case NODE_NEGATE: - printf("NODE_NEGATE\n"); + printf("NODE_NEGATE:\n"); mrb_parser_dump(mrb, tree, offset+1); break; @@ -6921,7 +6921,7 @@ mrb_parser_dump(mrb_state *mrb, node *tree, int offset) break; case NODE_DSTR: - printf("NODE_DSTR\n"); + printf("NODE_DSTR:\n"); dump_recur(mrb, tree, offset+1); break; @@ -6930,7 +6930,7 @@ mrb_parser_dump(mrb_state *mrb, node *tree, int offset) break; case NODE_DXSTR: - printf("NODE_DXSTR\n"); + printf("NODE_DXSTR:\n"); dump_recur(mrb, tree, offset+1); break; @@ -6939,7 +6939,7 @@ mrb_parser_dump(mrb_state *mrb, node *tree, int offset) break; case NODE_DREGX: - printf("NODE_DREGX\n"); + printf("NODE_DREGX:\n"); dump_recur(mrb, tree->car, offset+1); dump_prefix(tree, offset); printf("tail: %s\n", (char*)tree->cdr->cdr->car); @@ -6958,6 +6958,25 @@ mrb_parser_dump(mrb_state *mrb, node *tree, int offset) intn(tree)); break; + case NODE_DSYM: + printf("NODE_DSYM:\n"); + mrb_parser_dump(mrb, tree, offset+1); + break; + + case NODE_WORDS: + printf("NODE_WORDS:\n"); + dump_recur(mrb, tree, offset+1); + break; + + case NODE_SYMBOLS: + printf("NODE_SYMBOLS:\n"); + dump_recur(mrb, tree, offset+1); + break; + + case NODE_LITERAL_DELIM: + printf("NODE_LITERAL_DELIM\n"); + break; + case NODE_SELF: printf("NODE_SELF\n"); break; @@ -7123,7 +7142,7 @@ mrb_parser_dump(mrb_state *mrb, node *tree, int offset) break; case NODE_KW_ARG: - printf("NODE_KW_ARG %s\n", mrb_sym_name(mrb, sym(tree->car))); + printf("NODE_KW_ARG %s:\n", mrb_sym_name(mrb, sym(tree->car))); mrb_parser_dump(mrb, tree->cdr->car, offset + 1); break; diff --git a/mrbgems/mruby-error/src/exception.c b/mrbgems/mruby-error/src/exception.c index 170abb699..ec4870dc0 100644 --- a/mrbgems/mruby-error/src/exception.c +++ b/mrbgems/mruby-error/src/exception.c @@ -8,6 +8,7 @@ mrb_protect(mrb_state *mrb, mrb_func_t body, mrb_value data, mrb_bool *state) struct mrb_jmpbuf *prev_jmp = mrb->jmp; struct mrb_jmpbuf c_jmp; mrb_value result = mrb_nil_value(); + mrb_int ai = mrb_gc_arena_save(mrb); if (state) { *state = FALSE; } @@ -22,6 +23,7 @@ mrb_protect(mrb_state *mrb, mrb_func_t body, mrb_value data, mrb_bool *state) if (state) { *state = TRUE; } } MRB_END_EXC(&c_jmp); + mrb_gc_arena_restore(mrb, ai); mrb_gc_protect(mrb, result); return result; } @@ -32,6 +34,7 @@ mrb_ensure(mrb_state *mrb, mrb_func_t body, mrb_value b_data, mrb_func_t ensure, struct mrb_jmpbuf *prev_jmp = mrb->jmp; struct mrb_jmpbuf c_jmp; mrb_value result; + mrb_int ai = mrb_gc_arena_save(mrb); MRB_TRY(&c_jmp) { mrb->jmp = &c_jmp; @@ -39,11 +42,15 @@ mrb_ensure(mrb_state *mrb, mrb_func_t body, mrb_value b_data, mrb_func_t ensure, mrb->jmp = prev_jmp; } MRB_CATCH(&c_jmp) { mrb->jmp = prev_jmp; + mrb_gc_arena_restore(mrb, ai); ensure(mrb, e_data); MRB_THROW(mrb->jmp); /* rethrow catched exceptions */ } MRB_END_EXC(&c_jmp); + mrb_gc_arena_restore(mrb, ai); + mrb_gc_protect(mrb, result); ensure(mrb, e_data); + mrb_gc_arena_restore(mrb, ai); mrb_gc_protect(mrb, result); return result; } @@ -64,6 +71,7 @@ mrb_rescue_exceptions(mrb_state *mrb, mrb_func_t body, mrb_value b_data, mrb_fun mrb_value result; mrb_bool error_matched = FALSE; mrb_int i; + mrb_int ai = mrb_gc_arena_save(mrb); MRB_TRY(&c_jmp) { mrb->jmp = &c_jmp; @@ -82,9 +90,11 @@ mrb_rescue_exceptions(mrb_state *mrb, mrb_func_t body, mrb_value b_data, mrb_fun if (!error_matched) { MRB_THROW(mrb->jmp); } mrb->exc = NULL; + mrb_gc_arena_restore(mrb, ai); result = rescue(mrb, r_data); } MRB_END_EXC(&c_jmp); + mrb_gc_arena_restore(mrb, ai); mrb_gc_protect(mrb, result); return result; } diff --git a/mrbgems/mruby-sprintf/src/sprintf.c b/mrbgems/mruby-sprintf/src/sprintf.c index efbfb13e2..6e4d8fd7e 100644 --- a/mrbgems/mruby-sprintf/src/sprintf.c +++ b/mrbgems/mruby-sprintf/src/sprintf.c @@ -1004,10 +1004,8 @@ retry: case 'A': { mrb_value val = GETARG(); double fval; - mrb_int i; mrb_int need = 6; char fbuf[32]; - int frexp_result; fval = mrb_float(mrb_Float(mrb, val)); if (!isfinite(fval)) { @@ -1051,9 +1049,8 @@ retry: fmt_setup(fbuf, sizeof(fbuf), *p, flags, width, prec); need = 0; if (*p != 'e' && *p != 'E') { - i = INT_MIN; - frexp(fval, &frexp_result); - i = (mrb_int)frexp_result; + int i; + frexp(fval, &i); if (i > 0) need = BIT_DIGITS(i); } diff --git a/src/error.c b/src/error.c index babd13b14..97a156687 100644 --- a/src/error.c +++ b/src/error.c @@ -241,10 +241,15 @@ mrb_exc_set(mrb_state *mrb, mrb_value exc) MRB_API mrb_noreturn void mrb_exc_raise(mrb_state *mrb, mrb_value exc) { - if (!mrb_obj_is_kind_of(mrb, exc, mrb->eException_class)) { - mrb_raise(mrb, E_TYPE_ERROR, "exception object expected"); + if (mrb_break_p(exc)) { + mrb->exc = mrb_obj_ptr(exc); + } + else { + if (!mrb_obj_is_kind_of(mrb, exc, mrb->eException_class)) { + mrb_raise(mrb, E_TYPE_ERROR, "exception object expected"); + } + mrb_exc_set(mrb, exc); } - mrb_exc_set(mrb, exc); if (!mrb->jmp) { mrb_p(mrb, exc); abort(); |
