diff options
| -rw-r--r-- | CONTRIBUTING.md | 1 | ||||
| -rw-r--r-- | include/mruby/value.h | 2 | ||||
| -rw-r--r-- | mrbgems/mruby-bin-mirb/tools/mirb/mirb.c | 8 | ||||
| -rw-r--r-- | mrbgems/mruby-eval/src/eval.c | 2 | ||||
| -rw-r--r-- | mrbgems/mruby-fiber/src/fiber.c | 18 | ||||
| -rw-r--r-- | mrbgems/mruby-time/src/time.c | 9 | ||||
| -rw-r--r-- | src/gc.c | 4 |
7 files changed, 36 insertions, 8 deletions
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index b8db5a7dc..7e102a9d5 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -14,6 +14,7 @@ things in mind before submitting your pull request: * Don't mix several features or bug-fixes in one pull request * Create a meaningful commit message * Explain your change (i.e. with a link to the issue you are fixing) +* Use mrbgem to provide non ISO features (classes, modules and methods) unless you have a special reason to implement them in the core ## Coding conventions diff --git a/include/mruby/value.h b/include/mruby/value.h index ab3adbd63..9210828b4 100644 --- a/include/mruby/value.h +++ b/include/mruby/value.h @@ -398,7 +398,7 @@ struct RObject { #define mrb_obj_ptr(v) ((struct RObject*)(mrb_ptr(v))) /* obsolete macro mrb_object; will be removed soon */ #define mrb_object(o) mrb_obj_ptr(o) -#define mrb_immediate_p(x) (mrb_type(x) <= MRB_TT_CPTR) +#define mrb_immediate_p(x) (mrb_type(x) < MRB_TT_HAS_BASIC) #define mrb_special_const_p(x) mrb_immediate_p(x) struct RFiber { diff --git a/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c b/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c index dece361a5..f96508d55 100644 --- a/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c +++ b/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c @@ -200,7 +200,7 @@ parse_args(mrb_state *mrb, int argc, char **argv, struct _args *args) switch (*item++) { case 'v': if (!args->verbose) mrb_show_version(mrb); - args->verbose = 1; + args->verbose = TRUE; break; case '-': if (strcmp((*argv) + 2, "version") == 0) { @@ -208,7 +208,7 @@ parse_args(mrb_state *mrb, int argc, char **argv, struct _args *args) exit(EXIT_SUCCESS); } else if (strcmp((*argv) + 2, "verbose") == 0) { - args->verbose = 1; + args->verbose = TRUE; break; } else if (strcmp((*argv) + 2, "copyright") == 0) { @@ -313,10 +313,10 @@ main(int argc, char **argv) print_hint(); cxt = mrbc_context_new(mrb); - cxt->capture_errors = 1; + cxt->capture_errors = TRUE; cxt->lineno = 1; mrbc_filename(mrb, cxt, "(mirb)"); - if (args.verbose) cxt->dump_result = 1; + if (args.verbose) cxt->dump_result = TRUE; ai = mrb_gc_arena_save(mrb); diff --git a/mrbgems/mruby-eval/src/eval.c b/mrbgems/mruby-eval/src/eval.c index daf5b2a1e..b5cb833c2 100644 --- a/mrbgems/mruby-eval/src/eval.c +++ b/mrbgems/mruby-eval/src/eval.c @@ -173,7 +173,7 @@ f_eval(mrb_state *mrb, mrb_value self) void mrb_mruby_eval_gem_init(mrb_state* mrb) { - mrb_define_module_function(mrb, mrb->kernel_module, "eval", f_eval, MRB_ARGS_REQ(1) | MRB_ARGS_OPT(3)); + mrb_define_module_function(mrb, mrb->kernel_module, "eval", f_eval, MRB_ARGS_ARG(1, 3)); } void diff --git a/mrbgems/mruby-fiber/src/fiber.c b/mrbgems/mruby-fiber/src/fiber.c index 9bd15f4b6..07ae80293 100644 --- a/mrbgems/mruby-fiber/src/fiber.c +++ b/mrbgems/mruby-fiber/src/fiber.c @@ -8,6 +8,8 @@ #define FIBER_STACK_INIT_SIZE 64 #define FIBER_CI_INIT_SIZE 8 +#define SET_NIL_VALUE(r) MRB_SET_VALUE(r, MRB_TT_FALSE, value.i, 0) + /* * call-seq: * Fiber.new{...} -> obj @@ -85,10 +87,24 @@ fiber_init(mrb_state *mrb, mrb_value self) c = f->cxt; /* initialize VM stack */ - c->stbase = (mrb_value *)mrb_calloc(mrb, FIBER_STACK_INIT_SIZE, sizeof(mrb_value)); + c->stbase = (mrb_value *)mrb_malloc(mrb, FIBER_STACK_INIT_SIZE*sizeof(mrb_value)); c->stend = c->stbase + FIBER_STACK_INIT_SIZE; c->stack = c->stbase; +#ifdef MRB_NAN_BOXING + { + mrb_value *p = c->stbase; + mrb_value *pend = p + FIBER_STACK_INIT_SIZE; + + while (p < pend) { + SET_NIL_VALUE(*p); + p++; + } + } +#else + memset(c->stbase, 0, FIBER_STACK_INIT_SIZE * sizeof(mrb_value)); +#endif + /* copy receiver from a block */ c->stack[0] = mrb->c->stack[0]; diff --git a/mrbgems/mruby-time/src/time.c b/mrbgems/mruby-time/src/time.c index 410b36173..8903c522a 100644 --- a/mrbgems/mruby-time/src/time.c +++ b/mrbgems/mruby-time/src/time.c @@ -201,6 +201,13 @@ time_alloc(mrb_state *mrb, double sec, double usec, enum mrb_timezone timezone) tm = (struct mrb_time *)mrb_malloc(mrb, sizeof(struct mrb_time)); tm->sec = (time_t)sec; + if (sizeof(time_t) == 4 && (sec > (double)INT32_MAX || (double)INT32_MIN > sec)) { + goto out_of_range; + } + else if ((sec > 0 && tm->sec < 0) || (sec < 0 && (double)tm->sec > sec)) { + out_of_range: + mrb_raisef(mrb, E_ARGUMENT_ERROR, "%S out of Time range", mrb_float_value(mrb, sec)); + } tm->usec = (time_t)((sec - tm->sec) * 1.0e6 + usec); while (tm->usec < 0) { tm->sec--; @@ -713,7 +720,7 @@ mrb_mruby_time_gem_init(mrb_state* mrb) tc = mrb_define_class(mrb, "Time", mrb->object_class); MRB_SET_INSTANCE_TT(tc, MRB_TT_DATA); mrb_include_module(mrb, tc, mrb_module_get(mrb, "Comparable")); - mrb_define_class_method(mrb, tc, "at", mrb_time_at, MRB_ARGS_REQ(1) | MRB_ARGS_OPT(1)); /* 15.2.19.6.1 */ + mrb_define_class_method(mrb, tc, "at", mrb_time_at, MRB_ARGS_ARG(1, 1)); /* 15.2.19.6.1 */ mrb_define_class_method(mrb, tc, "gm", mrb_time_gm, MRB_ARGS_ARG(1,6)); /* 15.2.19.6.2 */ mrb_define_class_method(mrb, tc, "local", mrb_time_local, MRB_ARGS_ARG(1,6)); /* 15.2.19.6.3 */ mrb_define_class_method(mrb, tc, "mktime", mrb_time_local, MRB_ARGS_ARG(1,6));/* 15.2.19.6.4 */ @@ -107,6 +107,10 @@ typedef struct { struct RRange range; struct RData data; struct RProc proc; +#ifdef MRB_WORD_BOXING + struct RFloat floatv; + struct RCptr cptr; +#endif } as; } RVALUE; |
