diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/numeric.c | 16 | ||||
| -rw-r--r-- | src/variable.c | 9 |
2 files changed, 21 insertions, 4 deletions
diff --git a/src/numeric.c b/src/numeric.c index 8c7d448bd..b381bd206 100644 --- a/src/numeric.c +++ b/src/numeric.c @@ -1254,6 +1254,20 @@ num_cmp(mrb_state *mrb, mrb_value self) } } +static mrb_value +num_finite_p(mrb_state *mrb, mrb_value self) +{ + mrb_get_args(mrb, ""); + return mrb_true_value(); +} + +static mrb_value +num_infinite_p(mrb_state *mrb, mrb_value self) +{ + mrb_get_args(mrb, ""); + return mrb_false_value(); +} + /* 15.2.9.3.1 */ /* * call-seq: @@ -1284,6 +1298,8 @@ mrb_init_numeric(mrb_state *mrb) mrb_define_method(mrb, numeric, "/", num_div, MRB_ARGS_REQ(1)); /* 15.2.8.3.4 */ mrb_define_method(mrb, numeric, "quo", num_div, MRB_ARGS_REQ(1)); /* 15.2.7.4.5 (x) */ mrb_define_method(mrb, numeric, "<=>", num_cmp, MRB_ARGS_REQ(1)); /* 15.2.9.3.6 */ + mrb_define_method(mrb, numeric, "finite?", num_finite_p, MRB_ARGS_NONE()); + mrb_define_method(mrb, numeric, "infinite?",num_infinite_p, MRB_ARGS_NONE()); /* Integer Class */ integer = mrb_define_class(mrb, "Integer", numeric); /* 15.2.8 */ diff --git a/src/variable.c b/src/variable.c index 50fc70682..4fbe82dd9 100644 --- a/src/variable.c +++ b/src/variable.c @@ -663,17 +663,18 @@ mod_const_check(mrb_state *mrb, mrb_value mod) } static mrb_value -const_get(mrb_state *mrb, struct RClass *base, mrb_sym sym) +const_get(mrb_state *mrb, struct RClass *base, mrb_sym sym, mrb_bool top) { struct RClass *c = base; mrb_value v; iv_tbl *t; mrb_bool retry = FALSE; mrb_value name; + struct RClass *oclass = mrb->object_class; L_RETRY: while (c) { - if (c->iv) { + if (c->iv && (top || c != oclass || base == oclass)) { t = c->iv; if (iv_get(mrb, t, sym, &v)) return v; @@ -693,7 +694,7 @@ MRB_API mrb_value mrb_const_get(mrb_state *mrb, mrb_value mod, mrb_sym sym) { mod_const_check(mrb, mod); - return const_get(mrb, mrb_class_ptr(mod), sym); + return const_get(mrb, mrb_class_ptr(mod), sym, FALSE); } mrb_value @@ -729,7 +730,7 @@ mrb_vm_const_get(mrb_state *mrb, mrb_sym sym) } irep = irep->outer; } - return const_get(mrb, c, sym); + return const_get(mrb, c, sym, TRUE); } MRB_API void |
