ext/oj/load.c in oj-0.7.0 vs ext/oj/load.c in oj-0.8.0
- old
+ new
@@ -110,19 +110,18 @@
}
}
}
inline static VALUE
-resolve_classname(VALUE mod, const char *class_name, int create) {
+resolve_classname(VALUE mod, const char *class_name, int auto_define) {
VALUE clas;
ID ci = rb_intern(class_name);
- if (rb_const_defined_at(mod, ci) || !create) {
+ if (rb_const_defined_at(mod, ci) || !auto_define) {
clas = rb_const_get_at(mod, ci);
} else {
- //clas = rb_define_class_under(mod, class_name, oj_bag_clas);
- clas = rb_const_get_at(mod, ci); // TBD temp
+ clas = rb_define_class_under(mod, class_name, oj_bag_class);
}
return clas;
}
inline static VALUE
@@ -137,14 +136,12 @@
}
static VALUE
classname2class(const char *name, ParseInfo pi) {
VALUE clas;
- int create = 0; // TBD from options
-
-#if 1
VALUE *slot;
+ int auto_define = (Yes == pi->options->auto_define);
if (Qundef == (clas = oj_cache_get(oj_class_cache, name, &slot))) {
char class_name[1024];
char *s;
const char *n = name;
@@ -152,44 +149,26 @@
clas = rb_cObject;
for (s = class_name; '\0' != *n; n++) {
if (':' == *n) {
*s = '\0';
n++;
- if (Qundef == (clas = resolve_classname(clas, class_name, create))) {
+ if (':' != *n) {
+ raise_error("Invalid classname, expected another ':'", pi->str, pi->s);
+ }
+ if (Qundef == (clas = resolve_classname(clas, class_name, auto_define))) {
return Qundef;
}
s = class_name;
} else {
*s++ = *n;
}
}
*s = '\0';
- if (Qundef != (clas = resolve_classname(clas, class_name, create))) {
+ if (Qundef != (clas = resolve_classname(clas, class_name, auto_define))) {
*slot = clas;
}
}
-#else
- char class_name[1024];
- char *s;
- const char *n = name;
-
- clas = rb_cObject;
- for (s = class_name; '\0' != *n; n++) {
- if (':' == *n) {
- *s = '\0';
- n++;
- if (Qundef == (clas = resolve_classname(clas, class_name, create))) {
- return Qundef;
- }
- s = class_name;
- } else {
- *s++ = *n;
- }
- }
- *s = '\0';
- clas = resolve_classname(clas, class_name, create);
-#endif
return clas;
}
VALUE
oj_parse(char *json, Options options) {
@@ -312,10 +291,14 @@
break;
case 'c': // Class
obj = read_next(pi, T_CLASS);
key = Qundef;
break;
- case 's': // Symbol
+ case 's': // String
+ obj = read_next(pi, T_STRING);
+ key = Qundef;
+ break;
+ case 'm': // Symbol
obj = read_next(pi, T_SYMBOL);
key = Qundef;
break;
case 'o': // Object
obj = read_next(pi, T_OBJECT);