Feature #15741 ยป ordinalparameters.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);


}

