From 3ece38366080f6c862e243d152476572ba15268a Mon Sep 17 00:00:00 2001 From: nobu Date: Sun, 9 Aug 2009 21:55:55 +0000 Subject: * marshal.c (class2path, w_unique, w_extended, w_class, w_uclass): deal with non-ascii class path. [ruby-core:24790] * marshal.c (r_unique, path2class, path2module, obj_alloc_by_path), (r_object0): ditto. * variable.c (rb_path_to_class): new encoding-aware function to get a class from its name. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@24488 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- variable.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) (limited to 'variable.c') diff --git a/variable.c b/variable.c index 1cea104bf0..65f0484cbc 100644 --- a/variable.c +++ b/variable.c @@ -14,6 +14,7 @@ #include "ruby/ruby.h" #include "ruby/st.h" #include "ruby/util.h" +#include "ruby/encoding.h" #include "node.h" void rb_vm_change_state(void); @@ -249,19 +250,23 @@ rb_set_class_path(VALUE klass, VALUE under, const char *name) } VALUE -rb_path2class(const char *path) +rb_path_to_class(VALUE pathname) { - const char *pbeg, *p; + rb_encoding *enc = rb_enc_get(pathname); + const char *pbeg, *p, *path = RSTRING_PTR(pathname); ID id; VALUE c = rb_cObject; + if (!rb_enc_asciicompat(enc)) { + rb_raise(rb_eArgError, "invalid class path encoding (non ASCII)"); + } + pbeg = p = path; if (path[0] == '#') { rb_raise(rb_eArgError, "can't retrieve anonymous class %s", path); } - pbeg = p = path; while (*p) { while (*p && *p != ':') p++; - id = rb_intern2(pbeg, p-pbeg); + id = rb_intern3(pbeg, p-pbeg, enc); if (p[0] == ':') { if (p[1] != ':') goto undefined_class; p += 2; @@ -284,6 +289,12 @@ rb_path2class(const char *path) return c; } +VALUE +rb_path2class(const char *path) +{ + return rb_path_to_class(rb_usascii_str_new_cstr(path)); +} + void rb_name_class(VALUE klass, ID id) { -- cgit v1.2.3