Skip to content

Commit 59fa177

Browse files
committed
Merge branch 'debug-resolve-class' into develop
2 parents 41c55e2 + 4b4bb38 commit 59fa177

File tree

3 files changed

+42
-41
lines changed

3 files changed

+42
-41
lines changed

ext/oj/intern.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,7 @@ static VALUE resolve_classpath(ParseInfo pi, const char *name, size_t len, int a
186186
char * end = class_name + sizeof(class_name) - 1;
187187
char * s;
188188
const char *n = name;
189+
size_t nlen = len;
189190

190191
clas = rb_cObject;
191192
for (s = class_name; 0 < len; n++, len--) {
@@ -208,7 +209,12 @@ static VALUE resolve_classpath(ParseInfo pi, const char *name, size_t len, int a
208209
}
209210
*s = '\0';
210211
if (Qundef == (clas = resolve_classname(clas, class_name, auto_define))) {
211-
oj_set_error_at(pi, error_class, __FILE__, __LINE__, "class %s is not defined", name);
212+
if (sizeof(class_name) <= nlen) {
213+
nlen = sizeof(class_name) - 1;
214+
}
215+
strncpy(class_name, name, nlen);
216+
class_name[nlen] = '\0';
217+
oj_set_error_at(pi, error_class, __FILE__, __LINE__, "class '%s' is not defined", class_name);
212218
if (Qnil != error_class) {
213219
pi->err_class = error_class;
214220
}

ext/oj/object.c

Lines changed: 26 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ static VALUE calc_hash_key(ParseInfo pi, Val kval, char k1) {
3535
return ID2SYM(rb_intern3(kval->key + 1, kval->klen - 1, oj_utf8_encoding));
3636
}
3737
if (Yes == pi->options.sym_key) {
38-
return ID2SYM(rb_intern3(kval->key, kval->klen, oj_utf8_encoding));
38+
return ID2SYM(rb_intern3(kval->key, kval->klen, oj_utf8_encoding));
3939
}
4040
#if HAVE_RB_ENC_INTERNED_STR
4141
rkey = rb_enc_interned_str(kval->key, kval->klen, oj_utf8_encoding);
@@ -60,16 +60,16 @@ static VALUE str_to_value(ParseInfo pi, const char *str, size_t len, const char
6060
}
6161
rstr = oj_circ_array_get(pi->circ_array, i);
6262
} else {
63-
rstr = rb_utf8_str_new(str, len);
63+
rstr = rb_utf8_str_new(str, len);
6464
}
6565
return rstr;
6666
}
6767

6868
// The much faster approach (4x faster)
6969
static int parse_num(const char *str, const char *end, int cnt) {
70-
int n = 0;
70+
int n = 0;
7171
char c;
72-
int i;
72+
int i;
7373

7474
for (i = cnt; 0 < i; i--, str++) {
7575
c = *str;
@@ -83,9 +83,9 @@ static int parse_num(const char *str, const char *end, int cnt) {
8383

8484
VALUE
8585
oj_parse_xml_time(const char *str, int len) {
86-
VALUE args[8];
86+
VALUE args[8];
8787
const char *end = str + len;
88-
int n;
88+
int n;
8989

9090
// year
9191
if (0 > (n = parse_num(str, end, 4))) {
@@ -220,13 +220,10 @@ static int hat_cstr(ParseInfo pi, Val parent, Val kval, const char *str, size_t
220220
}
221221
parent->val = odd->clas;
222222
parent->odd_args = oj_odd_alloc_args(odd);
223-
} break;
224-
case 'm':
225-
parent->val = ID2SYM(rb_intern3(str + 1, len - 1, oj_utf8_encoding));
226-
break;
227-
case 's':
228-
parent->val = rb_utf8_str_new(str, len);
229223
break;
224+
}
225+
case 'm': parent->val = ID2SYM(rb_intern3(str + 1, len - 1, oj_utf8_encoding)); break;
226+
case 's': parent->val = rb_utf8_str_new(str, len); break;
230227
case 'c': // class
231228
{
232229
VALUE clas = oj_name2class(pi, str, len, Yes == pi->options.auto_define, rb_eArgError);
@@ -236,7 +233,8 @@ static int hat_cstr(ParseInfo pi, Val parent, Val kval, const char *str, size_t
236233
} else {
237234
parent->val = clas;
238235
}
239-
} break;
236+
break;
237+
}
240238
case 't': // time
241239
parent->val = oj_parse_xml_time(str, (int)len);
242240
break;
@@ -276,22 +274,21 @@ static int hat_num(ParseInfo pi, Val parent, Val kval, NumInfo ni) {
276274
VALUE args[8];
277275

278276
sec_as_time(t, &ti);
279-
args[0] = LONG2NUM((long)(ti.year));
280-
args[1] = LONG2NUM(ti.mon);
281-
args[2] = LONG2NUM(ti.day);
282-
args[3] = LONG2NUM(ti.hour);
283-
args[4] = LONG2NUM(ti.min);
284-
args[5] = rb_float_new((double)ti.sec + ((double)nsec + 0.5) / 1000000000.0);
285-
args[6] = LONG2NUM(ni->exp);
277+
args[0] = LONG2NUM((long)(ti.year));
278+
args[1] = LONG2NUM(ti.mon);
279+
args[2] = LONG2NUM(ti.day);
280+
args[3] = LONG2NUM(ti.hour);
281+
args[4] = LONG2NUM(ti.min);
282+
args[5] = rb_float_new((double)ti.sec + ((double)nsec + 0.5) / 1000000000.0);
283+
args[6] = LONG2NUM(ni->exp);
286284
parent->val = rb_funcall2(rb_cTime, oj_new_id, 7, args);
287285
} else {
288286
parent->val = rb_time_nano_new(ni->i, (long)nsec);
289287
}
290288
}
291289
break;
292-
case 'i': // circular index
293-
if (!ni->infinity && !ni->neg && 1 == ni->div && 0 == ni->exp &&
294-
0 != pi->circ_array) { // fixnum
290+
case 'i': // circular index
291+
if (!ni->infinity && !ni->neg && 1 == ni->div && 0 == ni->exp && 0 != pi->circ_array) { // fixnum
295292
if (Qnil == parent->val) {
296293
parent->val = rb_hash_new();
297294
}
@@ -396,9 +393,7 @@ static void hash_set_cstr(ParseInfo pi, Val kval, const char *str, size_t len, c
396393
}
397394
break;
398395
case T_HASH:
399-
rb_hash_aset(parent->val,
400-
calc_hash_key(pi, kval, parent->k1),
401-
str_to_value(pi, str, len, orig));
396+
rb_hash_aset(parent->val, calc_hash_key(pi, kval, parent->k1), str_to_value(pi, str, len, orig));
402397
break;
403398
case T_STRING:
404399
rval = str_to_value(pi, str, len, orig);
@@ -475,8 +470,8 @@ static void hash_set_num(ParseInfo pi, Val kval, NumInfo ni) {
475470
rb_hash_aset(parent->val, calc_hash_key(pi, kval, parent->k1), rval);
476471
break;
477472
case T_OBJECT:
478-
if (2 == klen && '^' == *key && 'i' == key[1] && !ni->infinity && !ni->neg &&
479-
1 == ni->div && 0 == ni->exp && 0 != pi->circ_array) { // fixnum
473+
if (2 == klen && '^' == *key && 'i' == key[1] && !ni->infinity && !ni->neg && 1 == ni->div && 0 == ni->exp &&
474+
0 != pi->circ_array) { // fixnum
480475
oj_circ_array_set(pi->circ_array, parent->val, ni->i);
481476
} else {
482477
rval = oj_num_as_value(ni);
@@ -553,11 +548,7 @@ static void hash_set_value(ParseInfo pi, Val kval, VALUE value) {
553548
volatile VALUE *a = RARRAY_PTR(value);
554549

555550
if (2 != len) {
556-
oj_set_error_at(pi,
557-
oj_parse_error_class,
558-
__FILE__,
559-
__LINE__,
560-
"invalid hash pair");
551+
oj_set_error_at(pi, oj_parse_error_class, __FILE__, __LINE__, "invalid hash pair");
561552
return;
562553
}
563554
rb_hash_aset(parent->val, *a, a[1]);
@@ -631,10 +622,7 @@ static void end_hash(ParseInfo pi) {
631622
} else if (NULL != parent->odd_args) {
632623
OddArgs oa = parent->odd_args;
633624

634-
parent->val = rb_funcall2(oa->odd->create_obj,
635-
oa->odd->create_op,
636-
oa->odd->attr_cnt,
637-
oa->args);
625+
parent->val = rb_funcall2(oa->odd->create_obj, oa->odd->create_op, oa->odd->attr_cnt, oa->args);
638626
oj_odd_free(oa);
639627
parent->odd_args = NULL;
640628
}
@@ -647,8 +635,7 @@ static void array_append_cstr(ParseInfo pi, const char *str, size_t len, const c
647635
volatile VALUE rval = Qnil;
648636

649637
// orig lets us know whether the string was ^r1 or \u005er1
650-
if (3 <= len && 0 != pi->circ_array && '^' == orig[0] &&
651-
0 == rb_array_len(stack_peek(&pi->stack)->val)) {
638+
if (3 <= len && 0 != pi->circ_array && '^' == orig[0] && 0 == rb_array_len(stack_peek(&pi->stack)->val)) {
652639
if ('i' == str[1]) {
653640
long i = read_long(str + 2, len - 2);
654641

ext/oj/parse.c

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -904,9 +904,17 @@ void oj_set_error_at(ParseInfo pi,
904904
char * end = p + sizeof(msg) - 2;
905905
char * start;
906906
Val vp;
907+
int mlen;
907908

908909
va_start(ap, format);
909-
p += vsnprintf(msg, sizeof(msg) - 1, format, ap);
910+
mlen = vsnprintf(msg, sizeof(msg) - 1, format, ap);
911+
if (0 < mlen) {
912+
if (sizeof(msg) - 2 < (size_t)mlen) {
913+
p = end - 2;
914+
} else {
915+
p += mlen;
916+
}
917+
}
910918
va_end(ap);
911919
pi->err.clas = err_clas;
912920
if (p + 3 < end) {

0 commit comments

Comments
 (0)