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);