ruby-changes:13692
From: yugui <ko1@a...>
Date: Sun, 25 Oct 2009 23:46:58 +0900 (JST)
Subject: [ruby-changes:13692] Ruby:r25479 (ruby_1_9_1): merges r24513,r24514 and r24515 from trunk into ruby_1_9_1.
yugui 2009-10-25 23:46:28 +0900 (Sun, 25 Oct 2009) New Revision: 25479 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=25479 Log: merges r24513,r24514 and r24515 from trunk into ruby_1_9_1. -- * class.c (rb_define_class_id_under, rb_define_module_id_under): new functions to define a nested class/module with non-ascii name. * struct.c (make_struct): use name with encoding. * struct.c (inspect_struct): ditto. [ruby-core:24849] -- * test/ruby/test_marshal.rb (test_class_nonascii): test for non-ascii name class. -- * class.c (rb_define_module_id_under): fix the name. * class.c (rb_define_module_under): fix for prevvious changes. Modified files: branches/ruby_1_9_1/ChangeLog branches/ruby_1_9_1/class.c branches/ruby_1_9_1/include/ruby/intern.h branches/ruby_1_9_1/struct.c branches/ruby_1_9_1/test/ruby/test_marshal.rb branches/ruby_1_9_1/test/ruby/test_struct.rb Index: ruby_1_9_1/include/ruby/intern.h =================================================================== --- ruby_1_9_1/include/ruby/intern.h (revision 25478) +++ ruby_1_9_1/include/ruby/intern.h (revision 25479) @@ -150,8 +150,10 @@ void rb_check_inheritable(VALUE); VALUE rb_class_inherited(VALUE, VALUE); VALUE rb_define_class_id(ID, VALUE); +VALUE rb_define_class_id_under(VALUE, ID, VALUE); VALUE rb_module_new(void); VALUE rb_define_module_id(ID); +VALUE rb_define_module_id_under(VALUE, ID); VALUE rb_mod_included_modules(VALUE); VALUE rb_mod_include_p(VALUE, VALUE); VALUE rb_mod_ancestors(VALUE); Index: ruby_1_9_1/ChangeLog =================================================================== --- ruby_1_9_1/ChangeLog (revision 25478) +++ ruby_1_9_1/ChangeLog (revision 25479) @@ -1,3 +1,19 @@ +Wed Aug 12 15:52:04 2009 NARUSE, Yui <naruse@r...> + + * class.c (rb_define_module_id_under): fix the name. + + * class.c (rb_define_module_under): fix for prevvious changes. + +Wed Aug 12 15:32:16 2009 Nobuyoshi Nakada <nobu@r...> + + * class.c (rb_define_class_id_under, rb_define_module_id_under): + new functions to define a nested class/module with non-ascii + name. + + * struct.c (make_struct): use name with encoding. + + * struct.c (inspect_struct): ditto. [ruby-core:24849] + Wed Aug 12 Wed Aug 12 14:54:34 2009 Koichi Sasada <ko1@a...> * insns.def, vm.c, vm_insnhelper.c, vm_insnhelper.h: check Index: ruby_1_9_1/struct.c =================================================================== --- ruby_1_9_1/struct.c (revision 25478) +++ ruby_1_9_1/struct.c (revision 25479) @@ -191,7 +191,7 @@ rb_warn("redefining constant Struct::%s", StringValuePtr(name)); rb_mod_remove_const(klass, ID2SYM(id)); } - nstr = rb_define_class_under(klass, rb_id2name(id), klass); + nstr = rb_define_class_id_under(klass, id, klass); } rb_iv_set(nstr, "__members__", members); @@ -488,21 +488,19 @@ static VALUE inspect_struct(VALUE s, VALUE dummy, int recur) { - const char *cname = rb_class2name(rb_obj_class(s)); - VALUE str, members; + VALUE cname = rb_class_name(rb_obj_class(s)); + VALUE members, str = rb_str_new2("#<struct "); long i; + char first = RSTRING_PTR(cname)[0]; + if (recur || first != '#') { + rb_str_append(str, cname); + } if (recur) { - return rb_sprintf("#<struct %s:...>", cname); + return rb_str_cat2(str, ":...>"); } members = rb_struct_members(s); - if (cname[0] == '#') { - str = rb_str_new2("#<struct "); - } - else { - str = rb_sprintf("#<struct %s ", cname); - } for (i=0; i<RSTRUCT_LEN(s); i++) { VALUE slot; ID id; @@ -510,6 +508,9 @@ if (i > 0) { rb_str_cat2(str, ", "); } + else if (first != '#') { + rb_str_cat2(str, " "); + } slot = RARRAY_PTR(members)[i]; id = SYM2ID(slot); if (rb_is_local_id(id) || rb_is_const_id(id)) { Index: ruby_1_9_1/class.c =================================================================== --- ruby_1_9_1/class.c (revision 25478) +++ ruby_1_9_1/class.c (revision 25479) @@ -298,26 +298,30 @@ VALUE rb_define_class_under(VALUE outer, const char *name, VALUE super) { + return rb_define_class_id_under(outer, rb_intern(name), super); +} + +VALUE +rb_define_class_id_under(VALUE outer, ID id, VALUE super) +{ VALUE klass; - ID id; - id = rb_intern(name); if (rb_const_defined_at(outer, id)) { klass = rb_const_get_at(outer, id); if (TYPE(klass) != T_CLASS) { - rb_raise(rb_eTypeError, "%s is not a class", name); + rb_raise(rb_eTypeError, "%s is not a class", rb_id2name(id)); } if (rb_class_real(RCLASS_SUPER(klass)) != super) { - rb_name_error(id, "%s is already defined", name); + rb_name_error(id, "%s is already defined", rb_id2name(id)); } return klass; } if (!super) { rb_warn("no super class for `%s::%s', Object assumed", - rb_class2name(outer), name); + rb_class2name(outer), rb_id2name(id)); } klass = rb_define_class_id(id, super); - rb_set_class_path(klass, outer, name); + rb_set_class_path_string(klass, outer, rb_id2str(id)); rb_const_set(outer, id, klass); rb_class_inherited(super, klass); @@ -368,10 +372,14 @@ VALUE rb_define_module_under(VALUE outer, const char *name) { + return rb_define_module_id_under(outer, rb_intern(name)); +} + +VALUE +rb_define_module_id_under(VALUE outer, ID id) +{ VALUE module; - ID id; - id = rb_intern(name); if (rb_const_defined_at(outer, id)) { module = rb_const_get_at(outer, id); if (TYPE(module) == T_MODULE) @@ -381,7 +389,7 @@ } module = rb_define_module_id(id); rb_const_set(outer, id, module); - rb_set_class_path(module, outer, name); + rb_set_class_path_string(module, outer, rb_id2str(id)); return module; } Index: ruby_1_9_1/test/ruby/test_struct.rb =================================================================== --- ruby_1_9_1/test/ruby/test_struct.rb (revision 25478) +++ ruby_1_9_1/test/ruby/test_struct.rb (revision 25479) @@ -212,4 +212,11 @@ Struct.new(0) } end + + def test_nonascii + struct_test = Struct.new("R\u{e9}sum\u{e9}", :"r\u{e9}sum\u{e9}") + assert_equal(Struct.const_get("R\u{e9}sum\u{e9}"), struct_test, '[ruby-core:24849]') + a = struct_test.new(42) + assert_equal("#<struct Struct::R\u{e9}sum\u{e9} r\u{e9}sum\u{e9}=42>", a.inspect, '[ruby-core:24849]') + end end Index: ruby_1_9_1/test/ruby/test_marshal.rb =================================================================== --- ruby_1_9_1/test/ruby/test_marshal.rb (revision 25478) +++ ruby_1_9_1/test/ruby/test_marshal.rb (revision 25479) @@ -198,4 +198,10 @@ assert_equal(sym, Marshal.load(Marshal.dump(sym)), '[ruby-core:24788]') end end + + ClassUTF8 = eval("class R\u{e9}sum\u{e9}; self; end") + def test_class_nonascii + a = ClassUTF8.new + assert_instance_of(ClassUTF8, Marshal.load(Marshal.dump(a)), '[ruby-core:24790]') + end end -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/