Ignore:
Timestamp:
Jul 9, 2020, 8:51:43 AM (4 years ago)
Author:
coas-nagasima
Message:

mrubyを2.1.1に更新

Location:
EcnlProtoTool/trunk/mruby-2.1.1
Files:
1 edited
1 moved

Legend:

Unmodified
Added
Removed
  • EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-compiler/core/parse.y

    r331 r439  
    1111#endif
    1212#define YYERROR_VERBOSE 1
    13 /*
    14  * Force yacc to use our memory management.  This is a little evil because
    15  * the macros assume that "parser_state *p" is in scope
    16  */
    17 #define YYMALLOC(n)    mrb_malloc(p->mrb, (n))
    18 #define YYFREE(o)      mrb_free(p->mrb, (o))
    19 #define YYSTACK_USE_ALLOCA 0
     13#define YYSTACK_USE_ALLOCA 1
    2014
    2115#include <ctype.h>
     
    2822#include <mruby/error.h>
    2923#include <mruby/throw.h>
     24#include <mruby/string.h>
    3025#include "node.h"
    3126
     
    7772#define intn(x) ((int)(intptr_t)(x))
    7873
     74#define NUM_SUFFIX_R   (1<<0)
     75#define NUM_SUFFIX_I   (1<<1)
     76
    7977static inline mrb_sym
    8078intern_cstr_gen(parser_state *p, const char *s)
     
    9189#define intern(s,len) intern_gen(p,(s),(len))
    9290
    93 static inline mrb_sym
    94 intern_gen_c(parser_state *p, const char c)
    95 {
    96   return mrb_intern(p->mrb, &c, 1);
    97 }
    98 #define intern_c(c) intern_gen_c(p,(c))
     91#define intern_lit(s) mrb_intern_lit(p->mrb, s)
    9992
    10093static void
     
    134127  c->lineno = p->lineno;
    135128  c->filename_index = p->current_filename_index;
     129  /* beginning of next partial file; need to point the previous file */
     130  if (p->lineno == 0 && p->current_filename_index > 0) {
     131    c->filename_index-- ;
     132  }
    136133  return c;
    137134}
     
    186183
    187184  if (!a) return b;
     185  if (!b) return a;
    188186  while (c->cdr) {
    189187    c = c->cdr;
    190188  }
    191   if (b) {
    192     c->cdr = b;
    193   }
     189  c->cdr = b;
    194190  return a;
    195191}
     
    216212#undef strdup
    217213#define strdup(s) parser_strdup(p, s)
     214
     215static void
     216dump_int(uint16_t i, char *s)
     217{
     218  char *p = s;
     219  char *t = s;
     220
     221  while (i > 0) {
     222    *p++ = (i % 10)+'0';
     223    i /= 10;
     224  }
     225  if (p == s) *p++ = '0';
     226  *p = 0;
     227  p--;  /* point the last char */
     228  while (t < p) {
     229    char c = *t;
     230    *t++ = *p;
     231    *p-- = c;
     232  }
     233}
    218234
    219235/* xxx ----------------------------- */
     
    280296}
    281297
     298static void
     299local_add_blk(parser_state *p, mrb_sym blk)
     300{
     301  /* allocate register for block */
     302  local_add_f(p, blk ? blk : mrb_intern_lit(p->mrb, "&"));
     303}
     304
     305static void
     306local_add_kw(parser_state *p, mrb_sym kwd)
     307{
     308  /* allocate register for keywords hash */
     309  local_add_f(p, kwd ? kwd : mrb_intern_lit(p->mrb, "**"));
     310}
     311
    282312static node*
    283313locals_node(parser_state *p)
    284314{
    285315  return p->locals ? p->locals->car : NULL;
     316}
     317
     318static void
     319nvars_nest(parser_state *p)
     320{
     321  p->nvars = cons(nint(0), p->nvars);
     322}
     323
     324static void
     325nvars_block(parser_state *p)
     326{
     327  p->nvars = cons(nint(-2), p->nvars);
     328}
     329
     330static void
     331nvars_unnest(parser_state *p)
     332{
     333  p->nvars = p->nvars->cdr;
    286334}
    287335
     
    569617}
    570618
     619/* (:kw_hash (k . v) (k . v)...) */
     620static node*
     621new_kw_hash(parser_state *p, node *a)
     622{
     623  return cons((node*)NODE_KW_HASH, a);
     624}
     625
    571626/* (:sym . a) */
    572627static node*
     
    613668}
    614669
     670/* (:nvar . a) */
     671static node*
     672new_nvar(parser_state *p, int num)
     673{
     674  int nvars = intn(p->nvars->car);
     675
     676  p->nvars->car = nint(nvars > num ? nvars : num);
     677  return cons((node*)NODE_NVAR, nint(num));
     678}
     679
    615680/* (:const . a) */
    616681static node*
     
    672737}
    673738
    674 /* (m o r m2 b) */
     739static void
     740local_add_margs(parser_state *p, node *n)
     741{
     742  while (n) {
     743    if (n->car->car == (node*)NODE_MASGN) {
     744      node *t = n->car->cdr->cdr;
     745
     746      n->car->cdr->cdr = NULL;
     747      while (t) {
     748        local_add_f(p, sym(t->car));
     749        t = t->cdr;
     750      }
     751      local_add_margs(p, n->car->cdr->car->car);
     752      local_add_margs(p, n->car->cdr->car->cdr->cdr->car);
     753    }
     754    n = n->cdr;
     755  }
     756}
     757
     758static void
     759local_add_lv(parser_state *p, node *lv)
     760{
     761  while (lv) {
     762    local_add_f(p, sym(lv->car));
     763    lv = lv->cdr;
     764  }
     765}
     766
     767/* (m o r m2 tail) */
    675768/* m: (a b c) */
    676769/* o: ((a . e1) (b . e2)) */
     
    679772/* b: a */
    680773static node*
    681 new_args(parser_state *p, node *m, node *opt, mrb_sym rest, node *m2, mrb_sym blk)
     774new_args(parser_state *p, node *m, node *opt, mrb_sym rest, node *m2, node *tail)
    682775{
    683776  node *n;
    684777
    685   n = cons(m2, nsym(blk));
     778  local_add_margs(p, m);
     779  local_add_margs(p, m2);
     780  n = cons(m2, tail);
    686781  n = cons(nsym(rest), n);
    687782  n = cons(opt, n);
     783  while (opt) {
     784    /* opt: (sym . (opt . lv)) -> (sym . opt) */
     785    local_add_lv(p, opt->car->cdr->cdr);
     786    opt->car->cdr = opt->car->cdr->car;
     787    opt = opt->cdr;
     788  }
    688789  return cons(m, n);
    689790}
    690791
     792/* (:args_tail keywords rest_keywords_sym block_sym) */
     793static node*
     794new_args_tail(parser_state *p, node *kws, node *kwrest, mrb_sym blk)
     795{
     796  node *k;
     797
     798  if (kws || kwrest) {
     799    local_add_kw(p, (kwrest && kwrest->cdr)? sym(kwrest->cdr) : 0);
     800  }
     801
     802  local_add_blk(p, blk);
     803
     804  /* allocate register for keywords arguments */
     805  /* order is for Proc#parameters */
     806  for (k = kws; k; k = k->cdr) {
     807    if (!k->car->cdr->cdr->car) { /* allocate required keywords */
     808      local_add_f(p, sym(k->car->cdr->car));
     809    }
     810  }
     811  for (k = kws; k; k = k->cdr) {
     812    if (k->car->cdr->cdr->car) { /* allocate keywords with default */
     813      local_add_lv(p, k->car->cdr->cdr->car->cdr);
     814      k->car->cdr->cdr->car = k->car->cdr->cdr->car->car;
     815      local_add_f(p, sym(k->car->cdr->car));
     816    }
     817  }
     818
     819  return list4((node*)NODE_ARGS_TAIL, kws, kwrest, nsym(blk));
     820}
     821
     822/* (:kw_arg kw_sym def_arg) */
     823static node*
     824new_kw_arg(parser_state *p, mrb_sym kw, node *def_arg)
     825{
     826  mrb_assert(kw);
     827  return list3((node*)NODE_KW_ARG, nsym(kw), def_arg);
     828}
     829
    691830/* (:block_arg . a) */
    692831static node*
     
    696835}
    697836
     837static node*
     838setup_numparams(parser_state *p, node *a)
     839{
     840  int nvars = intn(p->nvars->car);
     841  if (nvars > 0) {
     842    int i;
     843    mrb_sym sym;
     844    // m || opt || rest || tail
     845    if (a && (a->car || (a->cdr && a->cdr->car) || (a->cdr->cdr && a->cdr->cdr->car) || (a->cdr->cdr->cdr->cdr && a->cdr->cdr->cdr->cdr->car))) {
     846      yyerror(p, "ordinary parameter is defined");
     847    }
     848    else if (p->locals) {
     849      /* p->locals should not be NULL unless error happens before the point */
     850      node* args = 0;
     851      for (i = nvars; i > 0; i--) {
     852        char buf[3];
     853
     854        buf[0] = '_';
     855        buf[1] = i+'0';
     856        buf[2] = '\0';
     857        sym = intern_cstr(buf);
     858        args = cons(new_arg(p, sym), args);
     859        p->locals->car = cons(nsym(sym), p->locals->car);
     860      }
     861      a = new_args(p, args, 0, 0, 0, 0);
     862    }
     863  }
     864  return a;
     865}
     866
    698867/* (:block arg body) */
    699868static node*
    700869new_block(parser_state *p, node *a, node *b)
    701870{
     871  a = setup_numparams(p, a);
    702872  return list4((node*)NODE_BLOCK, locals_node(p), a, b);
    703873}
     
    726896}
    727897
     898/* (:masgn mlhs mrhs) no check */
     899static node*
     900new_masgn_param(parser_state *p, node *a, node *b)
     901{
     902  return cons((node*)NODE_MASGN, cons(a, b));
     903}
     904
    728905/* (:asgn lhs rhs) */
    729906static node*
     
    734911}
    735912
     913static node*
     914new_imaginary(parser_state *p, node *imaginary)
     915{
     916  return new_call(p, new_const(p, intern_lit("Kernel")), intern_lit("Complex"), list1(list2(list3((node*)NODE_INT, (node*)strdup("0"), nint(10)), imaginary)), 1);
     917}
     918
     919static node*
     920new_rational(parser_state *p, node *rational)
     921{
     922  return new_call(p, new_const(p, intern_lit("Kernel")), intern_lit("Rational"), list1(list1(rational)), 1);
     923}
     924
    736925/* (:int . i) */
    737926static node*
    738 new_int(parser_state *p, const char *s, int base)
    739 {
    740   return list3((node*)NODE_INT, (node*)strdup(s), nint(base));
    741 }
    742 
     927new_int(parser_state *p, const char *s, int base, int suffix)
     928{
     929  node* result = list3((node*)NODE_INT, (node*)strdup(s), nint(base));
     930  if (suffix & NUM_SUFFIX_R) {
     931    result = new_rational(p, result);
     932  }
     933  if (suffix & NUM_SUFFIX_I) {
     934    result = new_imaginary(p, result);
     935  }
     936  return result;
     937}
     938
     939#ifndef MRB_WITHOUT_FLOAT
    743940/* (:float . i) */
    744941static node*
    745 new_float(parser_state *p, const char *s)
    746 {
    747   return cons((node*)NODE_FLOAT, (node*)strdup(s));
    748 }
     942new_float(parser_state *p, const char *s, int suffix)
     943{
     944  node* result = cons((node*)NODE_FLOAT, (node*)strdup(s));
     945  if (suffix & NUM_SUFFIX_R) {
     946    result = new_rational(p, result);
     947  }
     948  if (suffix & NUM_SUFFIX_I) {
     949    result = new_imaginary(p, result);
     950  }
     951  return result;
     952}
     953#endif
    749954
    750955/* (:str . (s . len)) */
    751956static node*
    752 new_str(parser_state *p, const char *s, int len)
     957new_str(parser_state *p, const char *s, size_t len)
    753958{
    754959  return cons((node*)NODE_STR, cons((node*)strndup(s, len), nint(len)));
     
    762967}
    763968
     969static int
     970string_node_p(node *n)
     971{
     972  return (int)((enum node_type)(intptr_t)n->car == NODE_STR);
     973}
     974
     975static node*
     976composite_string_node(parser_state *p, node *a, node *b)
     977{
     978  size_t newlen = (size_t)a->cdr + (size_t)b->cdr;
     979  char *str = (char*)mrb_pool_realloc(p->pool, a->car, (size_t)a->cdr + 1, newlen + 1);
     980  memcpy(str + (size_t)a->cdr, b->car, (size_t)b->cdr);
     981  str[newlen] = '\0';
     982  a->car = (node*)str;
     983  a->cdr = (node*)newlen;
     984  cons_free(b);
     985  return a;
     986}
     987
     988static node*
     989concat_string(parser_state *p, node *a, node *b)
     990{
     991  if (string_node_p(a)) {
     992    if (string_node_p(b)) {
     993      /* a == NODE_STR && b == NODE_STR */
     994      composite_string_node(p, a->cdr, b->cdr);
     995      cons_free(b);
     996      return a;
     997    }
     998    else {
     999      /* a == NODE_STR && b == NODE_DSTR */
     1000
     1001      if (string_node_p(b->cdr->car)) {
     1002        /* a == NODE_STR && b->[NODE_STR, ...] */
     1003        composite_string_node(p, a->cdr, b->cdr->car->cdr);
     1004        cons_free(b->cdr->car);
     1005        b->cdr->car = a;
     1006        return b;
     1007      }
     1008    }
     1009  }
     1010  else {
     1011    node *c; /* last node of a */
     1012    for (c = a; c->cdr != NULL; c = c->cdr) ;
     1013
     1014    if (string_node_p(b)) {
     1015      /* a == NODE_DSTR && b == NODE_STR */
     1016      if (string_node_p(c->car)) {
     1017        /* a->[..., NODE_STR] && b == NODE_STR */
     1018        composite_string_node(p, c->car->cdr, b->cdr);
     1019        cons_free(b);
     1020        return a;
     1021      }
     1022
     1023      push(a, b);
     1024      return a;
     1025    }
     1026    else {
     1027      /* a == NODE_DSTR && b == NODE_DSTR */
     1028      if (string_node_p(c->car) && string_node_p(b->cdr->car)) {
     1029        /* a->[..., NODE_STR] && b->[NODE_STR, ...] */
     1030        node *d = b->cdr;
     1031        cons_free(b);
     1032        composite_string_node(p, c->car->cdr, d->car->cdr);
     1033        cons_free(d->car);
     1034        c->cdr = d->cdr;
     1035        cons_free(d);
     1036        return a;
     1037      }
     1038      else {
     1039        c->cdr = b->cdr;
     1040        cons_free(b);
     1041        return a;
     1042      }
     1043    }
     1044  }
     1045
     1046  return new_dstr(p, list2(a, b));
     1047}
     1048
    7641049/* (:str . (s . len)) */
    7651050static node*
     
    7801065new_dsym(parser_state *p, node *a)
    7811066{
    782   return cons((node*)NODE_DSYM, new_dstr(p, a));
     1067  return cons((node*)NODE_DSYM, a);
    7831068}
    7841069
     
    10241309  if (p->parsing_heredoc == NULL) {
    10251310    p->lstate = EXPR_BEG;
    1026     p->cmd_start = TRUE;
    10271311    end_strterm(p);
    10281312    p->lex_strterm = p->lex_strterm_before_heredoc;
    10291313    p->lex_strterm_before_heredoc = NULL;
    1030     p->heredoc_end_now = TRUE;
    10311314  }
    10321315  else {
     
    11051388        keyword__ENCODING__
    11061389
    1107 %token <id>  tIDENTIFIER tFID tGVAR tIVAR tCONSTANT tCVAR tLABEL
     1390%token <id>  tIDENTIFIER tFID tGVAR tIVAR tCONSTANT tCVAR tLABEL_TAG
    11081391%token <nd>  tINTEGER tFLOAT tCHAR tXSTRING tREGEXP
    1109 %token <nd>  tSTRING tSTRING_PART tSTRING_MID tLABEL_END
     1392%token <nd>  tSTRING tSTRING_PART tSTRING_MID
    11101393%token <nd>  tNTH_REF tBACK_REF
    11111394%token <num> tREGEXP_END
    1112 
    1113 %type <nd> singleton string string_rep string_interp xstring regexp
     1395%token <num> tNUMPARAM
     1396
     1397%type <nd> singleton string string_fragment string_rep string_interp xstring regexp
    11141398%type <nd> literal numeric cpath symbol
    11151399%type <nd> top_compstmt top_stmts top_stmt
     
    11221406%type <nd> command_asgn command_rhs mrhs superclass block_call block_command
    11231407%type <nd> f_block_optarg f_block_opt
    1124 %type <nd> f_arglist f_args f_arg f_arg_item f_optarg f_marg f_marg_list f_margs
     1408%type <nd> f_arglist f_args f_arg f_arg_item f_optarg f_margs
    11251409%type <nd> assoc_list assocs assoc undef_list backref for_var
    11261410%type <nd> block_param opt_block_param block_param_def f_opt
     
    11321416%type <nd> heredoc words symbols
    11331417%type <num> call_op call_op2     /* 0:'&.', 1:'.', 2:'::' */
     1418
     1419%type <nd> args_tail opt_args_tail f_kwarg f_kw f_kwrest
     1420%type <nd> f_block_kwarg f_block_kw block_args_tail opt_block_args_tail
     1421%type <id> f_label
    11341422
    11351423%token tUPLUS             /* unary+ */
     
    11581446%token tLBRACE_ARG        /* { */
    11591447%token tSTAR              /* * */
     1448%token tDSTAR             /* ** */
    11601449%token tAMPER             /* & */
    11611450%token tLAMBDA            /* -> */
     
    11791468%right '=' tOP_ASGN
    11801469%left modifier_rescue
    1181 %right '?' ':'
     1470%right '?' ':' tLABEL_TAG
    11821471%nonassoc tDOT2 tDOT3
    11831472%left  tOROP
     
    12371526                    {
    12381527                      $<nd>$ = local_switch(p);
     1528                      nvars_block(p);
    12391529                    }
    12401530                  '{' top_compstmt '}'
     
    12421532                      yyerror(p, "BEGIN not supported");
    12431533                      local_resume(p, $<nd>2);
     1534                      nvars_unnest(p);
    12441535                      $$ = 0;
    12451536                    }
     
    13591650                      $$ = new_op_asgn(p, $1, $2, $3);
    13601651                    }
    1361                 | primary_value '[' opt_call_args rbracket tOP_ASGN command_rhs
    1362                     {
    1363                       $$ = new_op_asgn(p, new_call(p, $1, intern("[]",2), $3, '.'), $5, $6);
     1652                | primary_value '[' opt_call_args ']' tOP_ASGN command_rhs
     1653                    {
     1654                      $$ = new_op_asgn(p, new_call(p, $1, intern_lit("[]"), $3, '.'), $5, $6);
    13641655                    }
    13651656                | primary_value call_op tIDENTIFIER tOP_ASGN command_rhs
     
    13851676                      $$ = new_begin(p, 0);
    13861677                    }
    1387                 ;
     1678                ;
    13881679
    13891680command_rhs     : command_call   %prec tOP_ASGN
     
    14391730                    {
    14401731                      local_nest(p);
     1732                      nvars_nest(p);
    14411733                    }
    14421734                  opt_block_param
     
    14461738                      $$ = new_block(p, $3, $4);
    14471739                      local_unnest(p);
     1740                      nvars_unnest(p);
    14481741                    }
    14491742                ;
     
    15881881                      assignable(p, $1);
    15891882                    }
    1590                 | primary_value '[' opt_call_args rbracket
    1591                     {
    1592                       $$ = new_call(p, $1, intern("[]",2), $3, '.');
     1883                | primary_value '[' opt_call_args ']'
     1884                    {
     1885                      $$ = new_call(p, $1, intern_lit("[]"), $3, '.');
    15931886                    }
    15941887                | primary_value call_op tIDENTIFIER
     
    16271920                      assignable(p, $1);
    16281921                    }
    1629                 | primary_value '[' opt_call_args rbracket
    1630                     {
    1631                       $$ = new_call(p, $1, intern("[]",2), $3, '.');
     1922                | primary_value '[' opt_call_args ']'
     1923                    {
     1924                      $$ = new_call(p, $1, intern_lit("[]"), $3, '.');
    16321925                    }
    16331926                | primary_value call_op tIDENTIFIER
     
    16591952                      backref_error(p, $1);
    16601953                      $$ = 0;
     1954                    }
     1955                | tNUMPARAM
     1956                    {
     1957                      yyerror(p, "can't assign to numbered parameter");
    16611958                    }
    16621959                ;
     
    17132010                ;
    17142011
    1715 op              : '|'           { $$ = intern_c('|');   }
    1716                 | '^'           { $$ = intern_c('^');   }
    1717                 | '&'           { $$ = intern_c('&');   }
    1718                 | tCMP          { $$ = intern("<=>",3); }
    1719                 | tEQ           { $$ = intern("==",2);  }
    1720                 | tEQQ          { $$ = intern("===",3); }
    1721                 | tMATCH        { $$ = intern("=~",2);  }
    1722                 | tNMATCH       { $$ = intern("!~",2);  }
    1723                 | '>'           { $$ = intern_c('>');   }
    1724                 | tGEQ          { $$ = intern(">=",2);  }
    1725                 | '<'           { $$ = intern_c('<');   }
    1726                 | tLEQ          { $$ = intern("<=",2);  }
    1727                 | tNEQ          { $$ = intern("!=",2);  }
    1728                 | tLSHFT        { $$ = intern("<<",2);  }
    1729                 | tRSHFT        { $$ = intern(">>",2);  }
    1730                 | '+'           { $$ = intern_c('+');   }
    1731                 | '-'           { $$ = intern_c('-');   }
    1732                 | '*'           { $$ = intern_c('*');   }
    1733                 | tSTAR         { $$ = intern_c('*');   }
    1734                 | '/'           { $$ = intern_c('/');   }
    1735                 | '%'           { $$ = intern_c('%');   }
    1736                 | tPOW          { $$ = intern("**",2);  }
    1737                 | '!'           { $$ = intern_c('!');   }
    1738                 | '~'           { $$ = intern_c('~');   }
    1739                 | tUPLUS        { $$ = intern("+@",2);  }
    1740                 | tUMINUS       { $$ = intern("-@",2);  }
    1741                 | tAREF         { $$ = intern("[]",2);  }
    1742                 | tASET         { $$ = intern("[]=",3); }
    1743                 | '`'           { $$ = intern_c('`');   }
     2012op              : '|'           { $$ = intern_lit("|");   }
     2013                | '^'           { $$ = intern_lit("^");   }
     2014                | '&'           { $$ = intern_lit("&");   }
     2015                | tCMP          { $$ = intern_lit("<=>"); }
     2016                | tEQ           { $$ = intern_lit("==");  }
     2017                | tEQQ          { $$ = intern_lit("==="); }
     2018                | tMATCH        { $$ = intern_lit("=~");  }
     2019                | tNMATCH       { $$ = intern_lit("!~");  }
     2020                | '>'           { $$ = intern_lit(">");   }
     2021                | tGEQ          { $$ = intern_lit(">=");  }
     2022                | '<'           { $$ = intern_lit("<");   }
     2023                | tLEQ          { $$ = intern_lit("<=");  }
     2024                | tNEQ          { $$ = intern_lit("!=");  }
     2025                | tLSHFT        { $$ = intern_lit("<<");  }
     2026                | tRSHFT        { $$ = intern_lit(">>");  }
     2027                | '+'           { $$ = intern_lit("+");   }
     2028                | '-'           { $$ = intern_lit("-");   }
     2029                | '*'           { $$ = intern_lit("*");   }
     2030                | tSTAR         { $$ = intern_lit("*");   }
     2031                | '/'           { $$ = intern_lit("/");   }
     2032                | '%'           { $$ = intern_lit("%");   }
     2033                | tPOW          { $$ = intern_lit("**");  }
     2034                | tDSTAR        { $$ = intern_lit("**");  }
     2035                | '!'           { $$ = intern_lit("!");   }
     2036                | '~'           { $$ = intern_lit("~");   }
     2037                | tUPLUS        { $$ = intern_lit("+@");  }
     2038                | tUMINUS       { $$ = intern_lit("-@");  }
     2039                | tAREF         { $$ = intern_lit("[]");  }
     2040                | tASET         { $$ = intern_lit("[]="); }
     2041                | '`'           { $$ = intern_lit("`");   }
    17442042                ;
    17452043
     
    17662064                      $$ = new_op_asgn(p, $1, $2, $3);
    17672065                    }
    1768                 | primary_value '[' opt_call_args rbracket tOP_ASGN arg_rhs
    1769                     {
    1770                       $$ = new_op_asgn(p, new_call(p, $1, intern("[]",2), $3, '.'), $5, $6);
     2066                | primary_value '[' opt_call_args ']' tOP_ASGN arg_rhs
     2067                    {
     2068                      $$ = new_op_asgn(p, new_call(p, $1, intern_lit("[]"), $3, '.'), $5, $6);
    17712069                    }
    17722070                | primary_value call_op tIDENTIFIER tOP_ASGN arg_rhs
     
    19252223                      $$ = new_if(p, cond($1), $3, $6);
    19262224                    }
     2225                | arg '?' arg opt_nl tLABEL_TAG arg
     2226                    {
     2227                      $$ = new_if(p, cond($1), $3, $6);
     2228                    }
    19272229                | primary
    19282230                    {
     
    19392241                | args comma assocs trailer
    19402242                    {
    1941                       $$ = push($1, new_hash(p, $3));
     2243                      $$ = push($1, new_kw_hash(p, $3));
    19422244                    }
    19432245                | assocs trailer
    19442246                    {
    1945                       $$ = cons(new_hash(p, $1), 0);
     2247                      $$ = cons(new_kw_hash(p, $1), 0);
    19462248                      NODE_LINENO($$, $1);
    19472249                    }
     
    19602262                ;
    19612263
    1962 paren_args      : '(' opt_call_args rparen
     2264paren_args      : '(' opt_call_args ')'
    19632265                    {
    19642266                      $$ = $2;
     
    19712273
    19722274opt_call_args   : none
    1973                 | call_args
    1974                 | args ','
     2275                | call_args opt_terms
     2276                | args comma
    19752277                    {
    19762278                      $$ = cons($1,0);
    19772279                      NODE_LINENO($$, $1);
    19782280                    }
    1979                 | args comma assocs ','
    1980                     {
    1981                       $$ = cons(push($1, new_hash(p, $3)), 0);
     2281                | args comma assocs comma
     2282                    {
     2283                      $$ = cons(push($1, new_kw_hash(p, $3)), 0);
    19822284                      NODE_LINENO($$, $1);
    19832285                    }
    1984                 | assocs ','
    1985                     {
    1986                       $$ = cons(list1(new_hash(p, $1)), 0);
     2286                | assocs comma
     2287                    {
     2288                      $$ = cons(list1(new_kw_hash(p, $1)), 0);
    19872289                      NODE_LINENO($$, $1);
    19882290                    }
     
    20022304                | assocs opt_block_arg
    20032305                    {
    2004                       $$ = cons(list1(new_hash(p, $1)), $2);
     2306                      $$ = cons(list1(new_kw_hash(p, $1)), $2);
    20052307                      NODE_LINENO($$, $1);
    20062308                    }
    20072309                | args comma assocs opt_block_arg
    20082310                    {
    2009                       $$ = cons(push($1, new_hash(p, $3)), $4);
     2311                      $$ = cons(push($1, new_kw_hash(p, $3)), $4);
    20102312                      NODE_LINENO($$, $1);
    20112313                    }
     
    20452347
    20462348comma           : ','
    2047                 | ','  heredoc_bodies
     2349                | ','  opt_nl heredoc_bodies
    20482350                ;
    20492351
     
    20962398                | var_ref
    20972399                | backref
     2400                | tNUMPARAM
     2401                    {
     2402                      $$ = new_nvar(p, $1);
     2403                    }
    20982404                | tFID
    20992405                    {
     
    22482554                        yyerror(p, "class definition in method body");
    22492555                      $<nd>$ = local_switch(p);
     2556                      nvars_block(p);
    22502557                    }
    22512558                  bodystmt
     
    22552562                      SET_LINENO($$, $1);
    22562563                      local_resume(p, $<nd>4);
     2564                      nvars_unnest(p);
    22572565                    }
    22582566                | keyword_class
     
    22652573                    {
    22662574                      $<nd>$ = cons(local_switch(p), nint(p->in_single));
     2575                      nvars_block(p);
    22672576                      p->in_single = 0;
    22682577                    }
     
    22732582                      SET_LINENO($$, $1);
    22742583                      local_resume(p, $<nd>6->car);
     2584                      nvars_unnest(p);
    22752585                      p->in_def = $<num>4;
    22762586                      p->in_single = intn($<nd>6->cdr);
     
    22822592                        yyerror(p, "module definition in method body");
    22832593                      $<nd>$ = local_switch(p);
     2594                      nvars_block(p);
    22842595                    }
    22852596                  bodystmt
     
    22892600                      SET_LINENO($$, $1);
    22902601                      local_resume(p, $<nd>3);
     2602                      nvars_unnest(p);
    22912603                    }
    22922604                | keyword_def fname
     
    22982610                      p->in_def++;
    22992611                      $<nd>$ = local_switch(p);
     2612                      nvars_block(p);
    23002613                    }
    23012614                  f_arglist
     
    23062619                      SET_LINENO($$, $1);
    23072620                      local_resume(p, $<nd>4);
     2621                      nvars_unnest(p);
    23082622                      p->in_def--;
    23092623                      p->cmdarg_stack = $<stack>3;
     
    23202634                      p->lstate = EXPR_ENDFN; /* force for args */
    23212635                      $<nd>$ = local_switch(p);
     2636                      nvars_block(p);
    23222637                    }
    23232638                  f_arglist
     
    23282643                      SET_LINENO($$, $1);
    23292644                      local_resume(p, $<nd>6);
     2645                      nvars_unnest(p);
    23302646                      p->in_single--;
    23312647                      p->cmdarg_stack = $<stack>4;
     
    23882704                ;
    23892705
    2390 f_marg          : f_norm_arg
    2391                     {
    2392                       $$ = new_arg(p, $1);
    2393                     }
    2394                 | tLPAREN f_margs rparen
    2395                     {
    2396                       $$ = new_masgn(p, $2, 0);
    2397                     }
    2398                 ;
    2399 
    2400 f_marg_list     : f_marg
    2401                     {
    2402                       $$ = list1($1);
    2403                     }
    2404                 | f_marg_list ',' f_marg
    2405                     {
    2406                       $$ = push($1, $3);
    2407                     }
    2408                 ;
    2409 
    2410 f_margs         : f_marg_list
     2706f_margs         : f_arg
    24112707                    {
    24122708                      $$ = list3($1,0,0);
    24132709                    }
    2414                 | f_marg_list ',' tSTAR f_norm_arg
     2710                | f_arg ',' tSTAR f_norm_arg
    24152711                    {
    24162712                      $$ = list3($1, new_arg(p, $4), 0);
    24172713                    }
    2418                 | f_marg_list ',' tSTAR f_norm_arg ',' f_marg_list
     2714                | f_arg ',' tSTAR f_norm_arg ',' f_arg
    24192715                    {
    24202716                      $$ = list3($1, new_arg(p, $4), $6);
    24212717                    }
    2422                 | f_marg_list ',' tSTAR
    2423                     {
     2718                | f_arg ',' tSTAR
     2719                    {
     2720                      local_add_f(p, 0);
    24242721                      $$ = list3($1, (node*)-1, 0);
    24252722                    }
    2426                 | f_marg_list ',' tSTAR ',' f_marg_list
     2723                | f_arg ',' tSTAR ',' f_arg
    24272724                    {
    24282725                      $$ = list3($1, (node*)-1, $5);
     
    24322729                      $$ = list3(0, new_arg(p, $2), 0);
    24332730                    }
    2434                 | tSTAR f_norm_arg ',' f_marg_list
     2731                | tSTAR f_norm_arg ',' f_arg
    24352732                    {
    24362733                      $$ = list3(0, new_arg(p, $2), $4);
     
    24382735                | tSTAR
    24392736                    {
     2737                      local_add_f(p, 0);
    24402738                      $$ = list3(0, (node*)-1, 0);
    24412739                    }
    2442                 | tSTAR ',' f_marg_list
    2443                     {
    2444                       $$ = list3(0, (node*)-1, $3);
    2445                     }
    2446                 ;
    2447 
    2448 block_param     : f_arg ',' f_block_optarg ',' f_rest_arg opt_f_block_arg
     2740                | tSTAR ','
     2741                    {
     2742                      local_add_f(p, 0);
     2743                    }
     2744                  f_arg
     2745                    {
     2746                      $$ = list3(0, (node*)-1, $4);
     2747                    }
     2748                ;
     2749
     2750block_args_tail : f_block_kwarg ',' f_kwrest opt_f_block_arg
     2751                    {
     2752                      $$ = new_args_tail(p, $1, $3, $4);
     2753                    }
     2754                | f_block_kwarg opt_f_block_arg
     2755                    {
     2756                      $$ = new_args_tail(p, $1, 0, $2);
     2757                    }
     2758                | f_kwrest opt_f_block_arg
     2759                    {
     2760                      $$ = new_args_tail(p, 0, $1, $2);
     2761                    }
     2762                | f_block_arg
     2763                    {
     2764                      $$ = new_args_tail(p, 0, 0, $1);
     2765                    }
     2766                ;
     2767
     2768opt_block_args_tail : ',' block_args_tail
     2769                    {
     2770                      $$ = $2;
     2771                    }
     2772                | /* none */
     2773                    {
     2774                      $$ = new_args_tail(p, 0, 0, 0);
     2775                    }
     2776                ;
     2777
     2778block_param     : f_arg ',' f_block_optarg ',' f_rest_arg opt_block_args_tail
    24492779                    {
    24502780                      $$ = new_args(p, $1, $3, $5, 0, $6);
    24512781                    }
    2452                 | f_arg ',' f_block_optarg ',' f_rest_arg ',' f_arg opt_f_block_arg
     2782                | f_arg ',' f_block_optarg ',' f_rest_arg ',' f_arg opt_block_args_tail
    24532783                    {
    24542784                      $$ = new_args(p, $1, $3, $5, $7, $8);
    24552785                    }
    2456                 | f_arg ',' f_block_optarg opt_f_block_arg
     2786                | f_arg ',' f_block_optarg opt_block_args_tail
    24572787                    {
    24582788                      $$ = new_args(p, $1, $3, 0, 0, $4);
    24592789                    }
    2460                 | f_arg ',' f_block_optarg ',' f_arg opt_f_block_arg
     2790                | f_arg ',' f_block_optarg ',' f_arg opt_block_args_tail
    24612791                    {
    24622792                      $$ = new_args(p, $1, $3, 0, $5, $6);
    24632793                    }
    2464                 | f_arg ',' f_rest_arg opt_f_block_arg
     2794                | f_arg ',' f_rest_arg opt_block_args_tail
    24652795                    {
    24662796                      $$ = new_args(p, $1, 0, $3, 0, $4);
    24672797                    }
    2468                 | f_arg ','
    2469                     {
    2470                       $$ = new_args(p, $1, 0, 0, 0, 0);
    2471                     }
    2472                 | f_arg ',' f_rest_arg ',' f_arg opt_f_block_arg
     2798                | f_arg ',' opt_block_args_tail
     2799                    {
     2800                      $$ = new_args(p, $1, 0, 0, 0, $3);
     2801                    }
     2802                | f_arg ',' f_rest_arg ',' f_arg opt_block_args_tail
    24732803                    {
    24742804                      $$ = new_args(p, $1, 0, $3, $5, $6);
    24752805                    }
    2476                 | f_arg opt_f_block_arg
     2806                | f_arg opt_block_args_tail
    24772807                    {
    24782808                      $$ = new_args(p, $1, 0, 0, 0, $2);
    24792809                    }
    2480                 | f_block_optarg ',' f_rest_arg opt_f_block_arg
     2810                | f_block_optarg ',' f_rest_arg opt_block_args_tail
    24812811                    {
    24822812                      $$ = new_args(p, 0, $1, $3, 0, $4);
    24832813                    }
    2484                 | f_block_optarg ',' f_rest_arg ',' f_arg opt_f_block_arg
     2814                | f_block_optarg ',' f_rest_arg ',' f_arg opt_block_args_tail
    24852815                    {
    24862816                      $$ = new_args(p, 0, $1, $3, $5, $6);
    24872817                    }
    2488                 | f_block_optarg opt_f_block_arg
     2818                | f_block_optarg opt_block_args_tail
    24892819                    {
    24902820                      $$ = new_args(p, 0, $1, 0, 0, $2);
    24912821                    }
    2492                 | f_block_optarg ',' f_arg opt_f_block_arg
     2822                | f_block_optarg ',' f_arg opt_block_args_tail
    24932823                    {
    24942824                      $$ = new_args(p, 0, $1, 0, $3, $4);
    24952825                    }
    2496                 | f_rest_arg opt_f_block_arg
     2826                | f_rest_arg opt_block_args_tail
    24972827                    {
    24982828                      $$ = new_args(p, 0, 0, $1, 0, $2);
    24992829                    }
    2500                 | f_rest_arg ',' f_arg opt_f_block_arg
     2830                | f_rest_arg ',' f_arg opt_block_args_tail
    25012831                    {
    25022832                      $$ = new_args(p, 0, 0, $1, $3, $4);
    25032833                    }
    2504                 | f_block_arg
     2834                | block_args_tail
    25052835                    {
    25062836                      $$ = new_args(p, 0, 0, 0, 0, $1);
     
    25092839
    25102840opt_block_param : none
     2841                    {
     2842                      local_add_blk(p, 0);
     2843                      $$ = 0;
     2844                    }
    25112845                | block_param_def
    2512                     {
     2846                   {
    25132847                      p->cmd_start = TRUE;
    25142848                      $$ = $1;
     
    25162850                ;
    25172851
    2518 block_param_def : '|' opt_bv_decl '|'
     2852block_param_def : '|' {local_add_blk(p, 0);} opt_bv_decl '|'
    25192853                    {
    25202854                      $$ = 0;
     
    25222856                | tOROP
    25232857                    {
     2858                      local_add_blk(p, 0);
    25242859                      $$ = 0;
    25252860                    }
     
    25672902                      $$ = $2;
    25682903                    }
    2569                 | keyword_do_LAMBDA compstmt keyword_end
     2904                | keyword_do_LAMBDA bodystmt keyword_end
    25702905                    {
    25712906                      $$ = $2;
     
    25762911                    {
    25772912                      local_nest(p);
     2913                      nvars_nest(p);
    25782914                    }
    25792915                  opt_block_param
    2580                   compstmt
     2916                  bodystmt
    25812917                  keyword_end
    25822918                    {
    25832919                      $$ = new_block(p,$3,$4);
    25842920                      local_unnest(p);
     2921                      nvars_unnest(p);
    25852922                    }
    25862923                ;
     
    26302967                | primary_value call_op paren_args
    26312968                    {
    2632                       $$ = new_call(p, $1, intern("call",4), $3, $2);
     2969                      $$ = new_call(p, $1, intern_lit("call"), $3, $2);
    26332970                    }
    26342971                | primary_value tCOLON2 paren_args
    26352972                    {
    2636                       $$ = new_call(p, $1, intern("call",4), $3, tCOLON2);
     2973                      $$ = new_call(p, $1, intern_lit("call"), $3, tCOLON2);
    26372974                    }
    26382975                | keyword_super paren_args
     
    26442981                      $$ = new_zsuper(p);
    26452982                    }
    2646                 | primary_value '[' opt_call_args rbracket
    2647                     {
    2648                       $$ = new_call(p, $1, intern("[]",2), $3, '.');
     2983                | primary_value '[' opt_call_args ']'
     2984                    {
     2985                      $$ = new_call(p, $1, intern_lit("[]"), $3, '.');
    26492986                    }
    26502987                ;
     
    26532990                    {
    26542991                      local_nest(p);
     2992                      nvars_nest(p);
    26552993                      $<num>$ = p->lineno;
    26562994                    }
     
    26612999                      SET_LINENO($$, $<num>2);
    26623000                      local_unnest(p);
     3001                      nvars_unnest(p);
    26633002                    }
    26643003                | keyword_do
    26653004                    {
    26663005                      local_nest(p);
     3006                      nvars_nest(p);
    26673007                      $<num>$ = p->lineno;
    26683008                    }
    26693009                  opt_block_param
    2670                   compstmt keyword_end
     3010                  bodystmt keyword_end
    26713011                    {
    26723012                      $$ = new_block(p,$3,$4);
    26733013                      SET_LINENO($$, $<num>2);
    26743014                      local_unnest(p);
     3015                      nvars_unnest(p);
    26753016                    }
    26763017                ;
     
    27343075                ;
    27353076
    2736 string          : tCHAR
     3077string          : string_fragment
     3078                | string string_fragment
     3079                    {
     3080                      $$ = concat_string(p, $1, $2);
     3081                    }
     3082                ;
     3083
     3084string_fragment : tCHAR
    27373085                | tSTRING
    27383086                | tSTRING_BEG tSTRING
     
    28543202symbol          : basic_symbol
    28553203                    {
     3204                      p->lstate = EXPR_ENDARG;
    28563205                      $$ = new_sym(p, $1);
    28573206                    }
    28583207                | tSYMBEG tSTRING_BEG string_rep tSTRING
    28593208                    {
    2860                       p->lstate = EXPR_END;
    2861                       $$ = new_dsym(p, push($3, $4));
     3209                      p->lstate = EXPR_ENDARG;
     3210                      $$ = new_dsym(p, new_dstr(p, push($3, $4)));
    28623211                    }
    28633212                ;
     
    28653214basic_symbol    : tSYMBEG sym
    28663215                    {
    2867                       p->lstate = EXPR_END;
    28683216                      $$ = $2;
    28693217                    }
     
    29323280                      assignable(p, $1);
    29333281                    }
     3282                | tNUMPARAM
     3283                    {
     3284                      yyerror(p, "can't assign to numbered parameter");
     3285                    }
    29343286                ;
    29353287
     
    29563308                | keyword__FILE__
    29573309                    {
    2958                       const char *fn = p->filename;
     3310                      const char *fn = mrb_sym_name_len(p->mrb, p->filename_sym, NULL);
    29593311                      if (!fn) {
    29603312                        fn = "(null)";
     
    29663318                      char buf[16];
    29673319
    2968                       snprintf(buf, sizeof(buf), "%d", p->lineno);
    2969                       $$ = new_int(p, buf, 10);
     3320                      dump_int(p->lineno, buf);
     3321                      $$ = new_int(p, buf, 10, 0);
     3322                    }
     3323                | keyword__ENCODING__
     3324                    {
     3325#ifdef MRB_UTF8_STRING
     3326                      const char *enc = "UTF-8";
     3327#else
     3328                      const char *enc = "ASCII-8BIT";
     3329#endif
     3330                      $$ = new_str(p, enc, strlen(enc));
    29703331                    }
    29713332                ;
     
    30073368                ;
    30083369
    3009 f_args          : f_arg ',' f_optarg ',' f_rest_arg opt_f_block_arg
     3370f_label         : tIDENTIFIER tLABEL_TAG
     3371                    {
     3372                      local_nest(p);
     3373                    }
     3374                ;
     3375
     3376f_kw            : f_label arg
     3377                    {
     3378                      void_expr_error(p, $2);
     3379                      $$ = new_kw_arg(p, $1, cons($2, locals_node(p)));
     3380                      local_unnest(p);
     3381                    }
     3382                | f_label
     3383                    {
     3384                      $$ = new_kw_arg(p, $1, 0);
     3385                      local_unnest(p);
     3386                    }
     3387                ;
     3388
     3389f_block_kw      : f_label primary_value
     3390                    {
     3391                      $$ = new_kw_arg(p, $1, cons($2, locals_node(p)));
     3392                      local_unnest(p);
     3393                    }
     3394                | f_label
     3395                    {
     3396                      $$ = new_kw_arg(p, $1, 0);
     3397                      local_unnest(p);
     3398                    }
     3399                ;
     3400
     3401f_block_kwarg   : f_block_kw
     3402                    {
     3403                      $$ = list1($1);
     3404                    }
     3405                | f_block_kwarg ',' f_block_kw
     3406                    {
     3407                      $$ = push($1, $3);
     3408                    }
     3409                ;
     3410
     3411f_kwarg         : f_kw
     3412                    {
     3413                      $$ = list1($1);
     3414                    }
     3415                | f_kwarg ',' f_kw
     3416                    {
     3417                      $$ = push($1, $3);
     3418                    }
     3419                ;
     3420
     3421kwrest_mark     : tPOW
     3422                | tDSTAR
     3423                ;
     3424
     3425f_kwrest        : kwrest_mark tIDENTIFIER
     3426                    {
     3427                      $$ = cons((node*)NODE_KW_REST_ARGS, nsym($2));
     3428                    }
     3429                | kwrest_mark
     3430                    {
     3431                      $$ = cons((node*)NODE_KW_REST_ARGS, 0);
     3432                    }
     3433                ;
     3434
     3435args_tail       : f_kwarg ',' f_kwrest opt_f_block_arg
     3436                    {
     3437                      $$ = new_args_tail(p, $1, $3, $4);
     3438                    }
     3439                | f_kwarg opt_f_block_arg
     3440                    {
     3441                      $$ = new_args_tail(p, $1, 0, $2);
     3442                    }
     3443                | f_kwrest opt_f_block_arg
     3444                    {
     3445                      $$ = new_args_tail(p, 0, $1, $2);
     3446                    }
     3447                | f_block_arg
     3448                    {
     3449                      $$ = new_args_tail(p, 0, 0, $1);
     3450                    }
     3451                ;
     3452
     3453opt_args_tail   : ',' args_tail
     3454                    {
     3455                      $$ = $2;
     3456                    }
     3457                | /* none */
     3458                    {
     3459                      $$ = new_args_tail(p, 0, 0, 0);
     3460                    }
     3461                ;
     3462
     3463f_args          : f_arg ',' f_optarg ',' f_rest_arg opt_args_tail
    30103464                    {
    30113465                      $$ = new_args(p, $1, $3, $5, 0, $6);
    30123466                    }
    3013                 | f_arg ',' f_optarg ',' f_rest_arg ',' f_arg opt_f_block_arg
     3467                | f_arg ',' f_optarg ',' f_rest_arg ',' f_arg opt_args_tail
    30143468                    {
    30153469                      $$ = new_args(p, $1, $3, $5, $7, $8);
    30163470                    }
    3017                 | f_arg ',' f_optarg opt_f_block_arg
     3471                | f_arg ',' f_optarg opt_args_tail
    30183472                    {
    30193473                      $$ = new_args(p, $1, $3, 0, 0, $4);
    30203474                    }
    3021                 | f_arg ',' f_optarg ',' f_arg opt_f_block_arg
     3475                | f_arg ',' f_optarg ',' f_arg opt_args_tail
    30223476                    {
    30233477                      $$ = new_args(p, $1, $3, 0, $5, $6);
    30243478                    }
    3025                 | f_arg ',' f_rest_arg opt_f_block_arg
     3479                | f_arg ',' f_rest_arg opt_args_tail
    30263480                    {
    30273481                      $$ = new_args(p, $1, 0, $3, 0, $4);
    30283482                    }
    3029                 | f_arg ',' f_rest_arg ',' f_arg opt_f_block_arg
     3483                | f_arg ',' f_rest_arg ',' f_arg opt_args_tail
    30303484                    {
    30313485                      $$ = new_args(p, $1, 0, $3, $5, $6);
    30323486                    }
    3033                 | f_arg opt_f_block_arg
     3487                | f_arg opt_args_tail
    30343488                    {
    30353489                      $$ = new_args(p, $1, 0, 0, 0, $2);
    30363490                    }
    3037                 | f_optarg ',' f_rest_arg opt_f_block_arg
     3491                | f_optarg ',' f_rest_arg opt_args_tail
    30383492                    {
    30393493                      $$ = new_args(p, 0, $1, $3, 0, $4);
    30403494                    }
    3041                 | f_optarg ',' f_rest_arg ',' f_arg opt_f_block_arg
     3495                | f_optarg ',' f_rest_arg ',' f_arg opt_args_tail
    30423496                    {
    30433497                      $$ = new_args(p, 0, $1, $3, $5, $6);
    30443498                    }
    3045                 | f_optarg opt_f_block_arg
     3499                | f_optarg opt_args_tail
    30463500                    {
    30473501                      $$ = new_args(p, 0, $1, 0, 0, $2);
    30483502                    }
    3049                 | f_optarg ',' f_arg opt_f_block_arg
     3503                | f_optarg ',' f_arg opt_args_tail
    30503504                    {
    30513505                      $$ = new_args(p, 0, $1, 0, $3, $4);
    30523506                    }
    3053                 | f_rest_arg opt_f_block_arg
     3507                | f_rest_arg opt_args_tail
    30543508                    {
    30553509                      $$ = new_args(p, 0, 0, $1, 0, $2);
    30563510                    }
    3057                 | f_rest_arg ',' f_arg opt_f_block_arg
     3511                | f_rest_arg ',' f_arg opt_args_tail
    30583512                    {
    30593513                      $$ = new_args(p, 0, 0, $1, $3, $4);
    30603514                    }
    3061                 | f_block_arg
     3515                | args_tail
    30623516                    {
    30633517                      $$ = new_args(p, 0, 0, 0, 0, $1);
     
    30653519                | /* none */
    30663520                    {
    3067                       local_add_f(p, 0);
     3521                      local_add_f(p, mrb_intern_lit(p->mrb, "&"));
    30683522                      $$ = new_args(p, 0, 0, 0, 0, 0);
    30693523                    }
     
    30903544                      $$ = 0;
    30913545                    }
     3546                | tNUMPARAM
     3547                    {
     3548                      yyerror(p, "formal argument cannot be a numbered parameter");
     3549                      $$ = 0;
     3550                    }
    30923551                ;
    30933552
     
    31073566                      $$ = new_arg(p, $1);
    31083567                    }
    3109                 | tLPAREN f_margs rparen
    3110                     {
    3111                       $$ = new_masgn(p, $2, 0);
     3568                | tLPAREN
     3569                    {
     3570                      $<nd>$ = local_switch(p);
     3571                    }
     3572                  f_margs rparen
     3573                    {
     3574                      $$ = new_masgn_param(p, $3, p->locals->car);
     3575                      local_resume(p, $<nd>2);
     3576                      local_add_f(p, 0);
    31123577                    }
    31133578                ;
     
    31263591                    {
    31273592                      local_add_f(p, $1);
     3593                      local_nest(p);
    31283594                      $$ = $1;
    31293595                    }
     
    31333599                    {
    31343600                      void_expr_error(p, $2);
    3135                       $$ = cons(nsym($1), $2);
     3601                      $$ = cons(nsym($1), cons($2, locals_node(p)));
     3602                      local_unnest(p);
    31363603                    }
    31373604                ;
     
    31403607                    {
    31413608                      void_expr_error(p, $2);
    3142                       $$ = cons(nsym($1), $2);
     3609                      $$ = cons(nsym($1), cons($2, locals_node(p)));
     3610                      local_unnest(p);
    31433611                    }
    31443612                ;
     
    31753643                | restarg_mark
    31763644                    {
    3177                       local_add_f(p, 0);
     3645                      local_add_f(p, mrb_intern_lit(p->mrb, "*"));
    31783646                      $$ = -1;
    31793647                    }
     
    31863654f_block_arg     : blkarg_mark tIDENTIFIER
    31873655                    {
    3188                       local_add_f(p, $2);
    31893656                      $$ = $2;
    31903657                    }
     
    31973664                | none
    31983665                    {
    3199                       local_add_f(p, 0);
    32003666                      $$ = 0;
    32013667                    }
     
    32443710                      NODE_LINENO($$, $1);
    32453711                    }
    3246                 | assocs ',' assoc
     3712                | assocs comma assoc
    32473713                    {
    32483714                      $$ = push($1, $3);
    32493715                    }
     3716                ;
     3717
     3718label_tag       : tLABEL_TAG
     3719                | tLABEL_TAG heredoc_bodies
    32503720                ;
    32513721
     
    32563726                      $$ = cons($1, $3);
    32573727                    }
    3258                 | tLABEL arg
     3728                | tIDENTIFIER label_tag arg
     3729                    {
     3730                      void_expr_error(p, $3);
     3731                      $$ = cons(new_sym(p, $1), $3);
     3732                    }
     3733                | string_fragment label_tag arg
     3734                    {
     3735                      void_expr_error(p, $3);
     3736                      if ($1->car == (node*)NODE_DSTR) {
     3737                        $$ = cons(new_dsym(p, $1), $3);
     3738                      }
     3739                      else {
     3740                        $$ = cons(new_sym(p, new_strsym(p, $1)), $3);
     3741                      }
     3742                    }
     3743                | tDSTAR arg
    32593744                    {
    32603745                      void_expr_error(p, $2);
    3261                       $$ = cons(new_sym(p, $1), $2);
    3262                     }
    3263                 | tLABEL_END arg
    3264                     {
    3265                       void_expr_error(p, $2);
    3266                       $$ = cons(new_sym(p, new_strsym(p, $1)), $2);
    3267                     }
    3268                 | tSTRING_BEG tLABEL_END arg
    3269                     {
    3270                       void_expr_error(p, $3);
    3271                       $$ = cons(new_sym(p, new_strsym(p, $2)), $3);
    3272                     }
    3273                 | tSTRING_BEG string_rep tLABEL_END arg
    3274                     {
    3275                       void_expr_error(p, $4);
    3276                       $$ = cons(new_dsym(p, push($2, $3)), $4);
     3746                      $$ = cons(cons((node*)NODE_KW_REST_ARGS, 0), $2);
    32773747                    }
    32783748                ;
     
    33233793                ;
    33243794
    3325 rparen          : opt_nl ')'
    3326                 ;
    3327 
    3328 rbracket        : opt_nl ']'
     3795rparen          : opt_terms ')'
    33293796                ;
    33303797
    33313798trailer         : /* none */
    3332                 | nl
     3799                | terms
    33333800                | comma
    33343801                ;
     
    33623829{
    33633830  char* c;
    3364   int n;
     3831  size_t n;
    33653832
    33663833  if (! p->capture_errors) {
    33673834#ifndef MRB_DISABLE_STDIO
    3368     if (p->filename) {
    3369       fprintf(stderr, "%s:%d:%d: %s\n", p->filename, p->lineno, p->column, s);
     3835    if (p->filename_sym) {
     3836      const char *filename = mrb_sym_name_len(p->mrb, p->filename_sym, NULL);
     3837      fprintf(stderr, "%s:%d:%d: %s\n", filename, p->lineno, p->column, s);
    33703838    }
    33713839    else {
     
    33863854
    33873855static void
    3388 yyerror_i(parser_state *p, const char *fmt, int i)
     3856yyerror_c(parser_state *p, const char *msg, char c)
    33893857{
    33903858  char buf[256];
    33913859
    3392   snprintf(buf, sizeof(buf), fmt, i);
     3860  strncpy(buf, msg, sizeof(buf) - 2);
     3861  buf[sizeof(buf) - 2] = '\0';
     3862  strncat(buf, &c, 1);
    33933863  yyerror(p, buf);
    33943864}
     
    33983868{
    33993869  char* c;
    3400   int n;
     3870  size_t n;
    34013871
    34023872  if (! p->capture_errors) {
    34033873#ifndef MRB_DISABLE_STDIO
    3404     if (p->filename) {
    3405       fprintf(stderr, "%s:%d:%d: %s\n", p->filename, p->lineno, p->column, s);
     3874    if (p->filename_sym) {
     3875      const char *filename = mrb_sym_name_len(p->mrb, p->filename_sym, NULL);
     3876      fprintf(stderr, "%s:%d:%d: warning: %s\n", filename, p->lineno, p->column, s);
    34063877    }
    34073878    else {
    3408       fprintf(stderr, "line %d:%d: %s\n", p->lineno, p->column, s);
     3879      fprintf(stderr, "line %d:%d: warning: %s\n", p->lineno, p->column, s);
    34093880    }
    34103881#endif
     
    34283899
    34293900static void
    3430 yywarning_s(parser_state *p, const char *fmt, const char *s)
     3901yywarning_s(parser_state *p, const char *msg, const char *s)
    34313902{
    34323903  char buf[256];
    34333904
    3434   snprintf(buf, sizeof(buf), fmt, s);
     3905  strncpy(buf, msg, sizeof(buf) - 1);
     3906  buf[sizeof(buf) - 1] = '\0';
     3907  strncat(buf, ": ", sizeof(buf) - strlen(buf) - 1);
     3908  strncat(buf, s, sizeof(buf) - strlen(buf) - 1);
    34353909  yywarning(p, buf);
    34363910}
     
    34413915  int c;
    34423916
    3443   c = (int)(intptr_t)n->car;
     3917  c = intn(n->car);
    34443918
    34453919  if (c == NODE_NTH_REF) {
    3446     yyerror_i(p, "can't set variable $%" MRB_PRId, (mrb_int)(intptr_t)n->cdr);
     3920    yyerror_c(p, "can't set variable $", (char)intn(n->cdr)+'0');
    34473921  }
    34483922  else if (c == NODE_BACK_REF) {
    3449     yyerror_i(p, "can't set variable $%c", (int)(intptr_t)n->cdr);
     3923    yyerror_c(p, "can't set variable $", (char)intn(n->cdr));
    34503924  }
    34513925  else {
    3452     mrb_bug(p->mrb, "Internal error in backref_error() : n=>car == %S", mrb_fixnum_value(c));
     3926    mrb_bug(p->mrb, "Internal error in backref_error() : n=>car == %d", c);
    34533927  }
    34543928}
     
    34603934
    34613935  if (n == NULL) return;
    3462   c = (int)(intptr_t)n->car;
     3936  c = intn(n->car);
    34633937  switch (c) {
    34643938  case NODE_BREAK:
     
    34713945  case NODE_AND:
    34723946  case NODE_OR:
    3473     void_expr_error(p, n->cdr->car);
    3474     void_expr_error(p, n->cdr->cdr);
     3947    if (n->cdr) {
     3948      void_expr_error(p, n->cdr->car);
     3949      void_expr_error(p, n->cdr->cdr);
     3950    }
    34753951    break;
    34763952  case NODE_BEGIN:
     
    34923968
    34933969static inline int
     3970nextc0(parser_state *p)
     3971{
     3972  int c;
     3973#ifndef MRB_DISABLE_STDIO
     3974  if (p->f) {
     3975    if (feof(p->f)) return -1;
     3976    c = fgetc(p->f);
     3977    if (c == EOF) return -1;
     3978  }
     3979  else
     3980#endif
     3981    if (!p->s || p->s >= p->send) {
     3982      return -1;
     3983    }
     3984    else {
     3985      c = (unsigned char)*p->s++;
     3986    }
     3987  return c;
     3988}
     3989
     3990static inline int
    34943991nextc(parser_state *p)
    34953992{
     
    34993996    node *tmp;
    35003997
    3501     c = (int)(intptr_t)p->pb->car;
     3998    c = intn(p->pb->car);
    35023999    tmp = p->pb;
    35034000    p->pb = p->pb->cdr;
     
    35054002  }
    35064003  else {
    3507 #ifndef MRB_DISABLE_STDIO
    3508     if (p->f) {
    3509       if (feof(p->f)) goto eof;
    3510       c = fgetc(p->f);
    3511       if (c == EOF) goto eof;
    3512     }
    3513     else
    3514 #endif
    3515       if (!p->s || p->s >= p->send) {
    3516         goto eof;
    3517       }
    3518       else {
    3519         c = (unsigned char)*p->s++;
    3520       }
     4004    c = nextc0(p);
     4005    if (c < 0) goto eof;
    35214006  }
    35224007  if (c >= 0) {
     
    35244009  }
    35254010  if (c == '\r') {
    3526     c = nextc(p);
    3527     if (c != '\n') {
    3528       pushback(p, c);
    3529       return '\r';
    3530     }
    3531     return c;
     4011    const int lf = nextc0(p);
     4012    if (lf == '\n') {
     4013      return '\n';
     4014    }
     4015    if (lf > 0) pushback(p, lf);
    35324016  }
    35334017  return c;
     
    35484032    p->column--;
    35494033  }
    3550   p->pb = cons((node*)(intptr_t)c, p->pb);
     4034  p->pb = cons(nint(c), p->pb);
    35514035}
    35524036
     
    35734057    if (c0 == -1) return c0;    /* do not skip partial EOF */
    35744058    if (c0 >= 0) --p->column;
    3575     list = push(list, (node*)(intptr_t)c0);
     4059    list = push(list, nint(c0));
    35764060  } while(n--);
    35774061  if (p->pb) {
     
    35944078peeks(parser_state *p, const char *s)
    35954079{
    3596   int len = strlen(s);
     4080  size_t len = strlen(s);
    35974081
    35984082#ifndef MRB_DISABLE_STDIO
     
    36304114    s++;
    36314115    if (peeks(p, s)) {
    3632       int len = strlen(s);
     4116      size_t len = strlen(s);
    36334117
    36344118      while (len--) {
     
    37524236#define IS_LABEL_SUFFIX(n) (peek_n(p, ':',(n)) && !peek_n(p, ':', (n)+1))
    37534237
    3754 static int
     4238static int32_t
    37554239scan_oct(const int *start, int len, int *retlen)
    37564240{
    37574241  const int *s = start;
    3758   int retval = 0;
     4242  int32_t retval = 0;
    37594243
    37604244  /* mrb_assert(len <= 3) */
     
    37634247    retval |= *s++ - '0';
    37644248  }
    3765   *retlen = s - start;
     4249  *retlen = (int)(s - start);
    37664250
    37674251  return retval;
     
    37694253
    37704254static int32_t
    3771 scan_hex(const int *start, int len, int *retlen)
     4255scan_hex(parser_state *p, const int *start, int len, int *retlen)
    37724256{
    37734257  static const char hexdigit[] = "0123456789abcdef0123456789ABCDEF";
    37744258  const int *s = start;
    3775   int32_t retval = 0;
     4259  uint32_t retval = 0;
    37764260  char *tmp;
    37774261
     
    37824266    s++;
    37834267  }
    3784   *retlen = s - start;
    3785 
    3786   return retval;
     4268  *retlen = (int)(s - start);
     4269
     4270  return (int32_t)retval;
    37874271}
    37884272
     
    37904274read_escape_unicode(parser_state *p, int limit)
    37914275{
    3792   int32_t c;
    37934276  int buf[9];
    37944277  int i;
     4278  int32_t hex;
    37954279
    37964280  /* Look for opening brace */
    37974281  i = 0;
    37984282  buf[0] = nextc(p);
    3799   if (buf[0] < 0) goto eof;
     4283  if (buf[0] < 0) {
     4284  eof:
     4285    yyerror(p, "invalid escape character syntax");
     4286    return -1;
     4287  }
    38004288  if (ISXDIGIT(buf[0])) {
    38014289    /* \uxxxx form */
     
    38124300    pushback(p, buf[0]);
    38134301  }
    3814   c = scan_hex(buf, i, &i);
    3815   if (i == 0) {
    3816   eof:
    3817     yyerror(p, "Invalid escape character syntax");
     4302  hex = scan_hex(p, buf, i, &i);
     4303  if (i == 0 || hex > 0x10FFFF || (hex & 0xFFFFF800) == 0xD800) {
     4304    yyerror(p, "invalid Unicode code point");
    38184305    return -1;
    38194306  }
    3820   if (c < 0 || c > 0x10FFFF || (c & 0xFFFFF800) == 0xD800) {
    3821     yyerror(p, "Invalid Unicode code point");
    3822     return -1;
    3823   }
    3824   return c;
     4307  return hex;
    38254308}
    38264309
     
    38884371      }
    38894372    }
    3890     c = scan_hex(buf, i, &i);
    38914373    if (i == 0) {
    3892       yyerror(p, "Invalid escape character syntax");
    3893       return 0;
    3894     }
    3895   }
    3896   return c;
     4374      yyerror(p, "invalid hex escape");
     4375      return -1;
     4376    }
     4377    return scan_hex(p, buf, i, &i);
     4378  }
    38974379
    38984380  case 'u':     /* Unicode */
     
    39614443  int c;
    39624444  string_type type = (string_type)(intptr_t)p->lex_strterm->car;
    3963   int nest_level = (intptr_t)p->lex_strterm->cdr->car;
    3964   int beg = (intptr_t)p->lex_strterm->cdr->cdr->car;
    3965   int end = (intptr_t)p->lex_strterm->cdr->cdr->cdr;
     4445  int nest_level = intn(p->lex_strterm->cdr->car);
     4446  int beg = intn(p->lex_strterm->cdr->cdr->car);
     4447  int end = intn(p->lex_strterm->cdr->cdr->cdr);
    39664448  parser_heredoc_info *hinf = (type & STR_FUNC_HEREDOC) ? parsing_heredoc_inf(p) : NULL;
    3967   int cmd_state = p->cmd_start;
    39684449
    39694450  if (beg == 0) beg = -3;       /* should never happen */
     
    39904471        }
    39914472        if ((len-1 == hinf->term_len) && (strncmp(s, hinf->term, len-1) == 0)) {
    3992           if (c < 0) {
    3993             p->parsing_heredoc = NULL;
    3994           }
    3995           else {
    3996             return tHEREDOC_END;
    3997           }
     4473          return tHEREDOC_END;
    39984474        }
    39994475      }
    40004476      if (c < 0) {
    40014477        char buf[256];
    4002         snprintf(buf, sizeof(buf), "can't find heredoc delimiter \"%s\" anywhere before EOF", hinf->term);
    4003         yyerror(p, buf);
     4478        const char s1[] = "can't find heredoc delimiter \"";
     4479        const char s2[] = "\" anywhere before EOF";
     4480
     4481        if (sizeof(s1)+sizeof(s2)+strlen(hinf->term)+1 >= sizeof(buf)) {
     4482          yyerror(p, "can't find heredoc delimiter anywhere before EOF");
     4483        } else {
     4484          strcpy(buf, s1);
     4485          strcat(buf, hinf->term);
     4486          strcat(buf, s2);
     4487          yyerror(p, buf);
     4488        }
    40044489        return 0;
    40054490      }
     
    40134498    else if (c == beg) {
    40144499      nest_level++;
    4015       p->lex_strterm->cdr->car = (node*)(intptr_t)nest_level;
     4500      p->lex_strterm->cdr->car = nint(nest_level);
    40164501    }
    40174502    else if (c == end) {
    40184503      nest_level--;
    4019       p->lex_strterm->cdr->car = (node*)(intptr_t)nest_level;
     4504      p->lex_strterm->cdr->car = nint(nest_level);
    40204505    }
    40214506    else if (c == '\\') {
     
    41194604
    41204605  tokfix(p);
    4121   p->lstate = EXPR_END;
     4606  p->lstate = EXPR_ENDARG;
    41224607  end_strterm(p);
    41234608
     
    41454630      case 'u': f |= 16; break;
    41464631      case 'n': f |= 32; break;
     4632      case 'o': break;
    41474633      default: tokadd(p, re_opt); break;
    41484634      }
     
    41514637    if (toklen(p)) {
    41524638      char msg[128];
     4639
     4640      strcpy(msg, "unknown regexp option");
    41534641      tokfix(p);
    4154       snprintf(msg, sizeof(msg), "unknown regexp option%s - %s",
    4155           toklen(p) > 1 ? "s" : "", tok(p));
     4642      if (toklen(p) > 1) {
     4643        strcat(msg, "s");
     4644      }
     4645      strcat(msg, " - ");
     4646      strncat(msg, tok(p), sizeof(msg) - strlen(msg) - 1);
    41564647      yyerror(p, msg);
    41574648    }
     
    41804671  }
    41814672  pylval.nd = new_str(p, tok(p), toklen(p));
    4182   if (IS_LABEL_POSSIBLE()) {
    4183     if (IS_LABEL_SUFFIX(0)) {
    4184       p->lstate = EXPR_BEG;
    4185       nextc(p);
    4186       return tLABEL_END;
    4187     }
    4188   }
    41894673
    41904674  return tSTRING;
    41914675}
    41924676
     4677static int
     4678number_literal_suffix(parser_state *p)
     4679{
     4680  int c, result = 0;
     4681  node *list = 0;
     4682  int column = p->column;
     4683  int mask = NUM_SUFFIX_R|NUM_SUFFIX_I;
     4684
     4685  while ((c = nextc(p)) != -1) {
     4686    list = push(list, (node*)(intptr_t)c);
     4687
     4688    if ((mask & NUM_SUFFIX_I) && c == 'i') {
     4689      result |= (mask & NUM_SUFFIX_I);
     4690      mask &= ~NUM_SUFFIX_I;
     4691      /* r after i, rational of complex is disallowed */
     4692      mask &= ~NUM_SUFFIX_R;
     4693      continue;
     4694    }
     4695    if ((mask & NUM_SUFFIX_R) && c == 'r') {
     4696      result |= (mask & NUM_SUFFIX_R);
     4697      mask &= ~NUM_SUFFIX_R;
     4698      continue;
     4699    }
     4700    if (!ISASCII(c) || ISALPHA(c) || c == '_') {
     4701      p->column = column;
     4702      if (p->pb) {
     4703        p->pb = append((node*)list, p->pb);
     4704      }
     4705      else {
     4706        p->pb = list;
     4707      }
     4708      return 0;
     4709    }
     4710    pushback(p, c);
     4711    break;
     4712  }
     4713  return result;
     4714}
    41934715
    41944716static int
     
    43114833  case -2:      /* end of a file */
    43124834  case '\n':
    4313     maybe_heredoc:
     4835  maybe_heredoc:
    43144836    heredoc_treat_nextline(p);
    4315   switch (p->lstate) {
    4316   case EXPR_BEG:
    4317   case EXPR_FNAME:
    4318   case EXPR_DOT:
    4319   case EXPR_CLASS:
    4320   case EXPR_VALUE:
    4321     p->lineno++;
    43224837    p->column = 0;
     4838    switch (p->lstate) {
     4839    case EXPR_BEG:
     4840    case EXPR_FNAME:
     4841    case EXPR_DOT:
     4842    case EXPR_CLASS:
     4843    case EXPR_VALUE:
     4844      p->lineno++;
     4845      if (p->parsing_heredoc != NULL) {
     4846        if (p->lex_strterm) {
     4847          return parse_string(p);
     4848        }
     4849      }
     4850      goto retry;
     4851    default:
     4852      break;
     4853    }
    43234854    if (p->parsing_heredoc != NULL) {
    4324       if (p->lex_strterm) {
    4325         return parse_string(p);
    4326       }
    4327     }
    4328     goto retry;
    4329   default:
    4330     break;
    4331   }
    4332   if (p->parsing_heredoc != NULL) {
     4855      return '\n';
     4856    }
     4857    while ((c = nextc(p))) {
     4858      switch (c) {
     4859      case ' ': case '\t': case '\f': case '\r':
     4860      case '\13': /* '\v' */
     4861        space_seen = 1;
     4862        break;
     4863      case '#': /* comment as a whitespace */
     4864        pushback(p, '#');
     4865        p->lineno++;
     4866        goto retry;
     4867      case '.':
     4868        if (!peek(p, '.')) {
     4869          pushback(p, '.');
     4870          p->lineno++;
     4871          goto retry;
     4872        }
     4873        pushback(p, c);
     4874        goto normal_newline;
     4875      case '&':
     4876        if (peek(p, '.')) {
     4877          pushback(p, '&');
     4878          p->lineno++;
     4879          goto retry;
     4880        }
     4881        pushback(p, c);
     4882        goto normal_newline;
     4883      case -1:                  /* EOF */
     4884      case -2:                  /* end of a file */
     4885        goto normal_newline;
     4886      default:
     4887        pushback(p, c);
     4888        goto normal_newline;
     4889      }
     4890    }
     4891  normal_newline:
     4892    p->cmd_start = TRUE;
     4893    p->lstate = EXPR_BEG;
    43334894    return '\n';
    4334   }
    4335   while ((c = nextc(p))) {
    4336     switch (c) {
    4337     case ' ': case '\t': case '\f': case '\r':
    4338     case '\13': /* '\v' */
    4339       space_seen = 1;
    4340       break;
    4341     case '.':
    4342       if ((c = nextc(p)) != '.') {
    4343         pushback(p, c);
    4344         pushback(p, '.');
    4345         goto retry;
    4346       }
    4347     case -1:                  /* EOF */
    4348     case -2:                  /* end of a file */
    4349       goto normal_newline;
    4350     default:
    4351       pushback(p, c);
    4352       goto normal_newline;
    4353     }
    4354   }
    4355   normal_newline:
    4356   p->cmd_start = TRUE;
    4357   p->lstate = EXPR_BEG;
    4358   return '\n';
    43594895
    43604896  case '*':
    43614897    if ((c = nextc(p)) == '*') {
    43624898      if ((c = nextc(p)) == '=') {
    4363         pylval.id = intern("**",2);
     4899        pylval.id = intern_lit("**");
    43644900        p->lstate = EXPR_BEG;
    43654901        return tOP_ASGN;
    43664902      }
    43674903      pushback(p, c);
    4368       c = tPOW;
     4904      if (IS_SPCARG(c)) {
     4905        yywarning(p, "'**' interpreted as argument prefix");
     4906        c = tDSTAR;
     4907      }
     4908      else if (IS_BEG()) {
     4909        c = tDSTAR;
     4910      }
     4911      else {
     4912        c = tPOW; /* "**", "argument prefix" */
     4913      }
    43694914    }
    43704915    else {
    43714916      if (c == '=') {
    4372         pylval.id = intern_c('*');
     4917        pylval.id = intern_lit("*");
    43734918        p->lstate = EXPR_BEG;
    43744919        return tOP_ASGN;
     
    44865031    if (c == '<') {
    44875032      if ((c = nextc(p)) == '=') {
    4488         pylval.id = intern("<<",2);
     5033        pylval.id = intern_lit("<<");
    44895034        p->lstate = EXPR_BEG;
    44905035        return tOP_ASGN;
     
    45085053    if (c == '>') {
    45095054      if ((c = nextc(p)) == '=') {
    4510         pylval.id = intern(">>",2);
     5055        pylval.id = intern_lit(">>");
    45115056        p->lstate = EXPR_BEG;
    45125057        return tOP_ASGN;
     
    45795124        if (c2) {
    45805125          char buf[256];
    4581           snprintf(buf, sizeof(buf), "invalid character syntax; use ?\\%c", c2);
     5126          char cc[] = { (char)c2, '\0' };
     5127
     5128          strcpy(buf, "invalid character syntax; use ?\\");
     5129          strncat(buf, cc, 2);
    45825130          yyerror(p, buf);
    45835131        }
     
    45905138    newtok(p);
    45915139    /* need support UTF-8 if configured */
    4592     if ((isalnum(c) || c == '_')) {
     5140    if ((ISALNUM(c) || c == '_')) {
    45935141      int c2 = nextc(p);
    45945142      pushback(p, c2);
    4595       if ((isalnum(c2) || c2 == '_')) {
     5143      if ((ISALNUM(c2) || c2 == '_')) {
    45965144        goto ternary;
    45975145      }
     
    46065154    tokfix(p);
    46075155    pylval.nd = new_str(p, tok(p), toklen(p));
    4608     p->lstate = EXPR_END;
     5156    p->lstate = EXPR_ENDARG;
    46095157    return tCHAR;
    46105158
     
    46135161      p->lstate = EXPR_BEG;
    46145162      if ((c = nextc(p)) == '=') {
    4615         pylval.id = intern("&&",2);
     5163        pylval.id = intern_lit("&&");
    46165164        p->lstate = EXPR_BEG;
    46175165        return tOP_ASGN;
     
    46255173    }
    46265174    else if (c == '=') {
    4627       pylval.id = intern_c('&');
     5175      pylval.id = intern_lit("&");
    46285176      p->lstate = EXPR_BEG;
    46295177      return tOP_ASGN;
     
    46525200      p->lstate = EXPR_BEG;
    46535201      if ((c = nextc(p)) == '=') {
    4654         pylval.id = intern("||",2);
     5202        pylval.id = intern_lit("||");
    46555203        p->lstate = EXPR_BEG;
    46565204        return tOP_ASGN;
     
    46605208    }
    46615209    if (c == '=') {
    4662       pylval.id = intern_c('|');
     5210      pylval.id = intern_lit("|");
    46635211      p->lstate = EXPR_BEG;
    46645212      return tOP_ASGN;
     
    46845232    }
    46855233    if (c == '=') {
    4686       pylval.id = intern_c('+');
     5234      pylval.id = intern_lit("+");
    46875235      p->lstate = EXPR_BEG;
    46885236      return tOP_ASGN;
     
    47125260    }
    47135261    if (c == '=') {
    4714       pylval.id = intern_c('-');
     5262      pylval.id = intern_lit("-");
    47155263      p->lstate = EXPR_BEG;
    47165264      return tOP_ASGN;
     
    47535301  {
    47545302    int is_float, seen_point, seen_e, nondigit;
     5303    int suffix = 0;
    47555304
    47565305    is_float = seen_point = seen_e = nondigit = 0;
    4757     p->lstate = EXPR_END;
     5306    p->lstate = EXPR_ENDARG;
    47585307    newtok(p);
    47595308    if (c == '-' || c == '+') {
     
    47865335        }
    47875336        else if (nondigit) goto trailing_uc;
    4788         pylval.nd = new_int(p, tok(p), 16);
     5337        suffix = number_literal_suffix(p);
     5338        pylval.nd = new_int(p, tok(p), 16, suffix);
    47895339        return tINTEGER;
    47905340      }
     
    48105360        }
    48115361        else if (nondigit) goto trailing_uc;
    4812         pylval.nd = new_int(p, tok(p), 2);
     5362        suffix = number_literal_suffix(p);
     5363        pylval.nd = new_int(p, tok(p), 2, suffix);
    48135364        return tINTEGER;
    48145365      }
     
    48345385        }
    48355386        else if (nondigit) goto trailing_uc;
    4836         pylval.nd = new_int(p, tok(p), 10);
     5387        suffix = number_literal_suffix(p);
     5388        pylval.nd = new_int(p, tok(p), 10, suffix);
    48375389        return tINTEGER;
    48385390      }
     
    48675419          tokfix(p);
    48685420          if (nondigit) goto trailing_uc;
    4869           pylval.nd = new_int(p, tok(p), 8);
     5421          suffix = number_literal_suffix(p);
     5422          pylval.nd = new_int(p, tok(p), 8, suffix);
    48705423          return tINTEGER;
    48715424        }
     
    48845437      else {
    48855438        pushback(p, c);
    4886         pylval.nd = new_int(p, "0", 10);
     5439        suffix = number_literal_suffix(p);
     5440        pylval.nd = new_int(p, "0", 10, suffix);
    48875441        return tINTEGER;
    48885442      }
     
    49525506    if (nondigit) {
    49535507      trailing_uc:
    4954       yyerror_i(p, "trailing '%c' in number", nondigit);
     5508      yyerror_c(p, "trailing non digit in number: ", (char)nondigit);
    49555509    }
    49565510    tokfix(p);
    49575511    if (is_float) {
     5512#ifdef MRB_WITHOUT_FLOAT
     5513      yywarning_s(p, "floating point numbers are not supported", tok(p));
     5514      pylval.nd = new_int(p, "0", 10, 0);
     5515      return tINTEGER;
     5516#else
    49585517      double d;
    49595518      char *endp;
     
    49625521      d = mrb_float_read(tok(p), &endp);
    49635522      if (d == 0 && endp == tok(p)) {
    4964         yywarning_s(p, "corrupted float value %s", tok(p));
     5523        yywarning_s(p, "corrupted float value", tok(p));
    49655524      }
    49665525      else if (errno == ERANGE) {
    4967         yywarning_s(p, "float %s out of range", tok(p));
     5526        yywarning_s(p, "float out of range", tok(p));
    49685527        errno = 0;
    49695528      }
    4970       pylval.nd = new_float(p, tok(p));
     5529      suffix = number_literal_suffix(p);
     5530      pylval.nd = new_float(p, tok(p), suffix);
    49715531      return tFLOAT;
    4972     }
    4973     pylval.nd = new_int(p, tok(p), 10);
     5532#endif
     5533    }
     5534    suffix = number_literal_suffix(p);
     5535    pylval.nd = new_int(p, tok(p), 10, suffix);
    49745536    return tINTEGER;
    49755537  }
     
    49855547      p->lstate = EXPR_ENDFN;
    49865548    else
    4987       p->lstate = EXPR_ENDARG;
     5549      p->lstate = EXPR_END;
    49885550    return c;
    49895551
     
    49985560      return tCOLON2;
    49995561    }
    5000     if (IS_END() || ISSPACE(c)) {
     5562    if (!space_seen && IS_END()) {
    50015563      pushback(p, c);
    50025564      p->lstate = EXPR_BEG;
    5003       return ':';
     5565      return tLABEL_TAG;
     5566    }
     5567    if (!ISSPACE(c) || IS_BEG()) {
     5568      pushback(p, c);
     5569      p->lstate = EXPR_FNAME;
     5570      return tSYMBEG;
    50045571    }
    50055572    pushback(p, c);
    5006     p->lstate = EXPR_FNAME;
    5007     return tSYMBEG;
     5573    p->lstate = EXPR_BEG;
     5574    return ':';
    50085575
    50095576  case '/':
     
    50135580    }
    50145581    if ((c = nextc(p)) == '=') {
    5015       pylval.id = intern_c('/');
     5582      pylval.id = intern_lit("/");
    50165583      p->lstate = EXPR_BEG;
    50175584      return tOP_ASGN;
     
    50325599  case '^':
    50335600    if ((c = nextc(p)) == '=') {
    5034       pylval.id = intern_c('^');
     5601      pylval.id = intern_lit("^");
    50355602      p->lstate = EXPR_BEG;
    50365603      return tOP_ASGN;
     
    50705637    }
    50715638    else if (IS_SPCARG(-1)) {
     5639      c = tLPAREN_ARG;
     5640    }
     5641    else if (p->lstate == EXPR_END && space_seen) {
    50725642      c = tLPAREN_ARG;
    50735643    }
     
    51475717      else {
    51485718        term = nextc(p);
    5149         if (isalnum(term)) {
     5719        if (ISALNUM(term)) {
    51505720          yyerror(p, "unknown type of %string");
    51515721          return 0;
     
    52065776    }
    52075777    if ((c = nextc(p)) == '=') {
    5208       pylval.id = intern_c('%');
     5778      pylval.id = intern_lit("%");
    52095779      p->lstate = EXPR_BEG;
    52105780      return tOP_ASGN;
     
    52605830      tokadd(p, c);
    52615831      tokfix(p);
    5262       pylval.id = intern_cstr(tok(p));
     5832      pylval.id = intern(tok(p), toklen(p));
    52635833      return tGVAR;
    52645834
     
    52705840      gvar:
    52715841      tokfix(p);
    5272       pylval.id = intern_cstr(tok(p));
     5842      pylval.id = intern(tok(p), toklen(p));
    52735843      return tGVAR;
    52745844
     
    52915861        tokadd(p, c);
    52925862        c = nextc(p);
    5293       } while (c >= 0 && isdigit(c));
     5863      } while (c >= 0 && ISDIGIT(c));
    52945864      pushback(p, c);
    52955865      if (last_state == EXPR_FNAME) goto gvar;
     
    52985868        unsigned long n = strtoul(tok(p), NULL, 10);
    52995869        if (n > INT_MAX) {
    5300           yyerror_i(p, "capture group index must be <= %d", INT_MAX);
     5870          yyerror(p, "capture group index must be <= " MRB_STRINGIZE(INT_MAX));
    53015871          return 0;
    53025872        }
     
    53335903        return 0;
    53345904      }
    5335       else if (isdigit(c)) {
     5905      else if (ISDIGIT(c)) {
    53365906        if (p->tidx == 1) {
    5337           yyerror_i(p, "'@%c' is not allowed as an instance variable name", c);
     5907          yyerror_c(p, "wrong instance variable name: @", c);
    53385908        }
    53395909        else {
    5340           yyerror_i(p, "'@@%c' is not allowed as a class variable name", c);
     5910          yyerror_c(p, "wrong class variable name: @@", c);
    53415911        }
    53425912        return 0;
     
    53545924    default:
    53555925      if (!identchar(c)) {
    5356         yyerror_i(p,  "Invalid char '\\x%02X' in expression", c);
     5926        char buf[36];
     5927        const char s[] = "Invalid char in expression: 0x";
     5928        const char hexdigits[] = "0123456789ABCDEF";
     5929
     5930        strcpy(buf, s);
     5931        buf[sizeof(s)-1] = hexdigits[(c & 0xf0) >> 4];
     5932        buf[sizeof(s)]   = hexdigits[(c & 0x0f)];
     5933        buf[sizeof(s)+1] = 0;
     5934        yyerror(p, buf);
    53575935        goto retry;
    53585936      }
     
    54005978      break;
    54015979
     5980    case '_':
     5981      if (toklen(p) == 2 && ISDIGIT(tok(p)[1]) && p->nvars) {
     5982        int n = tok(p)[1] - '0';
     5983        int nvar;
     5984
     5985        if (n > 0) {
     5986          node *nvars = p->nvars->cdr;
     5987
     5988          while (nvars) {
     5989            nvar = intn(nvars->car);
     5990            if (nvar == -2) break; /* top of the scope */
     5991            if (nvar > 0) {
     5992              yywarning(p, "numbered parameter used in outer block");
     5993              break;
     5994            }
     5995            nvars->car = nint(-1);
     5996            nvars = nvars->cdr;
     5997          }
     5998          nvar = intn(p->nvars->car);
     5999          if (nvar == -1) {
     6000            yywarning(p, "numbered parameter used in inner block");
     6001          }
     6002          if (nvar >= -1) {
     6003            pylval.num = n;
     6004            p->lstate = EXPR_END;
     6005            return tNUMPARAM;
     6006          }
     6007          else {
     6008            yywarning(p, "identifier for numbered parameter; consider another name");
     6009          }
     6010        }
     6011      }
     6012      /* fall through */
    54026013    default:
    54036014      if (toklast(p) == '!' || toklast(p) == '?') {
     
    54066017      else {
    54076018        if (p->lstate == EXPR_FNAME) {
     6019          if ((c = nextc(p)) == '=' && !peek(p, '~') && !peek(p, '>') &&
     6020              (!peek(p, '=') || (peek_n(p, '>', 1)))) {
     6021            result = tIDENTIFIER;
     6022            tokadd(p, c);
     6023            tokfix(p);
     6024          }
     6025          else {
     6026            pushback(p, c);
     6027          }
    54086028          if ((c = nextc(p)) == '=' && !peek(p, '~') && !peek(p, '>') &&
    54096029              (!peek(p, '=') || (peek_n(p, '>', 1)))) {
     
    54266046      if (IS_LABEL_POSSIBLE()) {
    54276047        if (IS_LABEL_SUFFIX(0)) {
    5428           p->lstate = EXPR_BEG;
    5429           nextc(p);
     6048          p->lstate = EXPR_END;
    54306049          tokfix(p);
    5431           pylval.id = intern_cstr(tok(p));
    5432           return tLABEL;
     6050          pylval.id = intern(tok(p), toklen(p));
     6051          return tIDENTIFIER;
    54336052        }
    54346053      }
     
    54886107    }
    54896108    {
    5490       mrb_sym ident = intern_cstr(tok(p));
     6109      mrb_sym ident = intern(tok(p), toklen(p));
    54916110
    54926111      pylval.id = ident;
    5493 #if 0
    5494       if (last_state != EXPR_DOT && islower(tok(p)[0]) && lvar_defined(ident)) {
     6112      if (last_state != EXPR_DOT && ISLOWER(tok(p)[0]) && local_var_p(p, ident)) {
    54956113        p->lstate = EXPR_END;
    54966114      }
    5497 #endif
    54986115    }
    54996116    return result;
     
    55246141  p->capture_errors = cxt->capture_errors;
    55256142  p->no_optimize = cxt->no_optimize;
     6143  p->on_eval = cxt->on_eval;
    55266144  if (cxt->partial_hook) {
    55276145    p->cxt = cxt;
     
    55366154
    55376155  if (!cxt) return;
    5538   if ((int)(intptr_t)p->tree->car != NODE_SCOPE) return;
     6156  if (intn(p->tree->car) != NODE_SCOPE) return;
    55396157  n0 = n = p->tree->cdr->car;
    55406158  while (n) {
     
    55596177
    55606178  MRB_TRY(p->jmp) {
    5561     int n;
     6179    int n = 1;
    55626180
    55636181    p->cmd_start = TRUE;
     
    56756293{
    56766294  if (s) {
    5677     int len = strlen(s);
     6295    size_t len = strlen(s);
    56786296    char *p = (char *)mrb_malloc(mrb, len + 1);
    56796297
     
    57026320
    57036321  sym = mrb_intern_cstr(p->mrb, f);
    5704   p->filename = mrb_sym2name_len(p->mrb, sym, NULL);
     6322  p->filename_sym = sym;
    57056323  p->lineno = (p->filename_table_length > 0)? 0 : 1;
    57066324
    57076325  for (i = 0; i < p->filename_table_length; ++i) {
    57086326    if (p->filename_table[i] == sym) {
    5709       p->current_filename_index = i;
     6327      p->current_filename_index = (int)i;
    57106328      return;
    57116329    }
    57126330  }
    57136331
     6332  if (p->filename_table_length == UINT16_MAX) {
     6333    yyerror(p, "too many files to compile");
     6334    return;
     6335  }
    57146336  p->current_filename_index = p->filename_table_length++;
    57156337
    57166338  new_table = (mrb_sym*)parser_palloc(p, sizeof(mrb_sym) * p->filename_table_length);
    57176339  if (p->filename_table) {
    5718     memmove(new_table, p->filename_table, sizeof(mrb_sym) * p->filename_table_length);
     6340    memmove(new_table, p->filename_table, sizeof(mrb_sym) * p->current_filename_index);
    57196341  }
    57206342  p->filename_table = new_table;
     
    57226344}
    57236345
    5724 MRB_API char const*
     6346MRB_API mrb_sym
    57256347mrb_parser_get_filename(struct mrb_parser_state* p, uint16_t idx) {
    5726   if (idx >= p->filename_table_length) { return NULL; }
     6348  if (idx >= p->filename_table_length) return 0;
    57276349  else {
    5728     return mrb_sym2name_len(p->mrb, p->filename_table[idx], NULL);
     6350    return p->filename_table[idx];
    57296351  }
    57306352}
     
    57476369
    57486370MRB_API parser_state*
    5749 mrb_parse_nstring(mrb_state *mrb, const char *s, int len, mrbc_context *c)
     6371mrb_parse_nstring(mrb_state *mrb, const char *s, size_t len, mrbc_context *c)
    57506372{
    57516373  parser_state *p;
     
    57786400  }
    57796401  if (!p->tree || p->nerr) {
     6402    if (c) c->parser_nerr = p->nerr;
    57806403    if (p->capture_errors) {
    57816404      char buf[256];
    5782       int n;
    5783 
    5784       n = snprintf(buf, sizeof(buf), "line %d: %s\n",
    5785           p->error_buffer[0].lineno, p->error_buffer[0].message);
    5786       mrb->exc = mrb_obj_ptr(mrb_exc_new(mrb, E_SYNTAX_ERROR, buf, n));
     6405
     6406      strcpy(buf, "line ");
     6407      dump_int(p->error_buffer[0].lineno, buf+5);
     6408      strcat(buf, ": ");
     6409      strncat(buf, p->error_buffer[0].message, sizeof(buf) - strlen(buf) - 1);
     6410      mrb->exc = mrb_obj_ptr(mrb_exc_new(mrb, E_SYNTAX_ERROR, buf, strlen(buf)));
    57876411      mrb_parser_free(p);
    57886412      return mrb_undef_value();
     
    58176441    }
    58186442  }
    5819   proc->target_class = target;
     6443  MRB_PROC_SET_TARGET_CLASS(proc, target);
    58206444  if (mrb->c->ci) {
    58216445    mrb->c->ci->target_class = target;
     
    58416465
    58426466MRB_API mrb_value
    5843 mrb_load_nstring_cxt(mrb_state *mrb, const char *s, int len, mrbc_context *c)
     6467mrb_load_nstring_cxt(mrb_state *mrb, const char *s, size_t len, mrbc_context *c)
    58446468{
    58456469  return mrb_load_exec(mrb, mrb_parse_nstring(mrb, s, len, c), c);
     
    58476471
    58486472MRB_API mrb_value
    5849 mrb_load_nstring(mrb_state *mrb, const char *s, int len)
     6473mrb_load_nstring(mrb_state *mrb, const char *s, size_t len)
    58506474{
    58516475  return mrb_load_nstring_cxt(mrb, s, len, NULL);
     
    58856509}
    58866510
     6511static void
     6512dump_args(mrb_state *mrb, node *n, int offset)
     6513{
     6514  if (n->car) {
     6515    dump_prefix(n, offset+1);
     6516    printf("mandatory args:\n");
     6517    dump_recur(mrb, n->car, offset+2);
     6518  }
     6519  n = n->cdr;
     6520  if (n->car) {
     6521    dump_prefix(n, offset+1);
     6522    printf("optional args:\n");
     6523    {
     6524      node *n2 = n->car;
     6525
     6526      while (n2) {
     6527        dump_prefix(n2, offset+2);
     6528        printf("%s=\n", mrb_sym_name(mrb, sym(n2->car->car)));
     6529        mrb_parser_dump(mrb, n2->car->cdr, offset+3);
     6530        n2 = n2->cdr;
     6531      }
     6532    }
     6533  }
     6534  n = n->cdr;
     6535  if (n->car) {
     6536    dump_prefix(n, offset+1);
     6537    printf("rest=*%s\n", mrb_sym_name(mrb, sym(n->car)));
     6538  }
     6539  n = n->cdr;
     6540  if (n->car) {
     6541    dump_prefix(n, offset+1);
     6542    printf("post mandatory args:\n");
     6543    dump_recur(mrb, n->car, offset+2);
     6544  }
     6545
     6546  n = n->cdr;
     6547  if (n) {
     6548    mrb_assert(intn(n->car) == NODE_ARGS_TAIL);
     6549    mrb_parser_dump(mrb, n, offset);
     6550  }
     6551}
     6552
     6553/*
     6554 * This function restores the GC arena on return.
     6555 * For this reason, if a process that further generates an object is
     6556 * performed at the caller, the string pointer returned as the return
     6557 * value may become invalid.
     6558 */
     6559static const char*
     6560str_dump(mrb_state *mrb, const char *str, int len)
     6561{
     6562  mrb_int ai = mrb_gc_arena_save(mrb);
     6563  mrb_value s;
     6564# if INT_MAX > MRB_INT_MAX / 4
     6565  /* check maximum length with "\xNN" charactor */
     6566  if (len > MRB_INT_MAX / 4) {
     6567    len = MRB_INT_MAX / 4;
     6568  }
     6569# endif
     6570  s = mrb_str_new(mrb, str, (mrb_int)len);
     6571  s = mrb_str_dump(mrb, s);
     6572  mrb_gc_arena_restore(mrb, ai);
     6573  return RSTRING_PTR(s);
     6574}
    58876575#endif
    58886576
     
    58966584  again:
    58976585  dump_prefix(tree, offset);
    5898   nodetype = (int)(intptr_t)tree->car;
     6586  nodetype = intn(tree->car);
    58996587  tree = tree->cdr;
    59006588  switch (nodetype) {
     
    59566644
    59576645  case NODE_LAMBDA:
    5958     printf("NODE_BLOCK:\n");
     6646    printf("NODE_LAMBDA:\n");
     6647    dump_prefix(tree, offset);
    59596648    goto block;
    59606649
     
    59646653    tree = tree->cdr;
    59656654    if (tree->car) {
    5966       node *n = tree->car;
    5967 
    5968       if (n->car) {
    5969         dump_prefix(n, offset+1);
    5970         printf("mandatory args:\n");
    5971         dump_recur(mrb, n->car, offset+2);
    5972       }
    5973       n = n->cdr;
    5974       if (n->car) {
    5975         dump_prefix(n, offset+1);
    5976         printf("optional args:\n");
    5977         {
    5978           node *n2 = n->car;
    5979 
    5980           while (n2) {
    5981             dump_prefix(n2, offset+2);
    5982             printf("%s=", mrb_sym2name(mrb, sym(n2->car->car)));
    5983             mrb_parser_dump(mrb, n2->car->cdr, 0);
    5984             n2 = n2->cdr;
    5985           }
    5986         }
    5987       }
    5988       n = n->cdr;
    5989       if (n->car) {
    5990         dump_prefix(n, offset+1);
    5991         printf("rest=*%s\n", mrb_sym2name(mrb, sym(n->car)));
    5992       }
    5993       n = n->cdr;
    5994       if (n->car) {
    5995         dump_prefix(n, offset+1);
    5996         printf("post mandatory args:\n");
    5997         dump_recur(mrb, n->car, offset+2);
    5998       }
    5999       if (n->cdr) {
    6000         dump_prefix(n, offset+1);
    6001         printf("blk=&%s\n", mrb_sym2name(mrb, sym(n->cdr)));
    6002       }
     6655      dump_args(mrb, tree->car, offset+1);
    60036656    }
    60046657    dump_prefix(tree, offset+1);
     
    61236776          if (n2->car) {
    61246777            if (!first_lval) printf(", ");
    6125             printf("%s", mrb_sym2name(mrb, sym(n2->car)));
     6778            printf("%s", mrb_sym_name(mrb, sym(n2->car)));
    61266779            first_lval = FALSE;
    61276780          }
     
    61516804    dump_prefix(tree, offset+1);
    61526805    printf("method='%s' (%d)\n",
    6153         mrb_sym2name(mrb, sym(tree->cdr->car)),
    6154         (int)(intptr_t)tree->cdr->car);
     6806        mrb_sym_dump(mrb, sym(tree->cdr->car)),
     6807        intn(tree->cdr->car));
    61556808    tree = tree->cdr->cdr->car;
    61566809    if (tree) {
     
    61826835    mrb_parser_dump(mrb, tree->car, offset+1);
    61836836    dump_prefix(tree, offset+1);
    6184     printf("::%s\n", mrb_sym2name(mrb, sym(tree->cdr)));
     6837    printf("::%s\n", mrb_sym_name(mrb, sym(tree->cdr)));
    61856838    break;
    61866839
    61876840  case NODE_COLON3:
    6188     printf("NODE_COLON3: ::%s\n", mrb_sym2name(mrb, sym(tree)));
     6841    printf("NODE_COLON3: ::%s\n", mrb_sym_name(mrb, sym(tree)));
    61896842    break;
    61906843
     
    61966849  case NODE_HASH:
    61976850    printf("NODE_HASH:\n");
     6851    while (tree) {
     6852      dump_prefix(tree, offset+1);
     6853      printf("key:\n");
     6854      mrb_parser_dump(mrb, tree->car->car, offset+2);
     6855      dump_prefix(tree, offset+1);
     6856      printf("value:\n");
     6857      mrb_parser_dump(mrb, tree->car->cdr, offset+2);
     6858      tree = tree->cdr;
     6859    }
     6860    break;
     6861
     6862  case NODE_KW_HASH:
     6863    printf("NODE_KW_HASH:\n");
    61986864    while (tree) {
    61996865      dump_prefix(tree, offset+1);
     
    62696935    tree = tree->cdr;
    62706936    dump_prefix(tree, offset+1);
    6271     printf("op='%s' (%d)\n", mrb_sym2name(mrb, sym(tree->car)), (int)(intptr_t)tree->car);
     6937    printf("op='%s' (%d)\n", mrb_sym_name(mrb, sym(tree->car)), intn(tree->car));
    62726938    tree = tree->cdr;
    62736939    mrb_parser_dump(mrb, tree->car, offset+1);
     
    63216987
    63226988  case NODE_LVAR:
    6323     printf("NODE_LVAR %s\n", mrb_sym2name(mrb, sym(tree)));
     6989    printf("NODE_LVAR %s\n", mrb_sym_name(mrb, sym(tree)));
    63246990    break;
    63256991
    63266992  case NODE_GVAR:
    6327     printf("NODE_GVAR %s\n", mrb_sym2name(mrb, sym(tree)));
     6993    printf("NODE_GVAR %s\n", mrb_sym_name(mrb, sym(tree)));
    63286994    break;
    63296995
    63306996  case NODE_IVAR:
    6331     printf("NODE_IVAR %s\n", mrb_sym2name(mrb, sym(tree)));
     6997    printf("NODE_IVAR %s\n", mrb_sym_name(mrb, sym(tree)));
    63326998    break;
    63336999
    63347000  case NODE_CVAR:
    6335     printf("NODE_CVAR %s\n", mrb_sym2name(mrb, sym(tree)));
     7001    printf("NODE_CVAR %s\n", mrb_sym_name(mrb, sym(tree)));
     7002    break;
     7003
     7004  case NODE_NVAR:
     7005    printf("NODE_NVAR %d\n", intn(tree));
    63367006    break;
    63377007
    63387008  case NODE_CONST:
    6339     printf("NODE_CONST %s\n", mrb_sym2name(mrb, sym(tree)));
     7009    printf("NODE_CONST %s\n", mrb_sym_name(mrb, sym(tree)));
    63407010    break;
    63417011
     
    63517021
    63527022  case NODE_BACK_REF:
    6353     printf("NODE_BACK_REF: $%c\n", (int)(intptr_t)tree);
     7023    printf("NODE_BACK_REF: $%c\n", intn(tree));
    63547024    break;
    63557025
    63567026  case NODE_NTH_REF:
    6357     printf("NODE_NTH_REF: $%" MRB_PRId "\n", (mrb_int)(intptr_t)tree);
     7027    printf("NODE_NTH_REF: $%d\n", intn(tree));
    63587028    break;
    63597029
    63607030  case NODE_ARG:
    6361     printf("NODE_ARG %s\n", mrb_sym2name(mrb, sym(tree)));
     7031    printf("NODE_ARG %s\n", mrb_sym_name(mrb, sym(tree)));
    63627032    break;
    63637033
     
    63687038
    63697039  case NODE_INT:
    6370     printf("NODE_INT %s base %d\n", (char*)tree->car, (int)(intptr_t)tree->cdr->car);
     7040    printf("NODE_INT %s base %d\n", (char*)tree->car, intn(tree->cdr->car));
    63717041    break;
    63727042
     
    63767046
    63777047  case NODE_NEGATE:
    6378     printf("NODE_NEGATE\n");
     7048    printf("NODE_NEGATE:\n");
    63797049    mrb_parser_dump(mrb, tree, offset+1);
    63807050    break;
    63817051
    63827052  case NODE_STR:
    6383     printf("NODE_STR \"%s\" len %d\n", (char*)tree->car, (int)(intptr_t)tree->cdr);
     7053    printf("NODE_STR %s len %d\n", str_dump(mrb, (char*)tree->car, intn(tree->cdr)), intn(tree->cdr));
    63847054    break;
    63857055
    63867056  case NODE_DSTR:
    6387     printf("NODE_DSTR\n");
     7057    printf("NODE_DSTR:\n");
    63887058    dump_recur(mrb, tree, offset+1);
    63897059    break;
    63907060
    63917061  case NODE_XSTR:
    6392     printf("NODE_XSTR \"%s\" len %d\n", (char*)tree->car, (int)(intptr_t)tree->cdr);
     7062    printf("NODE_XSTR %s len %d\n", str_dump(mrb, (char*)tree->car, intn(tree->cdr)), intn(tree->cdr));
    63937063    break;
    63947064
    63957065  case NODE_DXSTR:
    6396     printf("NODE_DXSTR\n");
     7066    printf("NODE_DXSTR:\n");
    63977067    dump_recur(mrb, tree, offset+1);
    63987068    break;
     
    64037073
    64047074  case NODE_DREGX:
    6405     printf("NODE_DREGX\n");
     7075    printf("NODE_DREGX:\n");
    64067076    dump_recur(mrb, tree->car, offset+1);
    64077077    dump_prefix(tree, offset);
     
    64187088
    64197089  case NODE_SYM:
    6420     printf("NODE_SYM :%s (%d)\n", mrb_sym2name(mrb, sym(tree)),
    6421            (int)(intptr_t)tree);
     7090    printf("NODE_SYM :%s (%d)\n", mrb_sym_dump(mrb, sym(tree)),
     7091           intn(tree));
     7092    break;
     7093
     7094  case NODE_DSYM:
     7095    printf("NODE_DSYM:\n");
     7096    mrb_parser_dump(mrb, tree, offset+1);
     7097    break;
     7098
     7099  case NODE_WORDS:
     7100    printf("NODE_WORDS:\n");
     7101    dump_recur(mrb, tree, offset+1);
     7102    break;
     7103
     7104  case NODE_SYMBOLS:
     7105    printf("NODE_SYMBOLS:\n");
     7106    dump_recur(mrb, tree, offset+1);
     7107    break;
     7108
     7109  case NODE_LITERAL_DELIM:
     7110    printf("NODE_LITERAL_DELIM\n");
    64227111    break;
    64237112
     
    64407129  case NODE_ALIAS:
    64417130    printf("NODE_ALIAS %s %s:\n",
    6442         mrb_sym2name(mrb, sym(tree->car)),
    6443         mrb_sym2name(mrb, sym(tree->cdr)));
     7131        mrb_sym_dump(mrb, sym(tree->car)),
     7132        mrb_sym_dump(mrb, sym(tree->cdr)));
    64447133    break;
    64457134
     
    64497138      node *t = tree;
    64507139      while (t) {
    6451         printf(" %s", mrb_sym2name(mrb, sym(t->car)));
     7140        printf(" %s", mrb_sym_dump(mrb, sym(t->car)));
    64527141        t = t->cdr;
    64537142      }
     
    64607149    if (tree->car->car == (node*)0) {
    64617150      dump_prefix(tree, offset+1);
    6462       printf(":%s\n", mrb_sym2name(mrb, sym(tree->car->cdr)));
     7151      printf(":%s\n", mrb_sym_name(mrb, sym(tree->car->cdr)));
    64637152    }
    64647153    else if (tree->car->car == (node*)1) {
    64657154      dump_prefix(tree, offset+1);
    6466       printf("::%s\n", mrb_sym2name(mrb, sym(tree->car->cdr)));
     7155      printf("::%s\n", mrb_sym_name(mrb, sym(tree->car->cdr)));
    64677156    }
    64687157    else {
    64697158      mrb_parser_dump(mrb, tree->car->car, offset+1);
    64707159      dump_prefix(tree, offset+1);
    6471       printf("::%s\n", mrb_sym2name(mrb, sym(tree->car->cdr)));
     7160      printf("::%s\n", mrb_sym_name(mrb, sym(tree->car->cdr)));
    64727161    }
    64737162    if (tree->cdr->car) {
     
    64857174    if (tree->car->car == (node*)0) {
    64867175      dump_prefix(tree, offset+1);
    6487       printf(":%s\n", mrb_sym2name(mrb, sym(tree->car->cdr)));
     7176      printf(":%s\n", mrb_sym_name(mrb, sym(tree->car->cdr)));
    64887177    }
    64897178    else if (tree->car->car == (node*)1) {
    64907179      dump_prefix(tree, offset+1);
    6491       printf("::%s\n", mrb_sym2name(mrb, sym(tree->car->cdr)));
     7180      printf("::%s\n", mrb_sym_name(mrb, sym(tree->car->cdr)));
    64927181    }
    64937182    else {
    64947183      mrb_parser_dump(mrb, tree->car->car, offset+1);
    64957184      dump_prefix(tree, offset+1);
    6496       printf("::%s\n", mrb_sym2name(mrb, sym(tree->car->cdr)));
     7185      printf("::%s\n", mrb_sym_name(mrb, sym(tree->car->cdr)));
    64977186    }
    64987187    dump_prefix(tree, offset+1);
     
    65127201    printf("NODE_DEF:\n");
    65137202    dump_prefix(tree, offset+1);
    6514     printf("%s\n", mrb_sym2name(mrb, sym(tree->car)));
     7203    printf("%s\n", mrb_sym_dump(mrb, sym(tree->car)));
    65157204    tree = tree->cdr;
    65167205    {
     
    65257214          if (n2->car) {
    65267215            if (!first_lval) printf(", ");
    6527             printf("%s", mrb_sym2name(mrb, sym(n2->car)));
     7216            printf("%s", mrb_sym_name(mrb, sym(n2->car)));
    65287217            first_lval = FALSE;
    65297218          }
     
    65357224    tree = tree->cdr;
    65367225    if (tree->car) {
    6537       node *n = tree->car;
    6538 
    6539       if (n->car) {
    6540         dump_prefix(n, offset+1);
    6541         printf("mandatory args:\n");
    6542         dump_recur(mrb, n->car, offset+2);
    6543       }
    6544       n = n->cdr;
    6545       if (n->car) {
    6546         dump_prefix(n, offset+1);
    6547         printf("optional args:\n");
    6548         {
    6549           node *n2 = n->car;
    6550 
    6551           while (n2) {
    6552             dump_prefix(n2, offset+2);
    6553             printf("%s=", mrb_sym2name(mrb, sym(n2->car->car)));
    6554             mrb_parser_dump(mrb, n2->car->cdr, 0);
    6555             n2 = n2->cdr;
    6556           }
    6557         }
    6558       }
    6559       n = n->cdr;
    6560       if (n->car) {
    6561         dump_prefix(n, offset+1);
    6562         printf("rest=*%s\n", mrb_sym2name(mrb, sym(n->car)));
    6563       }
    6564       n = n->cdr;
    6565       if (n->car) {
    6566         dump_prefix(n, offset+1);
    6567         printf("post mandatory args:\n");
    6568         dump_recur(mrb, n->car, offset+2);
    6569       }
    6570       if (n->cdr) {
    6571         dump_prefix(n, offset+1);
    6572         printf("blk=&%s\n", mrb_sym2name(mrb, sym(n->cdr)));
    6573       }
     7226      dump_args(mrb, tree->car, offset);
    65747227    }
    65757228    mrb_parser_dump(mrb, tree->cdr->car, offset+1);
     
    65817234    tree = tree->cdr;
    65827235    dump_prefix(tree, offset+1);
    6583     printf(":%s\n", mrb_sym2name(mrb, sym(tree->car)));
     7236    printf(":%s\n", mrb_sym_dump(mrb, sym(tree->car)));
    65847237    tree = tree->cdr->cdr;
    65857238    if (tree->car) {
    6586       node *n = tree->car;
    6587 
    6588       if (n->car) {
    6589         dump_prefix(n, offset+1);
    6590         printf("mandatory args:\n");
    6591         dump_recur(mrb, n->car, offset+2);
    6592       }
    6593       n = n->cdr;
    6594       if (n->car) {
    6595         dump_prefix(n, offset+1);
    6596         printf("optional args:\n");
    6597         {
    6598           node *n2 = n->car;
    6599 
    6600           while (n2) {
    6601             dump_prefix(n2, offset+2);
    6602             printf("%s=", mrb_sym2name(mrb, sym(n2->car->car)));
    6603             mrb_parser_dump(mrb, n2->car->cdr, 0);
    6604             n2 = n2->cdr;
    6605           }
    6606         }
    6607       }
    6608       n = n->cdr;
    6609       if (n->car) {
    6610         dump_prefix(n, offset+1);
    6611         printf("rest=*%s\n", mrb_sym2name(mrb, sym(n->car)));
    6612       }
    6613       n = n->cdr;
    6614       if (n->car) {
    6615         dump_prefix(n, offset+1);
    6616         printf("post mandatory args:\n");
    6617         dump_recur(mrb, n->car, offset+2);
    6618       }
    6619       n = n->cdr;
    6620       if (n) {
    6621         dump_prefix(n, offset+1);
    6622         printf("blk=&%s\n", mrb_sym2name(mrb, sym(n)));
    6623       }
     7239      dump_args(mrb, tree->car, offset+1);
    66247240    }
    66257241    tree = tree->cdr;
     
    66377253    break;
    66387254
     7255  case NODE_ARGS_TAIL:
     7256    printf("NODE_ARGS_TAIL:\n");
     7257    {
     7258      node *kws = tree->car;
     7259
     7260      while (kws) {
     7261        mrb_parser_dump(mrb, kws->car, offset+1);
     7262        kws = kws->cdr;
     7263      }
     7264    }
     7265    tree = tree->cdr;
     7266    if (tree->car) {
     7267      mrb_assert(intn(tree->car->car) == NODE_KW_REST_ARGS);
     7268      mrb_parser_dump(mrb, tree->car, offset+1);
     7269    }
     7270    tree = tree->cdr;
     7271    if (tree->car) {
     7272      dump_prefix(tree, offset+1);
     7273      printf("block='%s'\n", mrb_sym_name(mrb, sym(tree->car)));
     7274    }
     7275    break;
     7276
     7277  case NODE_KW_ARG:
     7278    printf("NODE_KW_ARG %s:\n", mrb_sym_name(mrb, sym(tree->car)));
     7279    mrb_parser_dump(mrb, tree->cdr->car, offset + 1);
     7280    break;
     7281
     7282  case NODE_KW_REST_ARGS:
     7283    printf("NODE_KW_REST_ARGS %s\n", mrb_sym_name(mrb, sym(tree)));
     7284    break;
     7285
    66397286  default:
    66407287    printf("node type: %d (0x%x)\n", nodetype, (unsigned)nodetype);
Note: See TracChangeset for help on using the changeset viewer.