Skip to content

Commit 9e68588

Browse files
committed
Make GC.auto_compact compatible
1 parent afc1c51 commit 9e68588

File tree

3 files changed

+24
-16
lines changed

3 files changed

+24
-16
lines changed

ext/rbs_extension/parser.c

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2861,7 +2861,10 @@ parse_type_try(VALUE a) {
28612861
static VALUE
28622862
rbsparser_parse_type(VALUE self, VALUE buffer, VALUE start_pos, VALUE end_pos, VALUE variables, VALUE require_eof)
28632863
{
2864-
parserstate *parser = alloc_parser(buffer, FIX2INT(start_pos), FIX2INT(end_pos), variables);
2864+
VALUE string = rb_funcall(buffer, rb_intern("content"), 0);
2865+
StringValue(string);
2866+
lexstate *lexer = alloc_lexer(string, FIX2INT(start_pos), FIX2INT(end_pos));
2867+
parserstate *parser = alloc_parser(buffer, lexer, FIX2INT(start_pos), FIX2INT(end_pos), variables);
28652868
struct parse_type_arg arg = {
28662869
parser,
28672870
require_eof
@@ -2889,7 +2892,10 @@ parse_method_type_try(VALUE a) {
28892892
static VALUE
28902893
rbsparser_parse_method_type(VALUE self, VALUE buffer, VALUE start_pos, VALUE end_pos, VALUE variables, VALUE require_eof)
28912894
{
2892-
parserstate *parser = alloc_parser(buffer, FIX2INT(start_pos), FIX2INT(end_pos), variables);
2895+
VALUE string = rb_funcall(buffer, rb_intern("content"), 0);
2896+
StringValue(string);
2897+
lexstate *lexer = alloc_lexer(string, FIX2INT(start_pos), FIX2INT(end_pos));
2898+
parserstate *parser = alloc_parser(buffer, lexer, FIX2INT(start_pos), FIX2INT(end_pos), variables);
28932899
struct parse_type_arg arg = {
28942900
parser,
28952901
require_eof
@@ -2906,13 +2912,18 @@ parse_signature_try(VALUE a) {
29062912
static VALUE
29072913
rbsparser_parse_signature(VALUE self, VALUE buffer, VALUE end_pos)
29082914
{
2909-
parserstate *parser = alloc_parser(buffer, 0, FIX2INT(end_pos), Qnil);
2915+
VALUE string = rb_funcall(buffer, rb_intern("content"), 0);
2916+
StringValue(string);
2917+
lexstate *lexer = alloc_lexer(string, 0, FIX2INT(end_pos));
2918+
parserstate *parser = alloc_parser(buffer, lexer, 0, FIX2INT(end_pos), Qnil);
29102919
return rb_ensure(parse_signature_try, (VALUE)parser, ensure_free_parser, (VALUE)parser);
29112920
}
29122921

29132922
static VALUE
29142923
rbsparser_lex(VALUE self, VALUE buffer, VALUE end_pos) {
2915-
lexstate *lexer = alloc_lexer(buffer, 0, FIX2INT(end_pos));
2924+
VALUE string = rb_funcall(buffer, rb_intern("content"), 0);
2925+
StringValue(string);
2926+
lexstate *lexer = alloc_lexer(string, 0, FIX2INT(end_pos));
29162927
VALUE results = rb_ary_new();
29172928

29182929
token token = NullToken;
@@ -2931,6 +2942,7 @@ rbsparser_lex(VALUE self, VALUE buffer, VALUE end_pos) {
29312942

29322943
void rbs__init_parser(void) {
29332944
RBS_Parser = rb_define_class_under(RBS, "Parser", rb_cObject);
2945+
rb_gc_register_mark_object(RBS_Parser);
29342946
rb_define_singleton_method(RBS_Parser, "_parse_type", rbsparser_parse_type, 5);
29352947
rb_define_singleton_method(RBS_Parser, "_parse_method_type", rbsparser_parse_method_type, 5);
29362948
rb_define_singleton_method(RBS_Parser, "_parse_signature", rbsparser_parse_signature, 2);

ext/rbs_extension/parserstate.c

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -274,11 +274,7 @@ VALUE comment_to_ruby(comment *com, VALUE buffer) {
274274
);
275275
}
276276

277-
lexstate *alloc_lexer(VALUE buffer, int start_pos, int end_pos) {
278-
VALUE string = rb_funcall(buffer, rb_intern("content"), 0);
279-
280-
StringValue(string);
281-
277+
lexstate *alloc_lexer(VALUE string, int start_pos, int end_pos) {
282278
if (start_pos < 0 || end_pos < 0) {
283279
rb_raise(rb_eArgError, "negative position range: %d...%d", start_pos, end_pos);
284280
}
@@ -295,8 +291,7 @@ lexstate *alloc_lexer(VALUE buffer, int start_pos, int end_pos) {
295291
return lexer;
296292
}
297293

298-
parserstate *alloc_parser(VALUE buffer, int start_pos, int end_pos, VALUE variables) {
299-
lexstate *lexer = alloc_lexer(buffer, start_pos, end_pos);
294+
parserstate *alloc_parser(VALUE buffer, lexstate *lexer, int start_pos, int end_pos, VALUE variables) {
300295
parserstate *parser = calloc(1, sizeof(parserstate));
301296
parser->lexstate = lexer;
302297
parser->buffer = buffer;

ext/rbs_extension/parserstate.h

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -97,20 +97,21 @@ bool parser_typevar_member(parserstate *state, ID id);
9797
* Allocate new lexstate object.
9898
*
9999
* ```
100-
* alloc_lexer(buffer, 0, 31) // New lexstate with buffer
100+
* VALUE string = rb_funcall(buffer, rb_intern("content"), 0);
101+
* alloc_lexer(string, 0, 31) // New lexstate with buffer content
101102
* ```
102103
* */
103-
lexstate *alloc_lexer(VALUE buffer, int start_pos, int end_pos);
104+
lexstate *alloc_lexer(VALUE string, int start_pos, int end_pos);
104105

105106
/**
106107
* Allocate new parserstate object.
107108
*
108109
* ```
109-
* alloc_parser(buffer, 0, 1, variables) // New parserstate with variables
110-
* alloc_parser(buffer, 3, 5, Qnil) // New parserstate without variables
110+
* alloc_parser(buffer, lexer, 0, 1, variables) // New parserstate with variables
111+
* alloc_parser(buffer, lexer, 3, 5, Qnil) // New parserstate without variables
111112
* ```
112113
* */
113-
parserstate *alloc_parser(VALUE buffer, int start_pos, int end_pos, VALUE variables);
114+
parserstate *alloc_parser(VALUE buffer, lexstate *lexer, int start_pos, int end_pos, VALUE variables);
114115
void free_parser(parserstate *parser);
115116
/**
116117
* Advance one token.

0 commit comments

Comments
 (0)