[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: Re: Thoughts on optional commas (a simple way to save some commas)
 
- From: Wolfgang Pupp <wolfgang.pupp@...>
 
- Date: Sun, 11 Mar 2012 19:40:57 +0100
 
2012/3/10 Greg <tghill@hotmail.com>:
> This must be close.  I tried running the following code:
>
>    local t1 = {}
>    table.insert(t1, 1)
>
> and got this err:
>
>    bad argument #1 to 'insert' (table expected, got number)
I fixed a very obvious bug (that should teach me to write code after
2am), but your testcase always worked for me...
Here is the updated version; look for the following else-if (in in
lj_parse.c, around line
1545), and replace it with this (or apply the attached patch on lj_parse.c):
    else if (ls->token == TK_name && lj_lex_lookahead(ls) == '=') {
      do {
        expr_str(ls, &key);
        lex_check(ls, '=');
        nhash++;
        expr(ls, &val);
        if (expr_isk_nojump(&val)) {
          TValue k;
          if (!t) {  /* Create template table on demand. */
            BCReg kidx;
            t = lj_tab_new(fs->L, 0, 0);
            kidx = const_gc(fs, obj2gco(t), LJ_TTAB);
            fs->bcbase[pc].ins = BCINS_AD(BC_TDUP, freg-1, kidx);
          }
          vcall = 0;
          expr_kvalue(&k, &key);
          expr_kvalue(lj_tab_set(fs->L, t, &k), &val);
          lj_gc_anybarriert(fs->L, t);
        } else {
          if (val.k != VCALL) { expr_toanyreg(fs, &val); vcall = 0; }
          expr_index(fs, e, &key);
          bcemit_store(fs, e, &val);
        }
        fs->freereg = freg;
      } while (ls->token == TK_name && lj_lex_lookahead(ls) == '=');
      if(!lex_opt(ls, ',')) {
        lex_opt(ls, ';');
      }
      continue;
    }
I hope this fixed all problems; I'm using this comma-saving version as
my default interpreter now- if I find any other bugs, I'll keep you
posted.
-- Wolfgang
Attachment:
lj_lesscommas_fixed.patch
Description: Binary data