Bug #4537 ยป attr-visibility-4537.patch
test/ruby/test_module.rb | ||
---|---|---|
assert_equal(false, o.respond_to?(:bar=))
|
||
end
|
||
def test_attr_public_at_toplevel
|
||
eval(<<-END, TOPLEVEL_BINDING)
|
||
String.send(:attr_accessor, :x)
|
||
String.send(:attr, :y)
|
||
String.send(:attr_reader, :z)
|
||
String.send(:attr_writer, :w)
|
||
END
|
||
s = ""
|
||
assert_nil s.x
|
||
s.x = 1
|
||
assert_equal 1, s.x
|
||
assert_nil s.y
|
||
s.instance_variable_set(:@y, 2)
|
||
assert_equal 2, s.y
|
||
assert_nil s.z
|
||
s.instance_variable_set(:@z, 3)
|
||
assert_equal 3, s.z
|
||
s.w = 4
|
||
assert_equal 4, s.instance_variable_get(:@w)
|
||
ensure
|
||
[:x, :x=, :y, :z, :w=].each do |meth|
|
||
String.undef_method(meth) rescue nil
|
||
end
|
||
end
|
||
def test_const_get_evaled
|
||
c1 = Class.new
|
||
c2 = Class.new(c1)
|
vm.c | ||
---|---|---|
const rb_execution_context_t *ec = GET_EC();
|
||
const rb_control_frame_t *cfp = rb_vm_get_ruby_level_next_cfp(ec, ec->cfp);
|
||
const rb_cref_t *cref;
|
||
if (cfp->self != self) return NULL;
|
||
if (!cfp || cfp->self != self) return NULL;
|
||
if (!vm_env_cref_by_cref(cfp->ep)) return NULL;
|
||
cref = vm_get_cref(cfp->ep);
|
||
if (CREF_CLASS(cref) != cbase) return NULL;
|
vm_method.c | ||
---|---|---|
vm_cref_set_visibility(METHOD_VISI_PRIVATE, TRUE);
|
||
}
|
||
const rb_cref_t *rb_vm_cref_in_context(VALUE self, VALUE cbase);
|
||
void
|
||
rb_attr(VALUE klass, ID id, int read, int write, int ex)
|
||
{
|
||
ID attriv;
|
||
rb_method_visibility_t visi;
|
||
const rb_execution_context_t *ec = GET_EC();
|
||
const rb_cref_t *cref = rb_vm_cref_in_context(klass, klass);
|
||
if (!ex) {
|
||
if (!ex || !cref) {
|
||
visi = METHOD_VISI_PUBLIC;
|
||
}
|
||
else {
|