summaryrefslogtreecommitdiffstats
path: root/variable.c
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-08-09 21:55:55 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-08-09 21:55:55 +0000
commit3a820add40f55929acd5af419134488465ca1ceb (patch)
tree607bbe0557a0284a8576c949bbc7c3db70049e64 /variable.c
parent6a86ff819fe32971254909de1942bfc39a0ed2bf (diff)
downloadruby-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.c19
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)
{