Feature #3511 » marshal-dynamic.patch
| test/ruby/test_marshal.rb (working copy) | ||
|---|---|---|
|
assert_equal(o1, o2, bug6209)
|
||
|
end
|
||
|
def test_marshal_dynamic_class
|
||
|
mod = Module.new do
|
||
|
def self.const_missing(name)
|
||
|
const_set(name, Class.new) if name == :C
|
||
|
end
|
||
|
def self.remove_C
|
||
|
remove_const :C
|
||
|
end
|
||
|
end
|
||
|
Object.const_set :M, mod
|
||
|
begin
|
||
|
object = M::C.new
|
||
|
string = Marshal.dump(object)
|
||
|
M.remove_C
|
||
|
assert !M.const_defined?(:C)
|
||
|
object = Marshal.load(string)
|
||
|
assert_same M::C, object.class
|
||
|
ensure
|
||
|
Object.__send__ :remove_const, :M
|
||
|
end
|
||
|
end
|
||
|
class PrivateClass
|
||
|
def initialize(foo)
|
||
|
@foo = foo
|
||
| variable.c (working copy) | ||
|---|---|---|
|
static void check_before_mod_set(VALUE, ID, VALUE, const char *);
|
||
|
static void setup_const_entry(rb_const_entry_t *, VALUE, VALUE, rb_const_flag_t);
|
||
|
static VALUE rb_const_get_0(VALUE klass, ID id, int exclude, int recurse, int visibility);
|
||
|
static VALUE rb_const_search(VALUE klass, ID id, int exclude, int recurse, int visibility);
|
||
|
static st_table *generic_iv_tbl;
|
||
|
static st_table *generic_iv_tbl_compat;
|
||
| ... | ... | |
|
rb_raise(rb_eArgError, "undefined class/module % "PRIsVALUE,
|
||
|
rb_str_subseq(pathname, 0, p-path));
|
||
|
}
|
||
|
c = rb_const_search(c, id, TRUE, FALSE, FALSE);
|
||
|
c = rb_const_get_0(c, id, TRUE, FALSE, FALSE);
|
||
|
if (c == Qundef) goto undefined_class;
|
||
|
if (!RB_TYPE_P(c, T_MODULE) && !RB_TYPE_P(c, T_CLASS)) {
|
||
|
rb_raise(rb_eTypeError, "%"PRIsVALUE" does not refer to class/module",
|
||
- « Previous
- 1
- 2
- Next »