ruby-changes:12786
From: nobu <ko1@a...>
Date: Wed, 12 Aug 2009 15:32:46 +0900 (JST)
Subject: [ruby-changes:12786] Ruby:r24513 (trunk): * class.c (rb_define_class_id_under, rb_define_module_id_under):
nobu 2009-08-12 15:32:21 +0900 (Wed, 12 Aug 2009) New Revision: 24513 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=24513 Log: * 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] Modified files: trunk/ChangeLog trunk/class.c trunk/include/ruby/intern.h trunk/struct.c trunk/test/ruby/test_struct.rb Index: include/ruby/intern.h =================================================================== --- include/ruby/intern.h (revision 24512) +++ include/ruby/intern.h (revision 24513) @@ -152,8 +152,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: ChangeLog =================================================================== --- ChangeLog (revision 24512) +++ ChangeLog (revision 24513) @@ -1,3 +1,13 @@ +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: struct.c =================================================================== --- struct.c (revision 24512) +++ struct.c (revision 24513) @@ -196,7 +196,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_ivar_set(nstr, id_members, members); @@ -496,21 +496,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; @@ -518,6 +516,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: class.c =================================================================== --- class.c (revision 24512) +++ class.c (revision 24513) @@ -359,26 +359,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); @@ -429,10 +433,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_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) Index: test/ruby/test_struct.rb =================================================================== --- test/ruby/test_struct.rb (revision 24512) +++ test/ruby/test_struct.rb (revision 24513) @@ -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 -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/