зеркало из https://github.com/github/ruby.git
ripper: Remove rb_ripper_none
Now it is used only for wheter `opt_paren_args` is `none`. Introduce a new special node to distinguish an empty parentheses from it .
This commit is contained in:
Родитель
ee8bbbabe5
Коммит
147134b474
|
@ -665,8 +665,4 @@ InitVM_ripper(void)
|
|||
*/
|
||||
rb_define_global_const("SCRIPT_LINES__", Qnil);
|
||||
#endif
|
||||
rb_ripper_none = rb_obj_alloc(rb_cObject);
|
||||
rb_obj_freeze(rb_ripper_none);
|
||||
rb_gc_register_mark_object(rb_ripper_none);
|
||||
|
||||
}
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
#ifndef RIPPER_INIT_H
|
||||
#define RIPPER_INIT_H
|
||||
|
||||
extern VALUE rb_ripper_none;
|
||||
PRINTF_ARGS(void ripper_compile_error(struct parser_params*, const char *fmt, ...), 2, 3);
|
||||
|
||||
#endif /* RIPPER_INIT_H */
|
||||
|
|
|
@ -87,11 +87,7 @@ class DSL
|
|||
"v#{ @vars += 1 }"
|
||||
end
|
||||
|
||||
def opt_event(event, default, addend)
|
||||
add_event(event, [default, addend], true)
|
||||
end
|
||||
|
||||
def add_event(event, args, qundef_check = false)
|
||||
def add_event(event, args)
|
||||
event = event.to_s.sub(/!\z/, "")
|
||||
@events[event] = args.size
|
||||
vars = []
|
||||
|
@ -101,7 +97,6 @@ class DSL
|
|||
end
|
||||
v = new_var
|
||||
d = "dispatch#{ args.size }(#{ [event, *vars].join(",") })"
|
||||
d = "#{ vars.last }==rb_ripper_none ? #{ vars.first } : #{ d }" if qundef_check
|
||||
@code << "#{ v }=#{ d };"
|
||||
v
|
||||
end
|
||||
|
|
36
parse.y
36
parse.y
|
@ -83,6 +83,9 @@ static NODE *reg_named_capture_assign(struct parser_params* p, VALUE regexp, con
|
|||
#define compile_callback rb_suppress_tracing
|
||||
#endif /* !UNIVERSAL_PARSER */
|
||||
|
||||
#define NODE_SPECIAL_EMPTY_ARGS ((NODE *)-1)
|
||||
#define NODE_EMPTY_ARGS_P(node) ((node) == NODE_SPECIAL_EMPTY_ARGS)
|
||||
|
||||
static int rb_parser_string_hash_cmp(rb_parser_string_t *str1, rb_parser_string_t *str2);
|
||||
static rb_parser_string_t *rb_parser_string_deep_copy(struct parser_params *p, const rb_parser_string_t *original);
|
||||
|
||||
|
@ -294,7 +297,6 @@ parse_isxdigit(int c)
|
|||
#define STRNCASECMP rb_parser_st_locale_insensitive_strncasecmp
|
||||
|
||||
#ifdef RIPPER
|
||||
VALUE rb_ripper_none;
|
||||
#include "ripper_init.h"
|
||||
#endif
|
||||
|
||||
|
@ -4268,13 +4270,16 @@ paren_args : '(' opt_call_args rparen
|
|||
|
||||
opt_paren_args : none
|
||||
| paren_args
|
||||
{
|
||||
$$ = $1 ? $1 : NODE_SPECIAL_EMPTY_ARGS;
|
||||
}
|
||||
;
|
||||
|
||||
opt_call_args : none
|
||||
| call_args
|
||||
| args ','
|
||||
{
|
||||
$$ = $1;
|
||||
$$ = $1;
|
||||
}
|
||||
| args ',' assocs ','
|
||||
{
|
||||
|
@ -5324,13 +5329,23 @@ block_call : command do_block
|
|||
}
|
||||
| block_call call_op2 operation2 opt_paren_args
|
||||
{
|
||||
bool has_args = $4 != 0;
|
||||
if (NODE_EMPTY_ARGS_P($4)) $4 = 0;
|
||||
$$ = new_qcall(p, $2, $1, $3, $4, &@3, &@$);
|
||||
/*% ripper: opt_event(:method_add_arg!, call!($:1, $:2, $:3), $:4) %*/
|
||||
/*% ripper: call!($:1, $:2, $:3) %*/
|
||||
if (has_args) {
|
||||
/*% ripper: method_add_arg!($:$, $:4) %*/
|
||||
}
|
||||
}
|
||||
| block_call call_op2 operation2 opt_paren_args brace_block
|
||||
{
|
||||
bool has_args = $5 != 0;
|
||||
if (NODE_EMPTY_ARGS_P($5)) $5 = 0;
|
||||
$$ = new_command_qcall(p, $2, $1, $3, $4, $5, &@3, &@$);
|
||||
/*% ripper: opt_event(:method_add_block!, command_call!($:1, $:2, $:3, $:4), $:5) %*/
|
||||
/*% ripper: command_call!($:1, $:2, $:3, $:4) %*/
|
||||
if (has_args) {
|
||||
/*% ripper: method_add_block!($:$, $:5) %*/
|
||||
}
|
||||
}
|
||||
| block_call call_op2 operation2 command_args do_block
|
||||
{
|
||||
|
@ -5348,9 +5363,14 @@ method_call : fcall paren_args
|
|||
}
|
||||
| primary_value call_op operation2 opt_paren_args
|
||||
{
|
||||
bool has_args = $4 != 0;
|
||||
if (NODE_EMPTY_ARGS_P($4)) $4 = 0;
|
||||
$$ = new_qcall(p, $2, $1, $3, $4, &@3, &@$);
|
||||
nd_set_line($$, @3.end_pos.lineno);
|
||||
/*% ripper: opt_event(:method_add_arg!, call!($:1, $:2, $:3), $:4) %*/
|
||||
/*% ripper: call!($:1, $:2, $:3) %*/
|
||||
if (has_args) {
|
||||
/*% ripper: method_add_arg!($:$, $:4) %*/
|
||||
}
|
||||
}
|
||||
| primary_value tCOLON2 operation2 paren_args
|
||||
{
|
||||
|
@ -6928,10 +6948,6 @@ terms : term
|
|||
none : /* none */
|
||||
{
|
||||
$$ = 0;
|
||||
/*%%%*/
|
||||
/*%
|
||||
set_value(rb_ripper_none);
|
||||
%*/
|
||||
}
|
||||
;
|
||||
%%
|
||||
|
@ -16160,7 +16176,7 @@ rb_yytnamerr(struct parser_params *p, char *yyres, const char *yystr)
|
|||
#endif
|
||||
|
||||
#ifdef RIPPER
|
||||
#define validate(x) ((x) = (x) == rb_ripper_none ? Qnil : x)
|
||||
#define validate(x) (void)(x)
|
||||
|
||||
static VALUE
|
||||
ripper_dispatch0(struct parser_params *p, ID mid)
|
||||
|
|
Загрузка…
Ссылка в новой задаче