コード例 #1
0
static void closegoto(LexState *ls, int g, Labeldesc *label)
{
    int       i;
    FuncState *fs = ls->fs;
    Labellist *gl = &ls->dyd->gt;
    Labeldesc *gt = &gl->arr[g];

    lua_assert(luaS_eqstr(gt->name, label->name));
    if (gt->nactvar < label->nactvar)
    {
        TString    *vname = getlocvar(fs, gt->nactvar)->varname;
        const char *msg   = luaO_pushfstring(ls->L,
                                             "<goto %s> at line %d jumps into the scope of local " LUA_QS,
                                             getstr(gt->name), gt->line, getstr(vname));
        semerror(ls, msg);
    }

    luaK_patchlist(fs, gt->pc, label->pc);

    /* remove goto from pending list */
    for (i = g; i < gl->n - 1; i++)
        gl->arr[i] = gl->arr[i + 1];

    gl->n--;
}
コード例 #2
0
ファイル: lparser.c プロジェクト: iVideo/weishao
static int searchvar (FuncState *fs, TString *n) {
  int i;
  for (i = cast_int(fs->nactvar) - 1; i >= 0; i--) {
    if (luaS_eqstr(n, getlocvar(fs, i)->varname))
      return i;
  }
  return -1;  /* not found */
}
コード例 #3
0
ファイル: lparser.c プロジェクト: iVideo/weishao
static int searchupvalue (FuncState *fs, TString *name) {
  int i;
  Upvaldesc *up = fs->f->upvalues;
  for (i = 0; i < fs->nups; i++) {
    if (luaS_eqstr(up[i].name, name)) return i;
  }
  return -1;  /* not found */
}
コード例 #4
0
ファイル: lparser.c プロジェクト: iVideo/weishao
/*
** check whether new label 'lb' matches any pending gotos in current
** block; solves forward jumps
*/
static void findgotos (LexState *ls, Labeldesc *lb) {
  Labellist *gl = &ls->dyd->gt;
  int i = ls->fs->bl->firstgoto;
  while (i < gl->n) {
    if (luaS_eqstr(gl->arr[i].name, lb->name))
      closegoto(ls, i, lb);
    else
      i++;
  }
}
コード例 #5
0
ファイル: lparser.c プロジェクト: iVideo/weishao
/*
** try to close a goto with existing labels; this solves backward jumps
*/
static int findlabel (LexState *ls, int g) {
  int i;
  BlockCnt *bl = ls->fs->bl;
  Dyndata *dyd = ls->dyd;
  Labeldesc *gt = &dyd->gt.arr[g];
  /* check labels in current block for a match */
  for (i = bl->firstlabel; i < dyd->label.n; i++) {
    Labeldesc *lb = &dyd->label.arr[i];
    if (luaS_eqstr(lb->name, gt->name)) {  /* correct label? */
      if (gt->nactvar > lb->nactvar &&
          (bl->upval || dyd->label.n > bl->firstlabel))
        luaK_patchclose(ls->fs, gt->pc, lb->nactvar);
      closegoto(ls, g, lb);  /* close it */
      return 1;
    }
  }
  return 0;  /* label not found; cannot close goto */
}