Skip to content

Commit 29ddf57

Browse files
committed
Merge pull request #1971 from ruby/gc-compact
Make the extension `GC.auto_compact` compatible
1 parent 0b3d4ff commit 29ddf57

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
@@ -2836,7 +2836,10 @@ parse_type_try(VALUE a) {
28362836
static VALUE
28372837
rbsparser_parse_type(VALUE self, VALUE buffer, VALUE start_pos, VALUE end_pos, VALUE variables, VALUE require_eof)
28382838
{
2839-
parserstate *parser = alloc_parser(buffer, FIX2INT(start_pos), FIX2INT(end_pos), variables);
2839+
VALUE string = rb_funcall(buffer, rb_intern("content"), 0);
2840+
StringValue(string);
2841+
lexstate *lexer = alloc_lexer(string, FIX2INT(start_pos), FIX2INT(end_pos));
2842+
parserstate *parser = alloc_parser(buffer, lexer, FIX2INT(start_pos), FIX2INT(end_pos), variables);
28402843
struct parse_type_arg arg = {
28412844
parser,
28422845
require_eof
@@ -2864,7 +2867,10 @@ parse_method_type_try(VALUE a) {
28642867
static VALUE
28652868
rbsparser_parse_method_type(VALUE self, VALUE buffer, VALUE start_pos, VALUE end_pos, VALUE variables, VALUE require_eof)
28662869
{
2867-
parserstate *parser = alloc_parser(buffer, FIX2INT(start_pos), FIX2INT(end_pos), variables);
2870+
VALUE string = rb_funcall(buffer, rb_intern("content"), 0);
2871+
StringValue(string);
2872+
lexstate *lexer = alloc_lexer(string, FIX2INT(start_pos), FIX2INT(end_pos));
2873+
parserstate *parser = alloc_parser(buffer, lexer, FIX2INT(start_pos), FIX2INT(end_pos), variables);
28682874
struct parse_type_arg arg = {
28692875
parser,
28702876
require_eof
@@ -2881,13 +2887,18 @@ parse_signature_try(VALUE a) {
28812887
static VALUE
28822888
rbsparser_parse_signature(VALUE self, VALUE buffer, VALUE end_pos)
28832889
{
2884-
parserstate *parser = alloc_parser(buffer, 0, FIX2INT(end_pos), Qnil);
2890+
VALUE string = rb_funcall(buffer, rb_intern("content"), 0);
2891+
StringValue(string);
2892+
lexstate *lexer = alloc_lexer(string, 0, FIX2INT(end_pos));
2893+
parserstate *parser = alloc_parser(buffer, lexer, 0, FIX2INT(end_pos), Qnil);
28852894
return rb_ensure(parse_signature_try, (VALUE)parser, ensure_free_parser, (VALUE)parser);
28862895
}
28872896

28882897
static VALUE
28892898
rbsparser_lex(VALUE self, VALUE buffer, VALUE end_pos) {
2890-
lexstate *lexer = alloc_lexer(buffer, 0, FIX2INT(end_pos));
2899+
VALUE string = rb_funcall(buffer, rb_intern("content"), 0);
2900+
StringValue(string);
2901+
lexstate *lexer = alloc_lexer(string, 0, FIX2INT(end_pos));
28912902
VALUE results = rb_ary_new();
28922903

28932904
token token = NullToken;
@@ -2906,6 +2917,7 @@ rbsparser_lex(VALUE self, VALUE buffer, VALUE end_pos) {
29062917

29072918
void rbs__init_parser(void) {
29082919
RBS_Parser = rb_define_class_under(RBS, "Parser", rb_cObject);
2920+
rb_gc_register_mark_object(RBS_Parser);
29092921
rb_define_singleton_method(RBS_Parser, "_parse_type", rbsparser_parse_type, 5);
29102922
rb_define_singleton_method(RBS_Parser, "_parse_method_type", rbsparser_parse_method_type, 5);
29112923
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)