summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/numeric.c16
-rw-r--r--src/variable.c9
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