summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ext/ripper/ripper_init.c.tmpl4
-rw-r--r--ext/ripper/ripper_init.h1
-rw-r--r--ext/ripper/tools/dsl.rb7
-rw-r--r--parse.y36
4 files changed, 27 insertions, 21 deletions
diff --git a/ext/ripper/ripper_init.c.tmpl b/ext/ripper/ripper_init.c.tmpl
index 21f29bd79a..fc98c067b8 100644
--- a/ext/ripper/ripper_init.c.tmpl
+++ b/ext/ripper/ripper_init.c.tmpl
@@ -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);
-
}
diff --git a/ext/ripper/ripper_init.h b/ext/ripper/ripper_init.h
index 664bb7bce3..9d228107d1 100644
--- a/ext/ripper/ripper_init.h
+++ b/ext/ripper/ripper_init.h
@@ -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 */
diff --git a/ext/ripper/tools/dsl.rb b/ext/ripper/tools/dsl.rb
index 68641f4da7..5ef1d69318 100644
--- a/ext/ripper/tools/dsl.rb
+++ b/ext/ripper/tools/dsl.rb
@@ -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
diff --git a/parse.y b/parse.y
index b467c4a154..3e6be1db2c 100644
--- a/parse.y
+++ b/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)