diff options
Diffstat (limited to 'lcode.c')
-rw-r--r-- | lcode.c | 55 |
1 files changed, 3 insertions, 52 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lcode.c,v 2.159 2018/03/07 15:55:38 roberto Exp roberto $ | 2 | ** $Id: lcode.c,v 2.160 2018/03/16 14:22:09 roberto Exp roberto $ |
3 | ** Code generator for Lua | 3 | ** Code generator for Lua |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -678,10 +678,6 @@ void luaK_dischargevars (FuncState *fs, expdesc *e) { | |||
678 | e->k = VNONRELOC; /* becomes a non-relocatable value */ | 678 | e->k = VNONRELOC; /* becomes a non-relocatable value */ |
679 | break; | 679 | break; |
680 | } | 680 | } |
681 | case VUNDEF: { /* not a real expression */ | ||
682 | luaK_semerror(fs->ls, "'undef' is not a value!!"); | ||
683 | break; | ||
684 | } | ||
685 | case VUPVAL: { /* move value to some (pending) register */ | 681 | case VUPVAL: { /* move value to some (pending) register */ |
686 | e->u.info = luaK_codeABC(fs, OP_GETUPVAL, 0, e->u.info, 0); | 682 | e->u.info = luaK_codeABC(fs, OP_GETUPVAL, 0, e->u.info, 0); |
687 | e->k = VRELOC; | 683 | e->k = VRELOC; |
@@ -1410,48 +1406,6 @@ static void codeeq (FuncState *fs, BinOpr opr, expdesc *e1, expdesc *e2) { | |||
1410 | } | 1406 | } |
1411 | 1407 | ||
1412 | 1408 | ||
1413 | static void normalizeindexed (FuncState *fs, expdesc *v) { | ||
1414 | if (v->k != VINDEXED) { /* not in proper form? */ | ||
1415 | int key = fs->freereg; /* register with key value */ | ||
1416 | luaK_reserveregs(fs, 1); | ||
1417 | switch (v->k) { | ||
1418 | case VINDEXI: | ||
1419 | luaK_int(fs, key, v->u.ind.idx); | ||
1420 | break; | ||
1421 | case VINDEXSTR: | ||
1422 | luaK_codek(fs, key, v->u.ind.idx); | ||
1423 | break; | ||
1424 | case VINDEXUP: | ||
1425 | luaK_codek(fs, key, v->u.ind.idx); | ||
1426 | luaK_codeABC(fs, OP_GETUPVAL, fs->freereg, v->u.ind.t, 0); | ||
1427 | v->u.ind.t = fs->freereg; | ||
1428 | luaK_reserveregs(fs, 1); /* one more register for the upvalue */ | ||
1429 | break; | ||
1430 | default: | ||
1431 | luaK_semerror(fs->ls, "'undef' is not a value!!"); | ||
1432 | break; | ||
1433 | } | ||
1434 | v->u.ind.idx = key; | ||
1435 | v->k = VINDEXED; | ||
1436 | } | ||
1437 | freeregs(fs, v->u.ind.t, v->u.ind.idx); | ||
1438 | } | ||
1439 | |||
1440 | |||
1441 | static void codeisdef (FuncState *fs, int eq, expdesc *v) { | ||
1442 | normalizeindexed(fs, v); | ||
1443 | v->u.info = luaK_codeABCk(fs, OP_ISDEF, 0, v->u.ind.t, v->u.ind.idx, eq); | ||
1444 | v->k = VRELOC; | ||
1445 | } | ||
1446 | |||
1447 | |||
1448 | void luaK_codeundef (FuncState *fs, expdesc *v) { | ||
1449 | normalizeindexed(fs, v); | ||
1450 | v->u.info = luaK_codeABC(fs, OP_UNDEF, v->u.ind.t, v->u.ind.idx, 0); | ||
1451 | v->k = VRELOC; | ||
1452 | } | ||
1453 | |||
1454 | |||
1455 | /* | 1409 | /* |
1456 | ** Apply prefix operation 'op' to expression 'e'. | 1410 | ** Apply prefix operation 'op' to expression 'e'. |
1457 | */ | 1411 | */ |
@@ -1500,7 +1454,7 @@ void luaK_infix (FuncState *fs, BinOpr op, expdesc *v) { | |||
1500 | break; | 1454 | break; |
1501 | } | 1455 | } |
1502 | case OPR_EQ: case OPR_NE: { | 1456 | case OPR_EQ: case OPR_NE: { |
1503 | if (!tonumeral(v, NULL) && fs->ls->t.token != TK_UNDEF) | 1457 | if (!tonumeral(v, NULL)) |
1504 | luaK_exp2RK(fs, v); | 1458 | luaK_exp2RK(fs, v); |
1505 | /* else keep numeral, which may be an immediate operand */ | 1459 | /* else keep numeral, which may be an immediate operand */ |
1506 | break; | 1460 | break; |
@@ -1597,10 +1551,7 @@ void luaK_posfix (FuncState *fs, BinOpr opr, | |||
1597 | break; | 1551 | break; |
1598 | } | 1552 | } |
1599 | case OPR_EQ: case OPR_NE: { | 1553 | case OPR_EQ: case OPR_NE: { |
1600 | if (e2->k == VUNDEF) | 1554 | codeeq(fs, opr, e1, e2); |
1601 | codeisdef(fs, opr == OPR_NE, e1); | ||
1602 | else | ||
1603 | codeeq(fs, opr, e1, e2); | ||
1604 | break; | 1555 | break; |
1605 | } | 1556 | } |
1606 | case OPR_LT: case OPR_LE: { | 1557 | case OPR_LT: case OPR_LE: { |