ext/oj/mimic_json.c in oj-3.13.9 vs ext/oj/mimic_json.c in oj-3.13.10
- old
+ new
@@ -270,11 +270,11 @@
case T_ARRAY: {
size_t cnt = RARRAY_LEN(obj);
size_t i;
for (i = 0; i < cnt; i++) {
- mimic_walk(Qnil, rb_ary_entry(obj, i), proc);
+ mimic_walk(Qnil, RARRAY_AREF(obj, i), proc);
}
break;
}
default: break;
}
@@ -497,10 +497,56 @@
copts.dump_opts.use = true;
return mimic_generate_core(2, rargs, &copts);
}
+static int parse_options_cb(VALUE k, VALUE v, VALUE info) {
+ struct _parseInfo *pi = (struct _parseInfo *)info;
+
+ if (oj_symbolize_names_sym == k) {
+ pi->options.sym_key = (Qtrue == v) ? Yes : No;
+ } else if (oj_quirks_mode_sym == k) {
+ pi->options.quirks_mode = (Qtrue == v) ? Yes : No;
+ } else if (oj_create_additions_sym == k) {
+ pi->options.create_ok = (Qtrue == v) ? Yes : No;
+ } else if (oj_allow_nan_sym == k) {
+ pi->options.allow_nan = (Qtrue == v) ? Yes : No;
+ } else if (oj_hash_class_sym == k) {
+ if (Qnil == v) {
+ pi->options.hash_class = Qnil;
+ } else {
+ rb_check_type(v, T_CLASS);
+ pi->options.hash_class = v;
+ }
+ } else if (oj_object_class_sym == k) {
+ if (Qnil == v) {
+ pi->options.hash_class = Qnil;
+ } else {
+ rb_check_type(v, T_CLASS);
+ pi->options.hash_class = v;
+ }
+ } else if (oj_array_class_sym == k) {
+ if (Qnil == v) {
+ pi->options.array_class = Qnil;
+ } else {
+ rb_check_type(v, T_CLASS);
+ pi->options.array_class = v;
+ }
+ } else if (oj_decimal_class_sym == k) {
+ pi->options.compat_bigdec = (oj_bigdecimal_class == v);
+ } else if (oj_max_nesting_sym == k) {
+ if (Qtrue == v) {
+ pi->max_depth = 100;
+ } else if (Qfalse == v || Qnil == v) {
+ pi->max_depth = 0;
+ } else if (T_FIXNUM == rb_type(v)) {
+ pi->max_depth = NUM2INT(v);
+ }
+ }
+ return ST_CONTINUE;
+}
+
static VALUE mimic_parse_core(int argc, VALUE *argv, VALUE self, bool bang) {
struct _parseInfo pi;
VALUE ropts;
VALUE args[1];
@@ -522,62 +568,14 @@
pi.options.bigdec_load = RubyDec;
pi.options.mode = CompatMode;
pi.max_depth = 100;
if (Qnil != ropts) {
- VALUE v;
-
if (T_HASH != rb_type(ropts)) {
rb_raise(rb_eArgError, "options must be a hash.");
}
- if (Qnil != (v = rb_hash_lookup(ropts, oj_symbolize_names_sym))) {
- pi.options.sym_key = (Qtrue == v) ? Yes : No;
- }
- if (Qnil != (v = rb_hash_lookup(ropts, oj_quirks_mode_sym))) {
- pi.options.quirks_mode = (Qtrue == v) ? Yes : No;
- }
- if (Qnil != (v = rb_hash_lookup(ropts, oj_create_additions_sym))) {
- pi.options.create_ok = (Qtrue == v) ? Yes : No;
- }
- if (Qnil != (v = rb_hash_lookup(ropts, oj_allow_nan_sym))) {
- pi.options.allow_nan = (Qtrue == v) ? Yes : No;
- }
- if (oj_hash_has_key(ropts, oj_hash_class_sym)) {
- if (Qnil == (v = rb_hash_lookup(ropts, oj_hash_class_sym))) {
- pi.options.hash_class = Qnil;
- } else {
- rb_check_type(v, T_CLASS);
- pi.options.hash_class = v;
- }
- }
- if (oj_hash_has_key(ropts, oj_object_class_sym)) {
- if (Qnil == (v = rb_hash_lookup(ropts, oj_object_class_sym))) {
- pi.options.hash_class = Qnil;
- } else {
- rb_check_type(v, T_CLASS);
- pi.options.hash_class = v;
- }
- }
- if (oj_hash_has_key(ropts, oj_array_class_sym)) {
- if (Qnil == (v = rb_hash_lookup(ropts, oj_array_class_sym))) {
- pi.options.array_class = Qnil;
- } else {
- rb_check_type(v, T_CLASS);
- pi.options.array_class = v;
- }
- }
- if (oj_hash_has_key(ropts, oj_decimal_class_sym)) {
- pi.options.compat_bigdec = (oj_bigdecimal_class == rb_hash_lookup(ropts, oj_decimal_class_sym));
- }
- v = rb_hash_lookup(ropts, oj_max_nesting_sym);
- if (Qtrue == v) {
- pi.max_depth = 100;
- } else if (Qfalse == v || Qnil == v) {
- pi.max_depth = 0;
- } else if (T_FIXNUM == rb_type(v)) {
- pi.max_depth = NUM2INT(v);
- }
+ rb_hash_foreach(ropts, parse_options_cb, (VALUE)&pi);
oj_parse_opt_match_string(&pi.options.str_rx, ropts);
if (Yes == pi.options.create_ok && Yes == pi.options.sym_key) {
rb_raise(rb_eArgError, ":symbolize_names and :create_additions can not both be true.");
}
}