Ignore:
Timestamp:
Jan 21, 2018, 12:10:09 AM (6 years ago)
Author:
coas-nagasima
Message:

prototoolに関連するプロジェクトをnewlibからmuslを使うよう変更・更新
ntshellをnewlibの下位の実装から、muslのsyscallの実装に変更・更新
以下のOSSをアップデート
・mruby-1.3.0
・musl-1.1.18
・onigmo-6.1.3
・tcc-0.9.27
以下のOSSを追加
・openssl-1.1.0e
・curl-7.57.0
・zlib-1.2.11
以下のmrbgemsを追加
・iij/mruby-digest
・iij/mruby-env
・iij/mruby-errno
・iij/mruby-iijson
・iij/mruby-ipaddr
・iij/mruby-mock
・iij/mruby-require
・iij/mruby-tls-openssl

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

Legend:

Unmodified
Added
Removed
  • EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-compiler/core/codegen.c

    r321 r331  
    99#include <stdlib.h>
    1010#include <string.h>
    11 #include "mruby.h"
    12 #include "mruby/compile.h"
    13 #include "mruby/proc.h"
    14 #include "mruby/numeric.h"
    15 #include "mruby/string.h"
    16 #include "mruby/debug.h"
     11#include <mruby.h>
     12#include <mruby/compile.h>
     13#include <mruby/proc.h>
     14#include <mruby/numeric.h>
     15#include <mruby/string.h>
     16#include <mruby/debug.h>
    1717#include "node.h"
    18 #include "mruby/opcode.h"
    19 #include "mruby/re.h"
    20 #include "mruby/throw.h"
     18#include <mruby/opcode.h>
     19#include <mruby/re.h>
     20#include <mruby/throw.h>
     21
     22#ifndef MRB_CODEGEN_LEVEL_MAX
     23#define MRB_CODEGEN_LEVEL_MAX 1024
     24#endif
    2125
    2226typedef mrb_ast_node node;
     
    7478  uint16_t filename_index;
    7579  parser_state* parser;
     80
     81  int rlev;                     /* recursion levels */
    7682} codegen_scope;
    7783
     
    94100  while (s->prev) {
    95101    codegen_scope *tmp = s->prev;
     102    mrb_free(s->mrb, s->iseq);
    96103    mrb_pool_close(s->mpool);
    97104    s = tmp;
    98105  }
    99 #ifndef MBB_DISABLE_STDIO
     106#ifndef MRB_DISABLE_STDIO
    100107  if (s->filename && s->lineno) {
    101108    fprintf(stderr, "codegen error:%s:%d: %s\n", s->filename, s->lineno, message);
     
    340347        }
    341348      }
     349      if (c0 == OP_LOADNIL) {
     350        if (GETARG_B(i) == GETARG_A(i0)) {
     351          s->pc--;
     352          return 0;
     353        }
     354      }
    342355      break;
    343356    case OP_JMPIF:
     
    381394    scope_error(s);
    382395    break;
     396  }
     397  if (diff > MAXARG_sBx) {
     398    codegen_error(s, "too distant jump address");
    383399  }
    384400  s->iseq[pc] = MKOP_AsBx(c, GETARG_A(i), diff);
     
    495511}
    496512
    497 static inline int
     513/* method symbols should be fit in 9 bits */
     514#define MAXMSYMLEN 512
     515/* maximum symbol numbers */
     516#define MAXSYMLEN 65536
     517
     518static int
    498519new_msym(codegen_scope *s, mrb_sym sym)
    499520{
     
    503524
    504525  len = s->irep->slen;
    505   if (len > 256) len = 256;
     526  if (len > MAXMSYMLEN) len = MAXMSYMLEN;
    506527  for (i=0; i<len; i++) {
    507528    if (s->irep->syms[i] == sym) return i;
    508529    if (s->irep->syms[i] == 0) break;
    509530  }
    510   if (i == 256) {
    511     codegen_error(s, "too many symbols (max 256)");
     531  if (i == MAXMSYMLEN) {
     532    codegen_error(s, "too many symbols (max " MRB_STRINGIZE(MAXMSYMLEN) ")");
    512533  }
    513534  s->irep->syms[i] = sym;
     
    516537}
    517538
    518 static inline int
     539static int
    519540new_sym(codegen_scope *s, mrb_sym sym)
    520541{
     
    524545    if (s->irep->syms[i] == sym) return i;
    525546  }
    526   if (s->irep->slen > 125 && s->irep->slen < 256) {
    527     s->irep->syms = (mrb_sym *)codegen_realloc(s, s->irep->syms, sizeof(mrb_sym)*65536);
    528     for (i = 0; i < 256 - s->irep->slen; i++) {
     547  if (s->irep->slen == MAXSYMLEN) {
     548    codegen_error(s, "too many symbols (max " MRB_STRINGIZE(MAXSYMLEN) ")");
     549  }
     550
     551  if (s->irep->slen > MAXMSYMLEN/2 && s->scapa == MAXMSYMLEN) {
     552    s->scapa = MAXSYMLEN;
     553    s->irep->syms = (mrb_sym *)codegen_realloc(s, s->irep->syms, sizeof(mrb_sym)*MAXSYMLEN);
     554    for (i = s->irep->slen; i < MAXMSYMLEN; i++) {
    529555      static const mrb_sym mrb_sym_zero = { 0 };
    530       s->irep->syms[i + s->irep->slen] = mrb_sym_zero;
    531     }
    532     s->irep->slen = 256;
     556      s->irep->syms[i] = mrb_sym_zero;
     557    }
     558    s->irep->slen = MAXMSYMLEN;
    533559  }
    534560  s->irep->syms[s->irep->slen] = sym;
     
    583609  push();                       /* push for a block parameter */
    584610
    585   lp = loop_push(s, LOOP_FOR);
    586   lp->pc1 = new_label(s);
    587 
    588611  /* generate loop variable */
    589612  n2 = tree->car;
     
    595618    gen_vmassignment(s, n2, 1, VAL);
    596619  }
     620  /* construct loop */
     621  lp = loop_push(s, LOOP_FOR);
     622  lp->pc2 = new_label(s);
     623
     624  /* loop body */
    597625  codegen(s, tree->cdr->cdr->car, VAL);
    598626  pop();
     
    645673    ba = tree->car->cdr->cdr->cdr->cdr ? 1 : 0;
    646674
     675    if (ma > 0x1f || oa > 0x1f || pa > 0x1f || ka > 0x1f) {
     676      codegen_error(s, "too many formal arguments");
     677    }
    647678    a = ((mrb_aspec)(ma & 0x1f) << 18)
    648679      | ((mrb_aspec)(oa & 0x1f) << 13)
     
    765796}
    766797
     798#define CALL_MAXARGS 127
     799
    767800static int
    768 gen_values(codegen_scope *s, node *t, int val)
     801gen_values(codegen_scope *s, node *t, int val, int extra)
    769802{
    770803  int n = 0;
     
    773806  while (t) {
    774807    is_splat = (intptr_t)t->car->car == NODE_SPLAT; /* splat mode */
    775     if (n >= 127 || is_splat) {
     808    if (
     809      n+extra >= CALL_MAXARGS - 1 /* need to subtract one because vm.c expects an array if n == CALL_MAXARGS */
     810      || is_splat) {
    776811      if (val) {
    777         pop_n(n);
    778         genop(s, MKOP_ABC(OP_ARRAY, cursp(), cursp(), n));
    779         push();
    780         codegen(s, t->car, VAL);
    781         pop(); pop();
    782         if (is_splat) {
    783           genop(s, MKOP_AB(OP_ARYCAT, cursp(), cursp()+1));
     812        if (is_splat && n == 0 && (intptr_t)t->car->cdr->car == NODE_ARRAY) {
     813          codegen(s, t->car->cdr, VAL);
     814          pop();
    784815        }
    785816        else {
    786           genop(s, MKOP_AB(OP_ARYPUSH, cursp(), cursp()+1));
     817          pop_n(n);
     818          genop(s, MKOP_ABC(OP_ARRAY, cursp(), cursp(), n));
     819          push();
     820          codegen(s, t->car, VAL);
     821          pop(); pop();
     822          if (is_splat) {
     823            genop(s, MKOP_AB(OP_ARYCAT, cursp(), cursp()+1));
     824          }
     825          else {
     826            genop(s, MKOP_AB(OP_ARYPUSH, cursp(), cursp()+1));
     827          }
    787828        }
    788829        t = t->cdr;
     
    801842      }
    802843      else {
    803         codegen(s, t->car->cdr, NOVAL);
    804         t = t->cdr;
    805844        while (t) {
    806845          codegen(s, t->car, NOVAL);
     
    818857}
    819858
    820 #define CALL_MAXARGS 127
    821 
    822859static void
    823 gen_call(codegen_scope *s, node *tree, mrb_sym name, int sp, int val)
     860gen_call(codegen_scope *s, node *tree, mrb_sym name, int sp, int val, int safe)
    824861{
    825862  mrb_sym sym = name ? name : sym(tree->cdr->car);
    826   int idx;
     863  int idx, skip = 0;
    827864  int n = 0, noop = 0, sendv = 0, blk = 0;
    828865
    829866  codegen(s, tree->car, VAL); /* receiver */
     867  if (safe) {
     868    int recv = cursp()-1;
     869    genop(s, MKOP_A(OP_LOADNIL, cursp()));
     870    push();
     871    genop(s, MKOP_AB(OP_MOVE, cursp(), recv));
     872    push(); pop();              /* space for a block */
     873    pop();
     874    idx = new_msym(s, mrb_intern_lit(s->mrb, "=="));
     875    genop(s, MKOP_ABC(OP_EQ, cursp(), idx, 1));
     876    skip = genop(s, MKOP_AsBx(OP_JMPIF, cursp(), 0));
     877  }
    830878  idx = new_msym(s, sym);
    831879  tree = tree->cdr->cdr->car;
    832880  if (tree) {
    833     n = gen_values(s, tree->car, VAL);
     881    n = gen_values(s, tree->car, VAL, sp?1:0);
    834882    if (n < 0) {
    835883      n = noop = sendv = 1;
     
    863911    const char *symname = mrb_sym2name_len(s->mrb, sym, &symlen);
    864912
    865     if (!noop && symlen == 1 && symname[0] == '+')  {
     913    if (!noop && symlen == 1 && symname[0] == '+' && n == 1)  {
    866914      genop_peep(s, MKOP_ABC(OP_ADD, cursp(), idx, n), val);
    867915    }
    868     else if (!noop && symlen == 1 && symname[0] == '-')  {
     916    else if (!noop && symlen == 1 && symname[0] == '-' && n == 1)  {
    869917      genop_peep(s, MKOP_ABC(OP_SUB, cursp(), idx, n), val);
    870918    }
    871     else if (!noop && symlen == 1 && symname[0] == '*')  {
     919    else if (!noop && symlen == 1 && symname[0] == '*' && n == 1)  {
    872920      genop(s, MKOP_ABC(OP_MUL, cursp(), idx, n));
    873921    }
    874     else if (!noop && symlen == 1 && symname[0] == '/')  {
     922    else if (!noop && symlen == 1 && symname[0] == '/' && n == 1)  {
    875923      genop(s, MKOP_ABC(OP_DIV, cursp(), idx, n));
    876924    }
    877     else if (!noop && symlen == 1 && symname[0] == '<')  {
     925    else if (!noop && symlen == 1 && symname[0] == '<' && n == 1)  {
    878926      genop(s, MKOP_ABC(OP_LT, cursp(), idx, n));
    879927    }
    880     else if (!noop && symlen == 2 && symname[0] == '<' && symname[1] == '=')  {
     928    else if (!noop && symlen == 2 && symname[0] == '<' && symname[1] == '=' && n == 1)  {
    881929      genop(s, MKOP_ABC(OP_LE, cursp(), idx, n));
    882930    }
    883     else if (!noop && symlen == 1 && symname[0] == '>')  {
     931    else if (!noop && symlen == 1 && symname[0] == '>' && n == 1)  {
    884932      genop(s, MKOP_ABC(OP_GT, cursp(), idx, n));
    885933    }
    886     else if (!noop && symlen == 2 && symname[0] == '>' && symname[1] == '=')  {
     934    else if (!noop && symlen == 2 && symname[0] == '>' && symname[1] == '=' && n == 1)  {
    887935      genop(s, MKOP_ABC(OP_GE, cursp(), idx, n));
    888936    }
    889     else if (!noop && symlen == 2 && symname[0] == '=' && symname[1] == '=')  {
     937    else if (!noop && symlen == 2 && symname[0] == '=' && symname[1] == '=' && n == 1)  {
    890938      genop(s, MKOP_ABC(OP_EQ, cursp(), idx, n));
    891939    }
     
    900948    }
    901949  }
     950  if (safe) {
     951    dispatch(s, skip);
     952  }
    902953  if (val) {
    903954    push();
     
    912963
    913964  tree = tree->cdr;
    914   switch ((intptr_t)type) {
     965  switch (type) {
    915966  case NODE_GVAR:
    916967    idx = new_sym(s, sym(tree));
     
    9621013
    9631014  case NODE_CALL:
     1015  case NODE_SCALL:
    9641016    push();
    965     gen_call(s, tree, attrsym(s, sym(tree->cdr->car)), sp, NOVAL);
     1017    gen_call(s, tree, attrsym(s, sym(tree->cdr->car)), sp, NOVAL,
     1018             type == NODE_SCALL);
    9661019    pop();
    9671020    if (val) {
     
    9801033  default:
    9811034#ifndef MRB_DISABLE_STDIO
    982     printf("unknown lhs %d\n", type);
     1035    fprintf(stderr, "unknown lhs %d\n", type);
    9831036#endif
    9841037    break;
     
    10331086      }
    10341087    }
    1035     push();
     1088    if (!val) {
     1089      push();
     1090    }
    10361091  }
    10371092}
     
    11761231
    11771232static void
     1233gen_retval(codegen_scope *s, node *tree)
     1234{
     1235  if ((intptr_t)tree->car == NODE_SPLAT) {
     1236    genop(s, MKOP_ABC(OP_ARRAY, cursp(), cursp(), 0));
     1237    push();
     1238    codegen(s, tree, VAL);
     1239    pop(); pop();
     1240    genop(s, MKOP_AB(OP_ARYCAT, cursp(), cursp()+1));
     1241  }
     1242  else {
     1243    codegen(s, tree, VAL);
     1244    pop();
     1245  }
     1246}
     1247
     1248static void
    11781249codegen(codegen_scope *s, node *tree, int val)
    11791250{
    11801251  int nt;
    1181 
    1182   if (!tree) return;
    1183 
     1252  int rlev = s->rlev;
     1253
     1254  if (!tree) {
     1255    if (val) {
     1256      genop(s, MKOP_A(OP_LOADNIL, cursp()));
     1257      push();
     1258    }
     1259    return;
     1260  }
     1261
     1262  s->rlev++;
     1263  if (s->rlev > MRB_CODEGEN_LEVEL_MAX) {
     1264    codegen_error(s, "too complex expression");
     1265  }
    11841266  if (s->irep && s->filename_index != tree->filename_index) {
    11851267    s->irep->filename = mrb_parser_get_filename(s->parser, s->filename_index);
     
    12101292      struct loopinfo *lp;
    12111293
     1294      if (tree->car == NULL) goto exit;
    12121295      onerr = genop(s, MKOP_Bx(OP_ONERR, 0));
    12131296      lp = loop_push(s, LOOP_BEGIN);
    12141297      lp->pc1 = onerr;
    1215       if (tree->car) {
    1216         codegen(s, tree->car, val);
    1217         if (val) pop();
    1218       }
     1298      codegen(s, tree->car, VAL);
     1299      pop();
    12191300      lp->type = LOOP_RESCUE;
    12201301      noexc = genop(s, MKOP_Bx(OP_JMP, 0));
     
    12271308        int exc = cursp();
    12281309
    1229         genop(s, MKOP_A(OP_RESCUE, exc));
     1310        genop(s, MKOP_ABC(OP_RESCUE, exc, 0, 0));
    12301311        push();
    12311312        while (n2) {
     
    12361317          pos2 = 0;
    12371318          do {
    1238             if (n4) {
     1319            if (n4 && n4->car && (intptr_t)n4->car->car == NODE_SPLAT) {
    12391320              codegen(s, n4->car, VAL);
    1240             }
    1241             else {
    1242               genop(s, MKOP_ABx(OP_GETCONST, cursp(), new_msym(s, mrb_intern_lit(s->mrb, "StandardError"))));
    1243               push();
    1244             }
    1245             genop(s, MKOP_AB(OP_MOVE, cursp(), exc));
    1246             pop();
    1247             if (n4 && n4->car && (intptr_t)n4->car->car == NODE_SPLAT) {
     1321              genop(s, MKOP_AB(OP_MOVE, cursp(), exc));
     1322              pop();
    12481323              genop(s, MKOP_ABC(OP_SEND, cursp(), new_msym(s, mrb_intern_lit(s->mrb, "__case_eqq")), 1));
    12491324            }
    12501325            else {
    1251               genop(s, MKOP_ABC(OP_SEND, cursp(), new_msym(s, mrb_intern_lit(s->mrb, "===")), 1));
     1326              if (n4) {
     1327                codegen(s, n4->car, VAL);
     1328              }
     1329              else {
     1330                genop(s, MKOP_ABx(OP_GETCONST, cursp(), new_msym(s, mrb_intern_lit(s->mrb, "StandardError"))));
     1331                push();
     1332              }
     1333              pop();
     1334              genop(s, MKOP_ABC(OP_RESCUE, exc, cursp(), 1));
    12521335            }
    12531336            tmp = genop(s, MKOP_AsBx(OP_JMPIF, cursp(), pos2));
     
    12941377
    12951378  case NODE_ENSURE:
    1296     {
     1379    if (!tree->cdr || !tree->cdr->cdr ||
     1380        ((intptr_t)tree->cdr->cdr->car == NODE_BEGIN &&
     1381         tree->cdr->cdr->cdr)) {
    12971382      int idx;
    12981383      int epush = s->pc;
     
    13061391      genop_peep(s, MKOP_A(OP_EPOP, 1), NOVAL);
    13071392    }
     1393    else {                      /* empty ensure ignored */
     1394      codegen(s, tree->car, val);
     1395    }
    13081396    break;
    13091397
    13101398  case NODE_LAMBDA:
    1311     {
     1399    if (val) {
    13121400      int idx = lambda_body(s, tree, 1);
    13131401
     
    13181406
    13191407  case NODE_BLOCK:
    1320     {
     1408    if (val) {
    13211409      int idx = lambda_body(s, tree, 1);
    13221410
     
    13311419      node *e = tree->cdr->cdr->car;
    13321420
     1421      if (!tree->car) {
     1422        codegen(s, e, val);
     1423        goto exit;
     1424      }
    13331425      switch ((intptr_t)tree->car->car) {
    13341426      case NODE_TRUE:
     
    13361428      case NODE_STR:
    13371429        codegen(s, tree->cdr->car, val);
    1338         return;
     1430        goto exit;
    13391431      case NODE_FALSE:
    13401432      case NODE_NIL:
    13411433        codegen(s, e, val);
    1342         return;
     1434        goto exit;
    13431435      }
    13441436      codegen(s, tree->car, VAL);
     
    13471439
    13481440      codegen(s, tree->cdr->car, val);
    1349       if (val && !(tree->cdr->car)) {
    1350         genop(s, MKOP_A(OP_LOADNIL, cursp()));
    1351         push();
    1352       }
    13531441      if (e) {
    13541442        if (val) pop();
     
    14851573        if (pos3) dispatch_linked(s, pos3);
    14861574        if (head) pop();
    1487         genop(s, MKOP_AB(OP_MOVE, cursp(), pos));
     1575        if (cursp() != pos) {
     1576          genop(s, MKOP_AB(OP_MOVE, cursp(), pos));
     1577        }
    14881578        push();
    14891579      }
     
    15051595  case NODE_FCALL:
    15061596  case NODE_CALL:
    1507     gen_call(s, tree, 0, 0, val);
     1597    gen_call(s, tree, 0, 0, val, 0);
     1598    break;
     1599  case NODE_SCALL:
     1600    gen_call(s, tree, 0, 0, val, 1);
    15081601    break;
    15091602
     
    15531646      int n;
    15541647
    1555       n = gen_values(s, tree, val);
     1648      n = gen_values(s, tree, val, 0);
    15561649      if (n >= 0) {
    15571650        if (val) {
     
    16021695
    16031696  case NODE_SPLAT:
    1604     codegen(s, tree, VAL);
     1697    codegen(s, tree, val);
    16051698    break;
    16061699
     
    16171710      int rhs = cursp();
    16181711
    1619       if ((intptr_t)t->car == NODE_ARRAY && nosplat(t->cdr)) {
     1712      if ((intptr_t)t->car == NODE_ARRAY && t->cdr && nosplat(t->cdr)) {
    16201713        /* fixed rhs */
    16211714        t = t->cdr;
     
    16301723          n = 0;
    16311724          while (t) {
    1632             gen_assignment(s, t->car, rhs+n, NOVAL);
    1633             n++;
     1725            if (n < len) {
     1726              gen_assignment(s, t->car, rhs+n, NOVAL);
     1727              n++;
     1728            }
     1729            else {
     1730              genop(s, MKOP_A(OP_LOADNIL, rhs+n));
     1731              gen_assignment(s, t->car, rhs+n, NOVAL);
     1732            }
    16341733            t = t->cdr;
    16351734          }
     
    16881787      mrb_int len;
    16891788      const char *name = mrb_sym2name_len(s->mrb, sym, &len);
    1690       int idx;
    1691 
    1692       codegen(s, tree->car, VAL);
     1789      int idx, callargs = -1, vsp = -1;
     1790
     1791      if ((len == 2 && name[0] == '|' && name[1] == '|') &&
     1792          ((intptr_t)tree->car->car == NODE_CONST ||
     1793           (intptr_t)tree->car->car == NODE_CVAR)) {
     1794        int onerr, noexc, exc;
     1795        struct loopinfo *lp;
     1796
     1797        onerr = genop(s, MKOP_Bx(OP_ONERR, 0));
     1798        lp = loop_push(s, LOOP_BEGIN);
     1799        lp->pc1 = onerr;
     1800        exc = cursp();
     1801        codegen(s, tree->car, VAL);
     1802        lp->type = LOOP_RESCUE;
     1803        genop(s, MKOP_A(OP_POPERR, 1));
     1804        noexc = genop(s, MKOP_Bx(OP_JMP, 0));
     1805        dispatch(s, onerr);
     1806        genop(s, MKOP_ABC(OP_RESCUE, exc, 0, 0));
     1807        genop(s, MKOP_A(OP_LOADF, exc));
     1808        dispatch(s, noexc);
     1809        loop_pop(s, NOVAL);
     1810      }
     1811      else if ((intptr_t)tree->car->car == NODE_CALL) {
     1812        node *n = tree->car->cdr;
     1813
     1814        if (val) {
     1815          vsp = cursp();
     1816          push();
     1817        }
     1818        codegen(s, n->car, VAL);   /* receiver */
     1819        idx = new_msym(s, sym(n->cdr->car));
     1820        if (n->cdr->cdr->car) {
     1821          int base = cursp()-1;
     1822          int nargs = gen_values(s, n->cdr->cdr->car->car, VAL, 1);
     1823
     1824          /* copy receiver and arguments */
     1825          if (nargs >= 0) {
     1826            int i;
     1827
     1828            genop(s, MKOP_AB(OP_MOVE, cursp(), base));
     1829            for (i=0; i<nargs; i++) {
     1830              genop(s, MKOP_AB(OP_MOVE, cursp()+i+1, base+i+1));
     1831            }
     1832            push_n(nargs+1);
     1833            pop_n(nargs+1);
     1834            callargs = nargs;
     1835          }
     1836          else {
     1837            /* varargs */
     1838            push();
     1839            genop(s, MKOP_AB(OP_MOVE, cursp(), base));
     1840            genop(s, MKOP_AB(OP_MOVE, cursp()+1, base+1));
     1841            callargs = CALL_MAXARGS;
     1842          }
     1843          genop(s, MKOP_ABC(OP_SEND, cursp(), idx, callargs));
     1844        }
     1845        else {
     1846          genop(s, MKOP_AB(OP_MOVE, cursp(), cursp()-1));
     1847          genop(s, MKOP_ABC(OP_SEND, cursp(), idx, 0));
     1848          callargs = 0;
     1849        }
     1850        push();
     1851      }
     1852      else {
     1853        codegen(s, tree->car, VAL);
     1854      }
    16931855      if (len == 2 &&
    16941856          ((name[0] == '|' && name[1] == '|') ||
     
    16971859
    16981860        pop();
    1699         pos = genop_peep(s, MKOP_AsBx(name[0] == '|' ? OP_JMPIF : OP_JMPNOT, cursp(), 0), NOVAL);
     1861        if (val) {
     1862          if (vsp >= 0) {
     1863            genop(s, MKOP_AB(OP_MOVE, vsp, cursp()));
     1864          }
     1865          pos = genop(s, MKOP_AsBx(name[0]=='|'?OP_JMPIF:OP_JMPNOT, cursp(), 0));
     1866        }
     1867        else {
     1868          pos = genop_peep(s, MKOP_AsBx(name[0]=='|'?OP_JMPIF:OP_JMPNOT, cursp(), 0), NOVAL);
     1869        }
    17001870        codegen(s, tree->cdr->cdr->car, VAL);
    17011871        pop();
    1702         gen_assignment(s, tree->car, cursp(), val);
     1872        if (val && vsp >= 0) {
     1873          genop(s, MKOP_AB(OP_MOVE, vsp, cursp()));
     1874        }
     1875        if ((intptr_t)tree->car->car == NODE_CALL) {
     1876          mrb_sym m = sym(tree->car->cdr->cdr->car);
     1877          mrb_sym m2 = attrsym(s, m);
     1878
     1879          idx = new_msym(s, m2);
     1880          pop();
     1881          if (callargs == CALL_MAXARGS) {
     1882            genop(s, MKOP_AB(OP_ARYPUSH, cursp(), cursp()+1));
     1883            pop();
     1884            genop(s, MKOP_ABC(OP_SEND, cursp(), idx, callargs));
     1885          }
     1886          else {
     1887            pop_n(callargs);
     1888            genop(s, MKOP_ABC(OP_SEND, cursp(), idx, callargs+1));
     1889          }
     1890        }
     1891        else {
     1892          gen_assignment(s, tree->car, cursp(), val);
     1893        }
    17031894        dispatch(s, pos);
    1704         break;
     1895        goto exit;
    17051896      }
    17061897      codegen(s, tree->cdr->cdr->car, VAL);
     
    17361927        genop(s, MKOP_ABC(OP_SEND, cursp(), idx, 1));
    17371928      }
    1738     }
    1739     gen_assignment(s, tree->car, cursp(), val);
     1929      if (callargs < 0) {
     1930        gen_assignment(s, tree->car, cursp(), val);
     1931      }
     1932      else {
     1933        if (val && vsp >= 0) {
     1934          genop(s, MKOP_AB(OP_MOVE, vsp, cursp()));
     1935        }
     1936        if (callargs == CALL_MAXARGS) {
     1937          pop();
     1938          genop(s, MKOP_AB(OP_ARYPUSH, cursp(), cursp()+1));
     1939        }
     1940        else {
     1941          pop_n(callargs);
     1942          callargs++;
     1943        }
     1944        pop();
     1945        idx = new_msym(s, attrsym(s,sym(tree->car->cdr->cdr->car)));
     1946        genop(s, MKOP_ABC(OP_SEND, cursp(), idx, callargs));
     1947      }
     1948    }
    17401949    break;
    17411950
    17421951  case NODE_SUPER:
    17431952    {
     1953      codegen_scope *s2 = s;
     1954      int lv = 0;
    17441955      int n = 0, noop = 0, sendv = 0;
    17451956
    17461957      push();        /* room for receiver */
     1958      while (!s2->mscope) {
     1959        lv++;
     1960        s2 = s2->prev;
     1961        if (!s2) break;
     1962      }
     1963      genop(s, MKOP_ABx(OP_ARGARY, cursp(), (lv & 0xf)));
     1964      push(); push();         /* ARGARY pushes two values */
     1965      pop(); pop();
    17471966      if (tree) {
    17481967        node *args = tree->car;
    17491968        if (args) {
    1750           n = gen_values(s, args, VAL);
     1969          n = gen_values(s, args, VAL, 0);
    17511970          if (n < 0) {
    17521971            n = noop = sendv = 1;
     
    17962015  case NODE_RETURN:
    17972016    if (tree) {
    1798       codegen(s, tree, VAL);
    1799       pop();
     2017      gen_retval(s, tree);
    18002018    }
    18012019    else {
     
    18232041      }
    18242042      if (s2) ainfo = s2->ainfo;
    1825       genop(s, MKOP_ABx(OP_BLKPUSH, cursp(), (ainfo<<4)|(lv & 0xf)));
    18262043      push();
    18272044      if (tree) {
    1828         n = gen_values(s, tree, VAL);
     2045        n = gen_values(s, tree, VAL, 0);
    18292046        if (n < 0) {
    18302047          n = sendv = 1;
     
    18332050      }
    18342051      pop_n(n+1);
     2052      genop(s, MKOP_ABx(OP_BLKPUSH, cursp(), (ainfo<<4)|(lv & 0xf)));
    18352053      if (sendv) n = CALL_MAXARGS;
    18362054      genop(s, MKOP_ABC(OP_SEND, cursp(), new_msym(s, mrb_intern_lit(s->mrb, "call")), n));
     
    18692087
    18702088  case NODE_REDO:
    1871     if (!s->loop) {
     2089    if (!s->loop || s->loop->type == LOOP_BEGIN || s->loop->type == LOOP_RESCUE) {
    18722090      raise_error(s, "unexpected redo");
    18732091    }
     
    18782096      genop(s, MKOP_sBx(OP_JMP, s->loop->pc2 - s->pc));
    18792097    }
     2098    if (val) push();
    18802099    break;
    18812100
     
    19122131        }
    19132132      }
     2133      if (val) push();
    19142134    }
    19152135    break;
     
    19842204  case NODE_BACK_REF:
    19852205    if (val) {
    1986       char buf[2] = { '$' };
     2206      char buf[3];
     2207      int sym;
     2208
     2209      buf[0] = '$';
     2210      buf[1] = (char)(intptr_t)tree;
     2211      buf[2] = 0;
     2212      sym = new_sym(s, mrb_intern_cstr(s->mrb, buf));
     2213      genop(s, MKOP_ABx(OP_GETGLOBAL, cursp(), sym));
     2214      push();
     2215    }
     2216    break;
     2217
     2218  case NODE_NTH_REF:
     2219    if (val) {
     2220      mrb_state *mrb = s->mrb;
    19872221      mrb_value str;
    19882222      int sym;
    19892223
    1990       buf[1] = (char)(intptr_t)tree;
    1991       str = mrb_str_new(s->mrb, buf, 2);
    1992       sym = new_sym(s, mrb_intern_str(s->mrb, str));
    1993       genop(s, MKOP_ABx(OP_GETGLOBAL, cursp(), sym));
    1994       push();
    1995     }
    1996     break;
    1997 
    1998   case NODE_NTH_REF:
    1999     if (val) {
    2000       int sym;
    2001       mrb_state *mrb = s->mrb;
    2002       mrb_value fix = mrb_fixnum_value((intptr_t)tree);
    2003       mrb_value str = mrb_str_buf_new(mrb, 4);
    2004 
    2005       mrb_str_cat_lit(mrb, str, "$");
    2006       mrb_str_cat_str(mrb, str, mrb_fixnum_to_str(mrb, fix, 10));
     2224      str = mrb_format(mrb, "$%S", mrb_fixnum_value((mrb_int)(intptr_t)tree));
    20072225      sym = new_sym(s, mrb_intern_str(mrb, str));
    20082226      genop(s, MKOP_ABx(OP_GETGLOBAL, cursp(), sym));
     
    20512269    if (val) {
    20522270      char *p = (char*)tree;
    2053       mrb_float f = str_to_mrb_float(p);
     2271      mrb_float f = mrb_float_read(p, NULL);
    20542272      int off = new_lit(s, mrb_float_value(s->mrb, f));
    20552273
     
    20652283      switch (nt) {
    20662284      case NODE_FLOAT:
    2067         {
     2285        if (val) {
    20682286          char *p = (char*)tree;
    2069           mrb_float f = str_to_mrb_float(p);
     2287          mrb_float f = mrb_float_read(p, NULL);
    20702288          int off = new_lit(s, mrb_float_value(s->mrb, -f));
    20712289
     
    20762294
    20772295      case NODE_INT:
    2078         {
     2296        if (val) {
    20792297          char *p = (char*)tree->car;
    20802298          int base = (intptr_t)tree->cdr->car;
     
    21052323
    21062324      default:
    2107         {
     2325        if (val) {
    21082326          int sym = new_msym(s, mrb_intern_lit(s->mrb, "-"));
    21092327
     
    21132331          pop(); pop();
    21142332          genop(s, MKOP_ABC(OP_SUB, cursp(), sym, 2));
     2333        }
     2334        else {
     2335          codegen(s, tree, NOVAL);
    21152336        }
    21162337        break;
     
    21392360      node *n = tree;
    21402361
    2141       if (!n) break;
     2362      if (!n) {
     2363        genop(s, MKOP_A(OP_LOADNIL, cursp()));
     2364        push();
     2365        break;
     2366      }
    21422367      codegen(s, n->car, VAL);
    21432368      n = n->cdr;
     
    21762401      int sym = new_sym(s, mrb_intern_lit(s->mrb, "Kernel"));
    21772402
    2178       if (val == NOVAL) { push(); }
    2179       genop(s, MKOP_A(OP_OCLASS, cursp()));
    2180       genop(s, MKOP_ABx(OP_GETMCNST, cursp(), sym));
     2403      genop(s, MKOP_A(OP_LOADSELF, cursp()));
    21812404      push();
    21822405      codegen(s, tree->car, VAL);
     
    21932416        n = n->cdr;
    21942417      }
    2195       pop();
    2196       pop();
     2418      push();                   /* for block */
     2419      pop_n(3);
    21972420      sym = new_sym(s, mrb_intern_lit(s->mrb, "`"));
    21982421      genop(s, MKOP_ABC(OP_SEND, cursp(), sym, 1));
    2199       if (val == NOVAL) { pop(); }
    2200       else { push(); }
     2422      if (val) push();
    22012423      mrb_gc_arena_restore(s->mrb, ai);
    22022424    }
     
    22082430      size_t len = (intptr_t)tree->cdr;
    22092431      int ai = mrb_gc_arena_save(s->mrb);
    2210       int sym = new_sym(s, mrb_intern_lit(s->mrb, "Kernel"));
    22112432      int off = new_lit(s, mrb_str_new(s->mrb, p, len));
    2212 
    2213       if (val == NOVAL) { push(); }
    2214       genop(s, MKOP_A(OP_OCLASS, cursp()));
    2215       genop(s, MKOP_ABx(OP_GETMCNST, cursp(), sym));
     2433      int sym;
     2434
     2435      genop(s, MKOP_A(OP_LOADSELF, cursp()));
    22162436      push();
    22172437      genop(s, MKOP_ABx(OP_STRING, cursp(), off));
    2218       pop();
     2438      push(); push();
     2439      pop_n(3);
    22192440      sym = new_sym(s, mrb_intern_lit(s->mrb, "`"));
    22202441      genop(s, MKOP_ABC(OP_SEND, cursp(), sym, 1));
    2221       if (val == NOVAL) { pop(); }
    2222       else { push(); }
     2442      if (val) push();
    22232443      mrb_gc_arena_restore(s->mrb, ai);
    22242444    }
     
    22442464          off = new_lit(s, mrb_str_new_cstr(s->mrb, p2));
    22452465          genop(s, MKOP_ABx(OP_STRING, cursp(), off));
    2246         } else {
     2466        }
     2467        else {
    22472468          genop(s, MKOP_A(OP_LOADNIL, cursp()));
    22482469        }
     
    22952516        genop_peep(s, MKOP_AB(OP_STRCAT, cursp(), cursp()+1), VAL);
    22962517      }
    2297       if (n->cdr) {
    2298         char *p2 = (char*)n->cdr;
     2518      if (n->cdr->car) {
     2519        char *p2 = (char*)n->cdr->car;
    22992520
    23002521        push();
     
    23022523        genop(s, MKOP_ABx(OP_STRING, cursp(), off));
    23032524        argc++;
    2304         pop();
    2305       }
    2306       pop();
     2525      }
     2526      if (n->cdr->cdr) {
     2527        char *p2 = (char*)n->cdr->cdr;
     2528
     2529        push();
     2530        off = new_lit(s, mrb_str_new_cstr(s->mrb, p2));
     2531        genop(s, MKOP_ABx(OP_STRING, cursp(), off));
     2532        argc++;
     2533      }
     2534      pop_n(argc);
    23072535      sym = new_sym(s, mrb_intern_lit(s->mrb, "compile"));
    23082536      genop(s, MKOP_ABC(OP_SEND, cursp(), sym, argc));
     
    23792607      push();
    23802608      genop(s, MKOP_A(OP_LOADNIL, cursp()));
    2381       pop_n(3);
     2609      push();
     2610      pop_n(4);
    23822611      genop(s, MKOP_ABC(OP_SEND, cursp(), c, 2));
    23832612      if (val) {
     
    23962625      push();
    23972626      while (t) {
    2398         int symbol = new_msym(s, sym(t->car));
     2627        int symbol;
     2628        if (num >= CALL_MAXARGS - 1) {
     2629          pop_n(num);
     2630          genop(s, MKOP_ABC(OP_ARRAY, cursp(), cursp(), num));
     2631          while (t) {
     2632            symbol = new_msym(s, sym(t->car));
     2633            push();
     2634            genop(s, MKOP_ABx(OP_LOADSYM, cursp(), symbol));
     2635            pop();
     2636            genop(s, MKOP_AB(OP_ARYPUSH, cursp(), cursp()+1));
     2637            t = t->cdr;
     2638          }
     2639          num = CALL_MAXARGS;
     2640          break;
     2641        }
     2642        symbol = new_msym(s, sym(t->car));
    23992643        genop(s, MKOP_ABx(OP_LOADSYM, cursp(), symbol));
    24002644        push();
     
    24022646        num++;
    24032647      }
    2404       pop_n(num + 1);
     2648      pop();
     2649      if (num < CALL_MAXARGS) {
     2650        pop_n(num);
     2651      }
    24052652      genop(s, MKOP_ABC(OP_SEND, cursp(), undef, num));
    24062653      if (val) {
     
    25292776    break;
    25302777  }
     2778 exit:
     2779  s->rlev = rlev;
    25312780}
    25322781
     
    25702819  p->icapa = 1024;
    25712820  p->iseq = (mrb_code*)mrb_malloc(mrb, sizeof(mrb_code)*p->icapa);
    2572   p->irep->iseq = p->iseq;
     2821  p->irep->iseq = NULL;
    25732822
    25742823  p->pcapa = 32;
     
    25762825  p->irep->plen = 0;
    25772826
    2578   p->scapa = 256;
     2827  p->scapa = MAXMSYMLEN;
    25792828  p->irep->syms = (mrb_sym*)mrb_malloc(mrb, sizeof(mrb_sym)*p->scapa);
    25802829  p->irep->slen = 0;
     
    26202869  p->filename_index = prev->filename_index;
    26212870
     2871  p->rlev = prev->rlev+1;
     2872
    26222873  return p;
    26232874}
     
    26462897  irep->reps = (mrb_irep**)codegen_realloc(s, irep->reps, sizeof(mrb_irep*)*irep->rlen);
    26472898  if (s->filename) {
    2648     s->irep->filename = mrb_parser_get_filename(s->parser, s->filename_index);
    2649     mrb_debug_info_append_file(mrb, s->irep, s->debug_start_pos, s->pc);
     2899    irep->filename = mrb_parser_get_filename(s->parser, s->filename_index);
     2900    mrb_debug_info_append_file(mrb, irep, s->debug_start_pos, s->pc);
    26502901
    26512902    fname_len = strlen(s->filename);
     
    26542905    fname[fname_len] = '\0';
    26552906    irep->filename = fname;
     2907    irep->own_filename = TRUE;
    26562908  }
    26572909
     
    26892941
    26902942    if (tree) {
    2691       codegen(s, tree, VAL);
    2692       pop();
     2943      gen_retval(s, tree);
    26932944    }
    26942945
     
    27022953    }
    27032954    if (!loop) {
    2704       codegen_error(s, "unexpected break");
     2955      raise_error(s, "unexpected break");
     2956      return;
    27052957    }
    27062958
     
    27182970    }
    27192971    else {
     2972      if (!tree) {
     2973        genop(s, MKOP_A(OP_LOADNIL, cursp()));
     2974      }
    27202975      genop(s, MKOP_AB(OP_RETURN, cursp(), OP_R_BREAK));
    27212976    }
     
    27262981loop_pop(codegen_scope *s, int val)
    27272982{
     2983  dispatch_linked(s, s->loop->pc3);
    27282984  if (val) {
    27292985    genop(s, MKOP_A(OP_LOADNIL, cursp()));
    27302986  }
    2731   dispatch_linked(s, s->loop->pc3);
    27322987  s->loop = s->loop->prev;
    27332988  if (val) push();
     
    27392994  codegen_scope *scope = scope_new(mrb, 0, 0);
    27402995  struct RProc *proc;
     2996  struct mrb_jmpbuf *prev_jmp = mrb->jmp;
    27412997
    27422998  if (!scope) {
     
    27493005
    27503006  MRB_TRY(&scope->jmp) {
     3007    mrb->jmp = &scope->jmp;
    27513008    /* prepare irep */
    27523009    codegen(scope, p->tree, NOVAL);
     
    27543011    mrb_irep_decref(mrb, scope->irep);
    27553012    mrb_pool_close(scope->mpool);
     3013    proc->c = NULL;
     3014    mrb->jmp = prev_jmp;
    27563015    return proc;
    27573016  }
    27583017  MRB_CATCH(&scope->jmp) {
    2759     if (scope->filename == scope->irep->filename) {
    2760       scope->irep->filename = NULL;
    2761     }
    27623018    mrb_irep_decref(mrb, scope->irep);
    27633019    mrb_pool_close(scope->mpool);
     3020    mrb->jmp = prev_jmp;
    27643021    return NULL;
    27653022  }
Note: See TracChangeset for help on using the changeset viewer.