Skip to content

Commit 8972c6d

Browse files
committed
parser.c: Precompute JSON::ParserError and ivar IDs
1 parent 138b9a2 commit 8972c6d

1 file changed

Lines changed: 16 additions & 9 deletions

File tree

ext/json/ext/parser/parser.c

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@
22
#include "../vendor/ryu.h"
33
#include "../simd/simd.h"
44

5-
static VALUE mJSON, eNestingError, Encoding_UTF_8;
5+
static VALUE mJSON, eNestingError, eParserError, Encoding_UTF_8;
66
static VALUE CNaN, CInfinity, CMinusInfinity;
77

8-
static ID i_new, i_try_convert, i_uminus, i_encode;
8+
static ID i_new, i_try_convert, i_uminus, i_encode, i_at_line, i_at_column;
99

1010
static VALUE sym_max_nesting, sym_allow_nan, sym_allow_trailing_comma, sym_allow_comments,
1111
sym_allow_control_characters, sym_allow_invalid_escape, sym_symbolize_names,
@@ -645,9 +645,9 @@ static VALUE build_parse_error_message(const char *format, JSON_ParserState *sta
645645

646646
static VALUE parse_error_new(VALUE message, long line, long column)
647647
{
648-
VALUE exc = rb_exc_new_str(rb_path2class("JSON::ParserError"), message);
649-
rb_ivar_set(exc, rb_intern("@line"), LONG2NUM(line));
650-
rb_ivar_set(exc, rb_intern("@column"), LONG2NUM(column));
648+
VALUE exc = rb_exc_new_str(eParserError, message);
649+
rb_ivar_set(exc, i_at_line, LONG2NUM(line));
650+
rb_ivar_set(exc, i_at_column, LONG2NUM(column));
651651
return exc;
652652
}
653653

@@ -2069,23 +2069,28 @@ void Init_parser(void)
20692069
mJSON = rb_define_module("JSON");
20702070
VALUE mExt = rb_define_module_under(mJSON, "Ext");
20712071
VALUE cParserConfig = rb_define_class_under(mExt, "ParserConfig", rb_cObject);
2072+
2073+
rb_global_variable(&eParserError);
2074+
eParserError = rb_path2class("JSON::ParserError");
2075+
2076+
rb_global_variable(&eNestingError);
20722077
eNestingError = rb_path2class("JSON::NestingError");
2073-
rb_gc_register_mark_object(eNestingError);
2078+
20742079
rb_define_alloc_func(cParserConfig, cJSON_parser_s_allocate);
20752080
rb_define_method(cParserConfig, "initialize", cParserConfig_initialize, 1);
20762081
rb_define_method(cParserConfig, "parse", cParserConfig_parse, 1);
20772082

20782083
VALUE cParser = rb_define_class_under(mExt, "Parser", rb_cObject);
20792084
rb_define_singleton_method(cParser, "parse", cParser_m_parse, 2);
20802085

2086+
rb_global_variable(&CNaN);
20812087
CNaN = rb_const_get(mJSON, rb_intern("NaN"));
2082-
rb_gc_register_mark_object(CNaN);
20832088

2089+
rb_global_variable(&CInfinity);
20842090
CInfinity = rb_const_get(mJSON, rb_intern("Infinity"));
2085-
rb_gc_register_mark_object(CInfinity);
20862091

2092+
rb_global_variable(&CMinusInfinity);
20872093
CMinusInfinity = rb_const_get(mJSON, rb_intern("MinusInfinity"));
2088-
rb_gc_register_mark_object(CMinusInfinity);
20892094

20902095
rb_global_variable(&Encoding_UTF_8);
20912096
Encoding_UTF_8 = rb_const_get(rb_path2class("Encoding"), rb_intern("UTF_8"));
@@ -2106,6 +2111,8 @@ void Init_parser(void)
21062111
i_try_convert = rb_intern("try_convert");
21072112
i_uminus = rb_intern("-@");
21082113
i_encode = rb_intern("encode");
2114+
i_at_line = rb_intern("@line");
2115+
i_at_column = rb_intern("@column");
21092116

21102117
binary_encindex = rb_ascii8bit_encindex();
21112118
utf8_encindex = rb_utf8_encindex();

0 commit comments

Comments
 (0)