diff options
| author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2009-08-09 21:55:55 +0000 |
|---|---|---|
| committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2009-08-09 21:55:55 +0000 |
| commit | 3a820add40f55929acd5af419134488465ca1ceb (patch) | |
| tree | 607bbe0557a0284a8576c949bbc7c3db70049e64 /variable.c | |
| parent | 6a86ff819fe32971254909de1942bfc39a0ed2bf (diff) | |
| download | ruby-3a820add40f55929acd5af419134488465ca1ceb.tar.gz ruby-3a820add40f55929acd5af419134488465ca1ceb.tar.xz ruby-3a820add40f55929acd5af419134488465ca1ceb.zip | |
* 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: http://svn.ruby-lang.org/repos/ruby/trunk@24488 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'variable.c')
| -rw-r--r-- | variable.c | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/variable.c b/variable.c index 1cea104bf..65f0484cb 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) { |
