| 341 | |
| 342 | |
| 343 | static void discharge2reg (FuncState *fs, expdesc *e, int reg) { |
| 344 | luaK_dischargevars(fs, e); |
| 345 | switch (e->k) { |
| 346 | case VNIL: { |
| 347 | luaK_nil(fs, reg, 1); |
| 348 | break; |
| 349 | } |
| 350 | case VFALSE: case VTRUE: { |
| 351 | luaK_codeABC(fs, OP_LOADBOOL, reg, e->k == VTRUE, 0); |
| 352 | break; |
| 353 | } |
| 354 | case VK: { |
| 355 | luaK_codeABx(fs, OP_LOADK, reg, e->u.s.info); |
| 356 | break; |
| 357 | } |
| 358 | case VKNUM: { |
| 359 | luaK_codeABx(fs, OP_LOADK, reg, luaK_numberK(fs, e->u.nval)); |
| 360 | break; |
| 361 | } |
| 362 | case VRELOCABLE: { |
| 363 | Instruction *pc = &getcode(fs, e); |
| 364 | SETARG_A(*pc, reg); |
| 365 | break; |
| 366 | } |
| 367 | case VNONRELOC: { |
| 368 | if (reg != e->u.s.info) |
| 369 | luaK_codeABC(fs, OP_MOVE, reg, e->u.s.info, 0); |
| 370 | break; |
| 371 | } |
| 372 | default: { |
| 373 | lua_assert(e->k == VVOID || e->k == VJMP); |
| 374 | return; /* nothing to do... */ |
| 375 | } |
| 376 | } |
| 377 | e->u.s.info = reg; |
| 378 | e->k = VNONRELOC; |
| 379 | } |
| 380 | |
| 381 | |
| 382 | static void discharge2anyreg (FuncState *fs, expdesc *e) { |
no test coverage detected