From eb455c19fe10c92a0c453244697b98956cf2361d Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Fri, 14 Mar 2025 23:28:42 +0900 Subject: [PATCH] mruby-compiler: prohibit singleton methods for literals We have checked `def (literal).m` style but not `def literal.m` style. In addition, `NODE_INT` check is newly added. --- mrbgems/mruby-compiler/core/parse.y | 46 +++++++++++++++++------------ 1 file changed, 27 insertions(+), 19 deletions(-) diff --git a/mrbgems/mruby-compiler/core/parse.y b/mrbgems/mruby-compiler/core/parse.y index 6e755155f..5b40eb513 100644 --- a/mrbgems/mruby-compiler/core/parse.y +++ b/mrbgems/mruby-compiler/core/parse.y @@ -1453,6 +1453,31 @@ heredoc_end(parser_state *p) } #define is_strterm_type(p,str_func) ((p)->lex_strterm->type & (str_func)) +static void +prohibit_literals(parser_state *p, node *n) +{ + if (n == 0) { + yyerror(NULL, p, "can't define singleton method for ()."); + } + else { + switch (typen(n->car)) { + case NODE_INT: + case NODE_STR: + case NODE_DSTR: + case NODE_XSTR: + case NODE_DXSTR: + case NODE_DREGX: + case NODE_MATCH: + case NODE_FLOAT: + case NODE_ARRAY: + case NODE_HEREDOC: + yyerror(NULL, p, "can't define singleton method for literals"); + default: + break; + } + } +} + /* xxx ----------------------------- */ %} @@ -4009,30 +4034,13 @@ opt_f_block_arg : ',' f_block_arg singleton : var_ref { + prohibit_literals(p, $1); $$ = $1; if (!$$) $$ = new_nil(p); } | '(' {p->lstate = EXPR_BEG;} expr rparen { - if ($3 == 0) { - yyerror(&@1, p, "can't define singleton method for ()."); - } - else { - switch (typen($3->car)) { - case NODE_STR: - case NODE_DSTR: - case NODE_XSTR: - case NODE_DXSTR: - case NODE_DREGX: - case NODE_MATCH: - case NODE_FLOAT: - case NODE_ARRAY: - case NODE_HEREDOC: - yyerror(&@1, p, "can't define singleton method for literals"); - default: - break; - } - } + prohibit_literals(p, $3); $$ = $3; } ;