Feature #15741 ยป ordinal-parameters.patch
| parse.y | ||
|---|---|---|
|
#define NUM_SUFFIX_R (1<<0)
|
||
|
#define NUM_SUFFIX_I (1<<1)
|
||
|
#define NUM_SUFFIX_ALL 3
|
||
|
#define NUM_SUFFIX_TH (1<<2)
|
||
|
#define NUM_SUFFIX_ALL 7
|
||
|
static int
|
||
|
number_literal_suffix(struct parser_params *p, int mask)
|
||
| ... | ... | |
|
mask &= ~NUM_SUFFIX_R;
|
||
|
continue;
|
||
|
}
|
||
|
if ((mask & NUM_SUFFIX_TH) && (c == 's' || c == 't' || c == 'n' || c == 'd' || c == 't' || c == 'h')) {
|
||
|
result |= (mask & NUM_SUFFIX_TH);
|
||
|
continue;
|
||
|
}
|
||
|
if (!ISASCII(c) || ISALPHA(c) || c == '_') {
|
||
|
p->lex.pcur = lastp;
|
||
|
literal_flush(p, p->lex.pcur);
|
||
| ... | ... | |
|
return type;
|
||
|
}
|
||
|
static bool parser_numbered_param(struct parser_params *p, unsigned long n);
|
||
|
static enum yytokentype
|
||
|
set_integer_literal(struct parser_params *p, VALUE v, int suffix)
|
||
|
{
|
||
| ... | ... | |
|
v = rb_rational_raw1(v);
|
||
|
type = tRATIONAL;
|
||
|
}
|
||
|
if (suffix & NUM_SUFFIX_TH) {
|
||
|
int n = NUM2LONG(v);
|
||
|
if (n < 0 || n > NUMPARAM_MAX) {
|
||
|
YYLTYPE loc;
|
||
|
RUBY_SET_YYLLOC(loc);
|
||
|
compile_error(p, "too large numbered parameter");
|
||
|
parser_show_error_line(p, &loc);
|
||
|
set_yylval_noname();
|
||
|
return tNUMPARAM;
|
||
|
}
|
||
|
else if (parser_numbered_param(p, n+1)) {
|
||
|
return tNUMPARAM;
|
||
|
}
|
||
|
}
|
||
|
return set_number_literal(p, v, type, suffix);
|
||
|
}
|
||