summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2020-10-29 17:37:29 +0900
committerNobuyoshi Nakada <nobu@ruby-lang.org>2020-10-29 18:14:27 +0900
commitbf951c763d00a4aee8f8c896d1a97c387fa8f30e (patch)
treebd0e80739e0a62f152d3bad9e8cc82889467430d
parent9f3adaf5293d6347250df218bad9dcd3cd8da9ba (diff)
An ellipsis (...) can only be placed at the beginning
-rw-r--r--tool/ruby_vm/loaders/insns_def.rb8
1 files changed, 6 insertions, 2 deletions
diff --git a/tool/ruby_vm/loaders/insns_def.rb b/tool/ruby_vm/loaders/insns_def.rb
index 47e4ba29f5..034905f74e 100644
--- a/tool/ruby_vm/loaders/insns_def.rb
+++ b/tool/ruby_vm/loaders/insns_def.rb
@@ -25,10 +25,10 @@ grammar = %r'
(?<ws> \g<comment> | \s ){0}
(?<ident> [_a-zA-Z] [0-9_a-zA-Z]* ){0}
(?<type> (?: \g<keyword> \g<ws>+ )* \g<ident> ){0}
- (?<arg> \g<type> \g<ws>+ \g<ident> | \.\.\. ){0}
+ (?<arg> \g<type> \g<ws>+ \g<ident> ){0}
(?<argv> (?# empty ) |
void |
- \g<arg> (?: \g<ws>* , \g<ws>* \g<arg> \g<ws>* )* ){0}
+ (?: \.\.\. | \g<arg>) (?: \g<ws>* , \g<ws>* \g<arg> \g<ws>* )* ){0}
(?<pragma> \g<ws>* // \s* attr \g<ws>+
(?<pragma:type> \g<type> ) \g<ws>+
(?<pragma:name> \g<ident> ) \g<ws>*
@@ -57,6 +57,10 @@ until scanner.eos? do
ope = split.(scanner["insn:opes"])
pop = split.(scanner["insn:pops"])
ret = split.(scanner["insn:rets"])
+ if ope.include?("...")
+ raise sprintf("parse error at %s:%d:%s: operands cannot be variadic",
+ scanner.__FILE__, scanner.__LINE__, name)
+ end
attrs = []
while l2 = scanner.scan(/\G#{grammar}\g<pragma>/o) do