Packed delayed token elements
This commit is contained in:
parent
11b6ff12af
commit
8feb8c9bb7
38
parse.y
38
parse.y
@ -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);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user