diff options
| author | mirichi <[email protected]> | 2013-06-14 20:01:03 +0900 |
|---|---|---|
| committer | mirichi <[email protected]> | 2013-06-14 20:01:03 +0900 |
| commit | a5f63e486473595d67601851f00b6bb96b377a8d (patch) | |
| tree | 8550bf598238104c6490d15ad2db20d4c103ea75 /src | |
| parent | 4b2bdbe2cc0e3b1b0f6916bdc308933f17f74537 (diff) | |
| parent | dbc93621c94b9b2d2b437cde40d8efec7337a64d (diff) | |
| download | mruby-a5f63e486473595d67601851f00b6bb96b377a8d.tar.gz mruby-a5f63e486473595d67601851f00b6bb96b377a8d.zip | |
Merge remote-tracking branch 'upstream/master'
Diffstat (limited to 'src')
| -rw-r--r-- | src/class.c | 13 | ||||
| -rw-r--r-- | src/gc.c | 12 | ||||
| -rw-r--r-- | src/numeric.c | 1 | ||||
| -rw-r--r-- | src/parse.y | 2 | ||||
| -rw-r--r-- | src/state.c | 12 |
5 files changed, 29 insertions, 11 deletions
diff --git a/src/class.c b/src/class.c index 4264129b6..f94f9a933 100644 --- a/src/class.c +++ b/src/class.c @@ -1047,6 +1047,9 @@ mrb_instance_new(mrb_state *mrb, mrb_value cv) mrb_value *argv; int argc; + if (c->tt == MRB_TT_SCLASS) + mrb_raise(mrb, E_TYPE_ERROR, "can't create instance of singleton class"); + if (ttype == 0) ttype = MRB_TT_OBJECT; o = (struct RObject*)mrb_obj_alloc(mrb, ttype, c); obj = mrb_obj_value(o); @@ -1414,14 +1417,17 @@ mrb_mod_alias(mrb_state *mrb, mrb_value mod) return mrb_nil_value(); } - static void undef_method(mrb_state *mrb, struct RClass *c, mrb_sym a) { mrb_value m; - MRB_SET_VALUE(m, MRB_TT_PROC, value.p, 0); - mrb_define_method_vm(mrb, c, a, m); + if (!mrb_obj_respond_to(c, a)) { + mrb_name_error(mrb, a, "undefined method '%S' for class '%S'", mrb_sym2str(mrb, a), mrb_obj_value(c)); + } else { + MRB_SET_VALUE(m, MRB_TT_PROC, value.p, 0); + mrb_define_method_vm(mrb, c, a, m); + } } void @@ -1873,7 +1879,6 @@ mrb_init_class(mrb_state *mrb) mrb_name_class(mrb, mod, mrb_intern(mrb, "Module")); mrb_name_class(mrb, cls, mrb_intern(mrb, "Class")); - mrb_undef_method(mrb, mod, "new"); MRB_SET_INSTANCE_TT(cls, MRB_TT_CLASS); mrb_define_method(mrb, bob, "initialize", mrb_bob_init, MRB_ARGS_NONE()); mrb_define_method(mrb, bob, "!", mrb_bob_not, MRB_ARGS_NONE()); @@ -184,15 +184,19 @@ mrb_malloc(mrb_state *mrb, size_t len) void* mrb_calloc(mrb_state *mrb, size_t nelem, size_t len) { - void *p = NULL; - size_t size; + void *p; - if (nelem <= SIZE_MAX / len) { + if (nelem > 0 && len > 0 && + nelem <= SIZE_MAX / len) { + size_t size; size = nelem * len; p = mrb_realloc(mrb, 0, size); - if (p && size > 0) + if (p) { memset(p, 0, size); + } + } else { + p = NULL; } return p; diff --git a/src/numeric.c b/src/numeric.c index 6b118dfb4..6cd82d8b6 100644 --- a/src/numeric.c +++ b/src/numeric.c @@ -1374,7 +1374,6 @@ mrb_init_numeric(mrb_state *mrb) mrb_define_method(mrb, integer, "to_int", int_to_i, MRB_ARGS_NONE()); fixnum = mrb->fixnum_class = mrb_define_class(mrb, "Fixnum", integer); - mrb_undef_class_method(mrb, fixnum, "new"); mrb_define_method(mrb, fixnum, "+", fix_plus, MRB_ARGS_REQ(1)); /* 15.2.8.3.1 */ mrb_define_method(mrb, fixnum, "-", fix_minus, MRB_ARGS_REQ(1)); /* 15.2.8.3.2 */ mrb_define_method(mrb, fixnum, "-@", fix_uminus, MRB_ARGS_REQ(1)); /* 15.2.7.4.2 */ diff --git a/src/parse.y b/src/parse.y index 54e8eafce..f5dbdb6fd 100644 --- a/src/parse.y +++ b/src/parse.y @@ -4925,7 +4925,7 @@ parser_yylex(parser_state *p) pushback(p, c); } } - if (result == 0 && isupper((int)tok(p)[0])) { + if (result == 0 && isupper((int)(unsigned char)tok(p)[0])) { result = tCONSTANT; } else { diff --git a/src/state.c b/src/state.c index 76b506d3e..34de1e45e 100644 --- a/src/state.c +++ b/src/state.c @@ -21,12 +21,22 @@ inspect_main(mrb_state *mrb, mrb_value mod) return mrb_str_new(mrb, "main", 4); } +#ifdef MRB_NAN_BOXING +#include <assert.h> +#endif + mrb_state* mrb_open_allocf(mrb_allocf f, void *ud) { static const mrb_state mrb_state_zero = { 0 }; static const struct mrb_context mrb_context_zero = { 0 }; - mrb_state *mrb = (mrb_state *)(f)(NULL, NULL, sizeof(mrb_state), ud); + mrb_state *mrb; + +#ifdef MRB_NAN_BOXING + assert(sizeof(void*) == 4); +#endif + + mrb = (mrb_state *)(f)(NULL, NULL, sizeof(mrb_state), ud); if (mrb == NULL) return NULL; *mrb = mrb_state_zero; |
