コード例 #1
0
static void adjust_assign(LexState *ls, int nvars, int nexps, expdesc *e)
{
    FuncState *fs   = ls->fs;
    int       extra = nvars - nexps;

    if (hasmultret(e->k))
    {
        extra++; /* includes call itself */
        if (extra < 0)
            extra = 0;

        luaK_setreturns(fs, e, extra); /* last exp. provides the difference */
        if (extra > 1)
            luaK_reserveregs(fs, extra - 1);
    }
    else
    {
        if (e->k != VVOID)
            luaK_exp2nextreg(fs, e);             /* close last expression */

        if (extra > 0)
        {
            int reg = fs->freereg;
            luaK_reserveregs(fs, extra);
            luaK_nil(fs, reg, extra);
        }
    }
}
コード例 #2
0
ファイル: lcode.c プロジェクト: hyyh619/OpenSceneGraph-3.4.0
static void discharge2reg(FuncState *fs, expdesc *e, int reg)
{
    luaK_dischargevars(fs, e);

    switch (e->k)
    {
    case VNIL: {
        luaK_nil(fs, reg, 1);
        break;
    }

    case VFALSE:
    case VTRUE: {
        luaK_codeABC(fs, OP_LOADBOOL, reg, e->k == VTRUE, 0);
        break;
    }

    case VK: {
        luaK_codek(fs, reg, e->u.info);
        break;
    }

    case VKNUM: {
        luaK_codek(fs, reg, luaK_numberK(fs, e->u.nval));
        break;
    }

    case VRELOCABLE: {
        Instruction *pc = &getcode(fs, e);
        SETARG_A(*pc, reg);
        break;
    }

    case VNONRELOC: {
        if (reg != e->u.info)
            luaK_codeABC(fs, OP_MOVE, reg, e->u.info, 0);

        break;
    }

    default: {
        lua_assert(e->k == VVOID || e->k == VJMP);
        return; /* nothing to do... */
    }
    }

    e->u.info = reg;
    e->k      = VNONRELOC;
}
コード例 #3
0
ファイル: lcode.c プロジェクト: galek/ravi
static void discharge2reg (FuncState *fs, expdesc *e, int reg) {
  luaK_dischargevars(fs, e);
  switch (e->k) {
    case VNIL: {
      luaK_nil(fs, reg, 1);
      break;
    }
    case VFALSE: case VTRUE: {
      luaK_codeABC(fs, OP_LOADBOOL, reg, e->k == VTRUE, 0);
      break;
    }
    case VK: {
      luaK_codek(fs, reg, e->u.info);
      break;
    }
    case VKFLT: {
      luaK_codek(fs, reg, luaK_numberK(fs, e->u.nval));
      break;
    }
    case VKINT: {
      luaK_codek(fs, reg, luaK_intK(fs, e->u.ival));
      break;
    }
    case VRELOCABLE: {
      Instruction *pc = &getcode(fs, e);
      SETARG_A(*pc, reg);
      DEBUG_EXPR(raviY_printf(fs, "discharge2reg (VRELOCABLE set arg A) %e\n", e));
      DEBUG_CODEGEN(raviY_printf(fs, "[%d]* %o ; set A to %d\n", e->u.info, *pc, reg));
      break;
    }
    case VNONRELOC: {
      if (reg != e->u.info) {
        /* code a MOVEI or MOVEF if the target register is a local typed variable */
        int ravi_type = raviY_get_register_typeinfo(fs, reg);
        switch (ravi_type) {
        case RAVI_TNUMINT:
          luaK_codeABC(fs, OP_RAVI_MOVEI, reg, e->u.info, 0);
          break;
        case RAVI_TNUMFLT:
          luaK_codeABC(fs, OP_RAVI_MOVEF, reg, e->u.info, 0);
          break;
        case RAVI_TARRAYINT:
          luaK_codeABC(fs, OP_RAVI_MOVEAI, reg, e->u.info, 0);
          break;
        case RAVI_TARRAYFLT:
          luaK_codeABC(fs, OP_RAVI_MOVEAF, reg, e->u.info, 0);
          break;
        default:
          luaK_codeABC(fs, OP_MOVE, reg, e->u.info, 0);
          break;
        }
      }
      break;
    }
    default: {
      lua_assert(e->k == VVOID || e->k == VJMP);
      return;  /* nothing to do... */
    }
  }
  e->u.info = reg;
  e->k = VNONRELOC;
}