summaryrefslogtreecommitdiff
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
commit3ece38366080f6c862e243d152476572ba15268a (patch)
tree607bbe0557a0284a8576c949bbc7c3db70049e64 /variable.c
parent979ac967a9d0437e698d3e555098c77e495baee8 (diff)
* 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
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 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)
{