diff options
Diffstat (limited to '')
| -rw-r--r-- | src/3rdParty/lua/lcode.c | 70 |
1 files changed, 41 insertions, 29 deletions
diff --git a/src/3rdParty/lua/lcode.c b/src/3rdParty/lua/lcode.c index 06425a1..911dbd5 100644 --- a/src/3rdParty/lua/lcode.c +++ b/src/3rdParty/lua/lcode.c | |||
| @@ -1391,7 +1391,10 @@ static void finishbinexpval (FuncState *fs, expdesc *e1, expdesc *e2, | |||
| 1391 | */ | 1391 | */ |
| 1392 | static void codebinexpval (FuncState *fs, OpCode op, | 1392 | static void codebinexpval (FuncState *fs, OpCode op, |
| 1393 | expdesc *e1, expdesc *e2, int line) { | 1393 | expdesc *e1, expdesc *e2, int line) { |
| 1394 | int v2 = luaK_exp2anyreg(fs, e2); /* both operands are in registers */ | 1394 | int v2 = luaK_exp2anyreg(fs, e2); /* make sure 'e2' is in a register */ |
| 1395 | /* 'e1' must be already in a register or it is a constant */ | ||
| 1396 | lua_assert((VNIL <= e1->k && e1->k <= VKSTR) || | ||
| 1397 | e1->k == VNONRELOC || e1->k == VRELOC); | ||
| 1395 | lua_assert(OP_ADD <= op && op <= OP_SHR); | 1398 | lua_assert(OP_ADD <= op && op <= OP_SHR); |
| 1396 | finishbinexpval(fs, e1, e2, op, v2, 0, line, OP_MMBIN, | 1399 | finishbinexpval(fs, e1, e2, op, v2, 0, line, OP_MMBIN, |
| 1397 | cast(TMS, (op - OP_ADD) + TM_ADD)); | 1400 | cast(TMS, (op - OP_ADD) + TM_ADD)); |
| @@ -1410,6 +1413,18 @@ static void codebini (FuncState *fs, OpCode op, | |||
| 1410 | } | 1413 | } |
| 1411 | 1414 | ||
| 1412 | 1415 | ||
| 1416 | /* | ||
| 1417 | ** Code binary operators with K operand. | ||
| 1418 | */ | ||
| 1419 | static void codebinK (FuncState *fs, BinOpr opr, | ||
| 1420 | expdesc *e1, expdesc *e2, int flip, int line) { | ||
| 1421 | TMS event = cast(TMS, opr + TM_ADD); | ||
| 1422 | int v2 = e2->u.info; /* K index */ | ||
| 1423 | OpCode op = cast(OpCode, opr + OP_ADDK); | ||
| 1424 | finishbinexpval(fs, e1, e2, op, v2, flip, line, OP_MMBINK, event); | ||
| 1425 | } | ||
| 1426 | |||
| 1427 | |||
| 1413 | /* Try to code a binary operator negating its second operand. | 1428 | /* Try to code a binary operator negating its second operand. |
| 1414 | ** For the metamethod, 2nd operand must keep its original value. | 1429 | ** For the metamethod, 2nd operand must keep its original value. |
| 1415 | */ | 1430 | */ |
| @@ -1438,23 +1453,27 @@ static void swapexps (expdesc *e1, expdesc *e2) { | |||
| 1438 | 1453 | ||
| 1439 | 1454 | ||
| 1440 | /* | 1455 | /* |
| 1456 | ** Code binary operators with no constant operand. | ||
| 1457 | */ | ||
| 1458 | static void codebinNoK (FuncState *fs, BinOpr opr, | ||
| 1459 | expdesc *e1, expdesc *e2, int flip, int line) { | ||
| 1460 | OpCode op = cast(OpCode, opr + OP_ADD); | ||
| 1461 | if (flip) | ||
| 1462 | swapexps(e1, e2); /* back to original order */ | ||
| 1463 | codebinexpval(fs, op, e1, e2, line); /* use standard operators */ | ||
| 1464 | } | ||
| 1465 | |||
| 1466 | |||
| 1467 | /* | ||
| 1441 | ** Code arithmetic operators ('+', '-', ...). If second operand is a | 1468 | ** Code arithmetic operators ('+', '-', ...). If second operand is a |
| 1442 | ** constant in the proper range, use variant opcodes with K operands. | 1469 | ** constant in the proper range, use variant opcodes with K operands. |
| 1443 | */ | 1470 | */ |
| 1444 | static void codearith (FuncState *fs, BinOpr opr, | 1471 | static void codearith (FuncState *fs, BinOpr opr, |
| 1445 | expdesc *e1, expdesc *e2, int flip, int line) { | 1472 | expdesc *e1, expdesc *e2, int flip, int line) { |
| 1446 | TMS event = cast(TMS, opr + TM_ADD); | 1473 | if (tonumeral(e2, NULL) && luaK_exp2K(fs, e2)) /* K operand? */ |
| 1447 | if (tonumeral(e2, NULL) && luaK_exp2K(fs, e2)) { /* K operand? */ | 1474 | codebinK(fs, opr, e1, e2, flip, line); |
| 1448 | int v2 = e2->u.info; /* K index */ | 1475 | else /* 'e2' is neither an immediate nor a K operand */ |
| 1449 | OpCode op = cast(OpCode, opr + OP_ADDK); | 1476 | codebinNoK(fs, opr, e1, e2, flip, line); |
| 1450 | finishbinexpval(fs, e1, e2, op, v2, flip, line, OP_MMBINK, event); | ||
| 1451 | } | ||
| 1452 | else { /* 'e2' is neither an immediate nor a K operand */ | ||
| 1453 | OpCode op = cast(OpCode, opr + OP_ADD); | ||
| 1454 | if (flip) | ||
| 1455 | swapexps(e1, e2); /* back to original order */ | ||
| 1456 | codebinexpval(fs, op, e1, e2, line); /* use standard operators */ | ||
| 1457 | } | ||
| 1458 | } | 1477 | } |
| 1459 | 1478 | ||
| 1460 | 1479 | ||
| @@ -1478,28 +1497,20 @@ static void codecommutative (FuncState *fs, BinOpr op, | |||
| 1478 | 1497 | ||
| 1479 | 1498 | ||
| 1480 | /* | 1499 | /* |
| 1481 | ** Code bitwise operations; they are all associative, so the function | 1500 | ** Code bitwise operations; they are all commutative, so the function |
| 1482 | ** tries to put an integer constant as the 2nd operand (a K operand). | 1501 | ** tries to put an integer constant as the 2nd operand (a K operand). |
| 1483 | */ | 1502 | */ |
| 1484 | static void codebitwise (FuncState *fs, BinOpr opr, | 1503 | static void codebitwise (FuncState *fs, BinOpr opr, |
| 1485 | expdesc *e1, expdesc *e2, int line) { | 1504 | expdesc *e1, expdesc *e2, int line) { |
| 1486 | int flip = 0; | 1505 | int flip = 0; |
| 1487 | int v2; | 1506 | if (e1->k == VKINT) { |
| 1488 | OpCode op; | ||
| 1489 | if (e1->k == VKINT && luaK_exp2RK(fs, e1)) { | ||
| 1490 | swapexps(e1, e2); /* 'e2' will be the constant operand */ | 1507 | swapexps(e1, e2); /* 'e2' will be the constant operand */ |
| 1491 | flip = 1; | 1508 | flip = 1; |
| 1492 | } | 1509 | } |
| 1493 | else if (!(e2->k == VKINT && luaK_exp2RK(fs, e2))) { /* no constants? */ | 1510 | if (e2->k == VKINT && luaK_exp2K(fs, e2)) /* K operand? */ |
| 1494 | op = cast(OpCode, opr + OP_ADD); | 1511 | codebinK(fs, opr, e1, e2, flip, line); |
| 1495 | codebinexpval(fs, op, e1, e2, line); /* all-register opcodes */ | 1512 | else /* no constants */ |
| 1496 | return; | 1513 | codebinNoK(fs, opr, e1, e2, flip, line); |
| 1497 | } | ||
| 1498 | v2 = e2->u.info; /* index in K array */ | ||
| 1499 | op = cast(OpCode, opr + OP_ADDK); | ||
| 1500 | lua_assert(ttisinteger(&fs->f->k[v2])); | ||
| 1501 | finishbinexpval(fs, e1, e2, op, v2, flip, line, OP_MMBINK, | ||
| 1502 | cast(TMS, opr + TM_ADD)); | ||
| 1503 | } | 1514 | } |
| 1504 | 1515 | ||
| 1505 | 1516 | ||
| @@ -1551,7 +1562,7 @@ static void codeeq (FuncState *fs, BinOpr opr, expdesc *e1, expdesc *e2) { | |||
| 1551 | op = OP_EQI; | 1562 | op = OP_EQI; |
| 1552 | r2 = im; /* immediate operand */ | 1563 | r2 = im; /* immediate operand */ |
| 1553 | } | 1564 | } |
| 1554 | else if (luaK_exp2RK(fs, e2)) { /* 1st expression is constant? */ | 1565 | else if (luaK_exp2RK(fs, e2)) { /* 2nd expression is constant? */ |
| 1555 | op = OP_EQK; | 1566 | op = OP_EQK; |
| 1556 | r2 = e2->u.info; /* constant index */ | 1567 | r2 = e2->u.info; /* constant index */ |
| 1557 | } | 1568 | } |
| @@ -1611,7 +1622,8 @@ void luaK_infix (FuncState *fs, BinOpr op, expdesc *v) { | |||
| 1611 | case OPR_SHL: case OPR_SHR: { | 1622 | case OPR_SHL: case OPR_SHR: { |
| 1612 | if (!tonumeral(v, NULL)) | 1623 | if (!tonumeral(v, NULL)) |
| 1613 | luaK_exp2anyreg(fs, v); | 1624 | luaK_exp2anyreg(fs, v); |
| 1614 | /* else keep numeral, which may be folded with 2nd operand */ | 1625 | /* else keep numeral, which may be folded or used as an immediate |
| 1626 | operand */ | ||
| 1615 | break; | 1627 | break; |
| 1616 | } | 1628 | } |
| 1617 | case OPR_EQ: case OPR_NE: { | 1629 | case OPR_EQ: case OPR_NE: { |
