Bug #11636 ยป instance_eval-module-super-11636.patch
| class.c | ||
|---|---|---|
|
}
|
||
|
iclass = rb_include_class_new(module, RCLASS_SUPER(c));
|
||
|
c = RCLASS_SET_SUPER(c, iclass);
|
||
|
RCLASS_SET_INCLUDER(iclass, klass);
|
||
|
{
|
||
|
VALUE m = module;
|
||
| internal.h | ||
|---|---|---|
|
const VALUE origin_;
|
||
|
const VALUE refined_class;
|
||
|
rb_alloc_func_t allocator;
|
||
|
const VALUE includer;
|
||
|
};
|
||
|
typedef struct rb_classext_struct rb_classext_t;
|
||
| ... | ... | |
|
#define RCLASS_ORIGIN(c) (RCLASS_EXT(c)->origin_)
|
||
|
#define RCLASS_REFINED_CLASS(c) (RCLASS_EXT(c)->refined_class)
|
||
|
#define RCLASS_SERIAL(c) (RCLASS_EXT(c)->class_serial)
|
||
|
#define RCLASS_INCLUDER(c) (RCLASS_EXT(c)->includer)
|
||
|
#define RCLASS_CLONED FL_USER6
|
||
|
#define RICLASS_IS_ORIGIN FL_USER5
|
||
| ... | ... | |
|
if (klass != origin) FL_SET(origin, RICLASS_IS_ORIGIN);
|
||
|
}
|
||
|
static inline void
|
||
|
RCLASS_SET_INCLUDER(VALUE iclass, VALUE klass)
|
||
|
{
|
||
|
RB_OBJ_WRITE(iclass, &RCLASS_INCLUDER(iclass), klass);
|
||
|
}
|
||
|
#undef RCLASS_SUPER
|
||
|
static inline VALUE
|
||
|
RCLASS_SUPER(VALUE klass)
|
||
| test/ruby/test_super.rb | ||
|---|---|---|
|
end
|
||
|
end
|
||
|
def test_super_in_instance_eval_in_module
|
||
|
super_class = EnvUtil.labeled_class("Super\u{30af 30e9 30b9}") {
|
||
|
def foo
|
||
|
return [:super, self]
|
||
|
end
|
||
|
}
|
||
|
mod = EnvUtil.labeled_module("Mod\u{30af 30e9 30b9}") {
|
||
|
def foo
|
||
|
x = Object.new
|
||
|
x.instance_eval do
|
||
|
super()
|
||
|
end
|
||
|
end
|
||
|
}
|
||
|
sub_class = EnvUtil.labeled_class("Sub\u{30af 30e9 30b9}", super_class) {
|
||
|
include mod
|
||
|
}
|
||
|
obj = sub_class.new
|
||
|
assert_raise_with_message(TypeError, /Sub\u{30af 30e9 30b9}/) do
|
||
|
obj.foo
|
||
|
end
|
||
|
end
|
||
|
def test_super_in_orphan_block
|
||
|
super_class = EnvUtil.labeled_class("Super\u{30af 30e9 30b9}") {
|
||
|
def foo
|
||
| vm_insnhelper.c | ||
|---|---|---|
|
}
|
||
|
if (BUILTIN_TYPE(current_defined_class) != T_MODULE &&
|
||
|
BUILTIN_TYPE(current_defined_class) != T_ICLASS && /* bound UnboundMethod */
|
||
|
!FL_TEST(current_defined_class, RMODULE_INCLUDED_INTO_REFINEMENT) &&
|
||
|
!rb_obj_is_kind_of(recv, current_defined_class)) {
|
||
|
VALUE m = RB_TYPE_P(current_defined_class, T_ICLASS) ?
|
||
|
RBASIC(current_defined_class)->klass : current_defined_class;
|
||
|
RCLASS_INCLUDER(current_defined_class) : current_defined_class;
|
||
|
rb_raise(rb_eTypeError,
|
||
|
"self has wrong type to call super in this context: "
|
||
|
"%"PRIsVALUE" (expected %"PRIsVALUE")",
|
||
|
rb_obj_class(recv), m);
|
||
|
if (m) { /* not bound UnboundMethod */
|
||
|
rb_raise(rb_eTypeError,
|
||
|
"self has wrong type to call super in this context: "
|
||
|
"%"PRIsVALUE" (expected %"PRIsVALUE")",
|
||
|
rb_obj_class(recv), m);
|
||
|
}
|
||
|
}
|
||
|
if (me->def->type == VM_METHOD_TYPE_BMETHOD && (ci->flag & VM_CALL_ZSUPER)) {
|
||