Skip to content

Commit

Permalink
merges r24513,r24514 and r24515 from trunk into ruby_1_9_1.
Browse files Browse the repository at this point in the history
--
* 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.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_9_1@25479 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
  • Loading branch information
yugui committed Oct 25, 2009
1 parent 0a84a18 commit 3a724e0
Show file tree
Hide file tree
Showing 6 changed files with 59 additions and 19 deletions.
16 changes: 16 additions & 0 deletions ChangeLog
@@ -1,3 +1,19 @@
Wed Aug 12 15:52:04 2009 NARUSE, Yui <naruse@ruby-lang.org>

* 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@ruby-lang.org>

* 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@atdot.net>

* insns.def, vm.c, vm_insnhelper.c, vm_insnhelper.h: check
Expand Down
26 changes: 17 additions & 9 deletions class.c
Expand Up @@ -297,27 +297,31 @@ rb_define_class(const char *name, VALUE super)

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);

Expand Down Expand Up @@ -367,11 +371,15 @@ rb_define_module(const char *name)

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)
Expand All @@ -381,7 +389,7 @@ rb_define_module_under(VALUE outer, const char *name)
}
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;
}
Expand Down
2 changes: 2 additions & 0 deletions include/ruby/intern.h
Expand Up @@ -150,8 +150,10 @@ VALUE rb_make_metaclass(VALUE, VALUE);
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);
Expand Down
21 changes: 11 additions & 10 deletions struct.c
Expand Up @@ -191,7 +191,7 @@ make_struct(VALUE name, VALUE members, VALUE klass)
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);

Expand Down Expand Up @@ -488,28 +488,29 @@ rb_struct_each_pair(VALUE s)
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;

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)) {
Expand Down
6 changes: 6 additions & 0 deletions test/ruby/test_marshal.rb
Expand Up @@ -198,4 +198,10 @@ def test_symbol
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
7 changes: 7 additions & 0 deletions test/ruby/test_struct.rb
Expand Up @@ -212,4 +212,11 @@ def test_error
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

0 comments on commit 3a724e0

Please sign in to comment.