Add support for swap bytecode and simple WITH_EXCEPT_START bytecode support. (#488)

* Modify .gitignore

* Added support for SWAP and WITH_EXCEPT_START, WITH_EXCEPT_START is simply added on top of SETUP_WITH_A so that it works properly.

* Resolve the warning about comparing size_t and int.

* Revert "Resolve the warning about comparing size_t and int."

This reverts commit 54dfe36629855ca557277572d307dacaf6a64fe9.

* Reapply "Resolve the warning about comparing size_t and int."

This reverts commit d21d1681ed6496856ea65151e5fd798f0a718416.

* Modify decompyle_test.sh

* Modify .gitignore

* Fix the logic error by placing the assignment inside the tuple

* Re-adding test files

* Fixing redundant brackets

* Add support for swap bytecode and simple WITH_EXCEPT_START bytecode support.

* Clean up some formatting issues

---------

Co-authored-by: Michael Hansen <zrax0111@gmail.com>
This commit is contained in:
easyz
2024-06-24 02:59:30 +08:00
committed by GitHub
parent b9f3d145bb
commit 6ad3ceb67e
4 changed files with 37 additions and 0 deletions

View File

@@ -1884,6 +1884,7 @@ PycRef<ASTNode> BuildFromCode(PycRef<PycCode> code, PycModule* mod)
// Ignore
break;
case Pyc::SETUP_WITH_A:
case Pyc::WITH_EXCEPT_START:
{
PycRef<ASTBlock> withblock = new ASTWithBlock(pos+operand);
blocks.push(withblock);
@@ -2463,6 +2464,24 @@ PycRef<ASTNode> BuildFromCode(PycRef<PycCode> code, PycModule* mod)
case Pyc::GEN_START_A:
stack.pop();
break;
case Pyc::SWAP_A:
{
unpack = operand;
ASTTuple::value_t values;
ASTTuple::value_t next_tuple;
values.resize(operand);
for (int i = 0; i < operand; i++) {
values[operand - i - 1] = stack.top();
stack.pop();
}
auto tup = new ASTTuple(values);
tup->setRequireParens(false);
auto next_tup = new ASTTuple(next_tuple);
next_tup->setRequireParens(false);
stack.push(tup);
stack.push(next_tup);
}
break;
default:
fprintf(stderr, "Unsupported opcode: %s\n", Pyc::OpcodeName(opcode & 0xFF));
cleanBuild = false;

Binary file not shown.

12
tests/input/swap.py Normal file
View File

@@ -0,0 +1,12 @@
def SWAP():
my_array = [
1,
2,
3,
4,
5,
6,
8]
i = 1
j = 3
my_array[i], my_array[j], my_array[2] = my_array[j], my_array[i], my_array[4]

6
tests/tokenized/swap.txt Normal file
View File

@@ -0,0 +1,6 @@
def SWAP ( ) : <EOL>
<INDENT>
my_array = [ 1 , 2 , 3 , 4 , 5 , 6 , 8 ] <EOL>
i = 1 <EOL>
j = 3 <EOL>
my_array [ i ] , my_array [ j ] , my_array [ 2 ] = my_array [ j ] , my_array [ i ] , my_array [ 4 ] <EOL>