summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/gc.c2
-rw-r--r--src/variable.c32
-rw-r--r--src/vm.c9
-rw-r--r--test/t/float.rb2
4 files changed, 28 insertions, 17 deletions
diff --git a/src/gc.c b/src/gc.c
index e93e36f0b..2b0eb8885 100644
--- a/src/gc.c
+++ b/src/gc.c
@@ -1425,7 +1425,7 @@ gc_each_objects(mrb_state *mrb, mrb_gc *gc, mrb_each_object_callback *callback,
void
mrb_objspace_each_objects(mrb_state *mrb, mrb_each_object_callback *callback, void *data)
{
- return gc_each_objects(mrb, &mrb->gc, callback, data);
+ gc_each_objects(mrb, &mrb->gc, callback, data);
}
#ifdef GC_TEST
diff --git a/src/variable.c b/src/variable.c
index efe6fad12..fa1389caf 100644
--- a/src/variable.c
+++ b/src/variable.c
@@ -759,17 +759,29 @@ MRB_API mrb_value
mrb_mod_cv_get(mrb_state *mrb, struct RClass * c, mrb_sym sym)
{
struct RClass * cls = c;
+ mrb_value v;
while (c) {
- if (c->iv) {
- iv_tbl *t = c->iv;
- mrb_value v;
-
- if (iv_get(mrb, t, sym, &v))
- return v;
+ if (c->iv && iv_get(mrb, c->iv, sym, &v)) {
+ return v;
}
c = c->super;
}
+ if (cls && cls->tt == MRB_TT_SCLASS) {
+ mrb_value klass;
+
+ klass = mrb_obj_iv_get(mrb, (struct RObject *)cls,
+ mrb_intern_lit(mrb, "__attached__"));
+ c = mrb_class_ptr(klass);
+ if (c->tt == MRB_TT_CLASS) {
+ while (c) {
+ if (c->iv && iv_get(mrb, c->iv, sym, &v)) {
+ return v;
+ }
+ c = c->super;
+ }
+ }
+ }
mrb_name_error(mrb, sym, "uninitialized class variable %S in %S",
mrb_sym2str(mrb, sym), mrb_obj_value(cls));
/* not reached */
@@ -914,6 +926,14 @@ mrb_vm_const_get(mrb_state *mrb, mrb_sym sym)
if (c->iv && iv_get(mrb, c->iv, sym, &v)) {
return v;
}
+ if (c->tt == MRB_TT_SCLASS) {
+ mrb_value klass;
+ klass = mrb_obj_iv_get(mrb, (struct RObject *)c,
+ mrb_intern_lit(mrb, "__attached__"));
+ c2 = mrb_class_ptr(klass);
+ if (c2->tt == MRB_TT_CLASS)
+ c = c2;
+ }
c2 = c;
for (;;) {
c2 = mrb_class_outer_module(mrb, c2);
diff --git a/src/vm.c b/src/vm.c
index e77dd1eb2..34aeddb94 100644
--- a/src/vm.c
+++ b/src/vm.c
@@ -2208,15 +2208,6 @@ RETRY_TRY_BLOCK:
}
else {
p = mrb_proc_new(mrb, irep->reps[GETARG_b(i)]);
- if (c & OP_L_METHOD) {
- if (p->target_class->tt == MRB_TT_SCLASS) {
- mrb_value klass;
- klass = mrb_obj_iv_get(mrb,
- (struct RObject *)p->target_class,
- mrb_intern_lit(mrb, "__attached__"));
- p->target_class = mrb_class_ptr(klass);
- }
- }
}
if (c & OP_L_STRICT) p->flags |= MRB_PROC_STRICT;
regs[GETARG_A(i)] = mrb_obj_value(p);
diff --git a/test/t/float.rb b/test/t/float.rb
index 0aab0b1f2..1805c6e7d 100644
--- a/test/t/float.rb
+++ b/test/t/float.rb
@@ -198,5 +198,5 @@ assert('Float#>>') do
assert_equal 0, 23.0 >> 128
# Don't raise on large Right Shift
- assert_equal -1, -23.0 >> 128
+ assert_equal(-1, -23.0 >> 128)
end