summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--include/mruby/hash.h9
-rw-r--r--include/mruby/version.h6
-rw-r--r--mrbgems/mruby-compiler/core/codegen.c4
-rw-r--r--mrbgems/mruby-compiler/core/parse.y29
-rw-r--r--mrbgems/mruby-error/src/exception.c10
-rw-r--r--mrbgems/mruby-sprintf/src/sprintf.c7
-rw-r--r--src/error.c11
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();