summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--CONTRIBUTING.md1
-rw-r--r--include/mruby/value.h2
-rw-r--r--mrbgems/mruby-bin-mirb/tools/mirb/mirb.c8
-rw-r--r--mrbgems/mruby-eval/src/eval.c2
-rw-r--r--mrbgems/mruby-fiber/src/fiber.c18
-rw-r--r--mrbgems/mruby-time/src/time.c9
-rw-r--r--src/gc.c4
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 */
diff --git a/src/gc.c b/src/gc.c
index 6eb9808e3..8e982de6d 100644
--- a/src/gc.c
+++ b/src/gc.c
@@ -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;