[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]