Packed delayed token elements

This commit is contained in:
Nobuyoshi Nakada 2019-10-08 09:13:58 +09:00
parent 11b6ff12af
commit 8feb8c9bb7
No known key found for this signature in database
GPG Key ID: 4BC7D6DF58D8DF60

38
parse.y
View File

@ -302,9 +302,11 @@ struct parser_params {
#else #else
/* Ripper only */ /* Ripper only */
VALUE delayed; struct {
int delayed_line; VALUE token;
int delayed_col; int line;
int col;
} delayed;
VALUE value; VALUE value;
VALUE result; VALUE result;
@ -5432,16 +5434,16 @@ ripper_dispatch_delayed_token(struct parser_params *p, enum yytokentype t)
int saved_line = p->ruby_sourceline; int saved_line = p->ruby_sourceline;
const char *saved_tokp = p->lex.ptok; const char *saved_tokp = p->lex.ptok;
if (NIL_P(p->delayed)) return; if (NIL_P(p->delayed.token)) return;
p->ruby_sourceline = p->delayed_line; p->ruby_sourceline = p->delayed.line;
p->lex.ptok = p->lex.pbeg + p->delayed_col; p->lex.ptok = p->lex.pbeg + p->delayed.col;
add_mark_object(p, yylval_rval = ripper_dispatch1(p, ripper_token2eventid(t), p->delayed)); add_mark_object(p, yylval_rval = ripper_dispatch1(p, ripper_token2eventid(t), p->delayed.token));
p->delayed = Qnil; p->delayed.token = Qnil;
p->ruby_sourceline = saved_line; p->ruby_sourceline = saved_line;
p->lex.ptok = saved_tokp; p->lex.ptok = saved_tokp;
} }
#define dispatch_delayed_token(p, t) ripper_dispatch_delayed_token(p, t) #define dispatch_delayed_token(p, t) ripper_dispatch_delayed_token(p, t)
#define has_delayed_token(p) (!NIL_P(p->delayed)) #define has_delayed_token(p) (!NIL_P(p->delayed.token))
#endif /* RIPPER */ #endif /* RIPPER */
#include "ruby/regex.h" #include "ruby/regex.h"
@ -6110,12 +6112,12 @@ add_delayed_token(struct parser_params *p, const char *tok, const char *end)
{ {
if (tok < end) { if (tok < end) {
if (!has_delayed_token(p)) { if (!has_delayed_token(p)) {
p->delayed = rb_str_buf_new(1024); p->delayed.token = rb_str_buf_new(end - tok);
rb_enc_associate(p->delayed, p->enc); rb_enc_associate(p->delayed.token, p->enc);
p->delayed_line = p->ruby_sourceline; p->delayed.line = p->ruby_sourceline;
p->delayed_col = (int)(tok - p->lex.pbeg); p->delayed.col = rb_long2int(tok - p->lex.pbeg);
} }
rb_str_buf_cat(p->delayed, tok, end - tok); rb_str_buf_cat(p->delayed.token, tok, end - tok);
p->lex.ptok = end; p->lex.ptok = end;
} }
} }
@ -6861,7 +6863,7 @@ flush_string_content(struct parser_params *p, rb_encoding *enc)
if (has_delayed_token(p)) { if (has_delayed_token(p)) {
ptrdiff_t len = p->lex.pcur - p->lex.ptok; ptrdiff_t len = p->lex.pcur - p->lex.ptok;
if (len > 0) { if (len > 0) {
rb_enc_str_buf_cat(p->delayed, p->lex.ptok, len, enc); rb_enc_str_buf_cat(p->delayed.token, p->lex.ptok, len, enc);
} }
dispatch_delayed_token(p, tSTRING_CONTENT); dispatch_delayed_token(p, tSTRING_CONTENT);
p->lex.ptok = p->lex.pcur; p->lex.ptok = p->lex.pcur;
@ -7389,7 +7391,7 @@ here_document(struct parser_params *p, rb_strterm_heredoc_t *here)
enc = rb_ascii8bit_encoding(); enc = rb_ascii8bit_encoding();
} }
} }
rb_enc_str_buf_cat(p->delayed, p->lex.ptok, len, enc); rb_enc_str_buf_cat(p->delayed.token, p->lex.ptok, len, enc);
} }
dispatch_delayed_token(p, tSTRING_CONTENT); dispatch_delayed_token(p, tSTRING_CONTENT);
} }
@ -12183,7 +12185,7 @@ parser_initialize(struct parser_params *p)
p->lex.lpar_beg = -1; /* make lambda_beginning_p() == FALSE at first */ p->lex.lpar_beg = -1; /* make lambda_beginning_p() == FALSE at first */
p->node_id = 0; p->node_id = 0;
#ifdef RIPPER #ifdef RIPPER
p->delayed = Qnil; p->delayed.token = Qnil;
p->result = Qnil; p->result = Qnil;
p->parsing_thread = Qnil; p->parsing_thread = Qnil;
#else #else
@ -12217,7 +12219,7 @@ parser_mark(void *ptr)
rb_gc_mark(p->compile_option); rb_gc_mark(p->compile_option);
rb_gc_mark(p->error_buffer); rb_gc_mark(p->error_buffer);
#else #else
rb_gc_mark(p->delayed); rb_gc_mark(p->delayed.token);
rb_gc_mark(p->value); rb_gc_mark(p->value);
rb_gc_mark(p->result); rb_gc_mark(p->result);
rb_gc_mark(p->parsing_thread); rb_gc_mark(p->parsing_thread);