Add basic bytecode and disassembly support for Python 3.12
This commit is contained in:
10
ASTree.cpp
10
ASTree.cpp
@@ -1796,6 +1796,12 @@ PycRef<ASTNode> BuildFromCode(PycRef<PycCode> code, PycModule* mod)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case Pyc::RETURN_CONST_A:
|
||||||
|
{
|
||||||
|
PycRef<ASTObject> value = new ASTObject(code->getConst(operand));
|
||||||
|
curblock->append(new ASTReturn(value.cast<ASTNode>()));
|
||||||
|
}
|
||||||
|
break;
|
||||||
case Pyc::ROT_TWO:
|
case Pyc::ROT_TWO:
|
||||||
{
|
{
|
||||||
PycRef<ASTNode> one = stack.top();
|
PycRef<ASTNode> one = stack.top();
|
||||||
@@ -3347,7 +3353,9 @@ void decompyle(PycRef<PycCode> code, PycModule* mod, std::ostream& pyc_output)
|
|||||||
if (clean->nodes().back().type() == ASTNode::NODE_RETURN) {
|
if (clean->nodes().back().type() == ASTNode::NODE_RETURN) {
|
||||||
PycRef<ASTReturn> ret = clean->nodes().back().cast<ASTReturn>();
|
PycRef<ASTReturn> ret = clean->nodes().back().cast<ASTReturn>();
|
||||||
|
|
||||||
if (ret->value() == NULL || ret->value().type() == ASTNode::NODE_LOCALS) {
|
PycRef<ASTObject> retObj = ret->value().try_cast<ASTObject>();
|
||||||
|
if (ret->value() == NULL || ret->value().type() == ASTNode::NODE_LOCALS ||
|
||||||
|
(retObj && retObj->object().type() == PycObject::TYPE_NONE)) {
|
||||||
clean->removeLast(); // Always an extraneous return statement
|
clean->removeLast(); // Always an extraneous return statement
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ endif()
|
|||||||
set(PYTHON_VERSIONS
|
set(PYTHON_VERSIONS
|
||||||
10 11 13 14 15 16 # Python 1.1 and 1.2 are marshal-identical
|
10 11 13 14 15 16 # Python 1.1 and 1.2 are marshal-identical
|
||||||
20 21 22 23 24 25 26 27
|
20 21 22 23 24 25 26 27
|
||||||
30 31 32 33 34 35 36 37 38 39 310 311
|
30 31 32 33 34 35 36 37 38 39 310 311 312
|
||||||
)
|
)
|
||||||
|
|
||||||
foreach(ver ${PYTHON_VERSIONS})
|
foreach(ver ${PYTHON_VERSIONS})
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ Python MAGIC Python MAGIC Python MAGIC
|
|||||||
3.9 0x0A0D0D61
|
3.9 0x0A0D0D61
|
||||||
3.10 0x0A0D0D6F
|
3.10 0x0A0D0D6F
|
||||||
3.11 0x0A0D0DA7
|
3.11 0x0A0D0DA7
|
||||||
|
3.12 0x0A0D0DCB
|
||||||
|
|
||||||
|
|
||||||
1.0 1.1 1.2 1.3 1.4 1.5 1.6
|
1.0 1.1 1.2 1.3 1.4 1.5 1.6
|
||||||
@@ -542,190 +543,244 @@ DICT_UPDATE [ ] [ ] [ ] [ ] [ ] [ ] [ ]
|
|||||||
.
|
.
|
||||||
|
|
||||||
|
|
||||||
3.11
|
3.11 3.12
|
||||||
CACHE [X]
|
CACHE [X] [X]
|
||||||
POP_TOP [X]
|
POP_TOP [X] [X]
|
||||||
PUSH_NULL [X]
|
PUSH_NULL [X] [X]
|
||||||
<3> [ ]
|
INTERPRETER_EXIT [ ] [X]
|
||||||
<4> [ ]
|
END_FOR [ ] [X]
|
||||||
<5> [ ]
|
END_SEND [ ] [X]
|
||||||
<6> [ ]
|
<6> [ ] [ ]
|
||||||
<7> [ ]
|
<7> [ ] [ ]
|
||||||
<8> [ ]
|
<8> [ ] [ ]
|
||||||
NOP [X]
|
NOP [X] [X]
|
||||||
UNARY_POSITIVE [X]
|
UNARY_POSITIVE [X] [ ]
|
||||||
UNARY_NEGATIVE [X]
|
UNARY_NEGATIVE [X] [X]
|
||||||
UNARY_NOT [X]
|
UNARY_NOT [X] [X]
|
||||||
<13> [ ]
|
<13> [ ] [ ]
|
||||||
<14> [ ]
|
<14> [ ] [ ]
|
||||||
UNARY_INVERT [X]
|
UNARY_INVERT [X] [X]
|
||||||
<16> [ ]
|
<16> [ ] [ ]
|
||||||
<17> [ ]
|
RESERVED [ ] [X]
|
||||||
<18> [ ]
|
<18> [ ] [ ]
|
||||||
<19> [ ]
|
<19> [ ] [ ]
|
||||||
<20> [ ]
|
<20> [ ] [ ]
|
||||||
<21> [ ]
|
<21> [ ] [ ]
|
||||||
<22> [ ]
|
<22> [ ] [ ]
|
||||||
<23> [ ]
|
<23> [ ] [ ]
|
||||||
<24> [ ]
|
<24> [ ] [ ]
|
||||||
BINARY_SUBSCR [X]
|
BINARY_SUBSCR [X] [X]
|
||||||
<26> [ ]
|
BINARY_SLICE [ ] [X]
|
||||||
<27> [ ]
|
STORE_SLICE [ ] [X]
|
||||||
<28> [ ]
|
<28> [ ] [ ]
|
||||||
<29> [ ]
|
<29> [ ] [ ]
|
||||||
GET_LEN [X]
|
GET_LEN [X] [X]
|
||||||
MATCH_MAPPING [X]
|
MATCH_MAPPING [X] [X]
|
||||||
MATCH_SEQUENCE [X]
|
MATCH_SEQUENCE [X] [X]
|
||||||
MATCH_KEYS [X]
|
MATCH_KEYS [X] [X]
|
||||||
<34> [ ]
|
<34> [ ] [ ]
|
||||||
PUSH_EXC_INFO [X]
|
PUSH_EXC_INFO [X] [X]
|
||||||
CHECK_EXC_MATCH [X]
|
CHECK_EXC_MATCH [X] [X]
|
||||||
CHECK_EG_MATCH [X]
|
CHECK_EG_MATCH [X] [X]
|
||||||
<38> [ ]
|
<38> [ ] [ ]
|
||||||
<39> [ ]
|
<39> [ ] [ ]
|
||||||
<40> [ ]
|
<40> [ ] [ ]
|
||||||
<41> [ ]
|
<41> [ ] [ ]
|
||||||
<42> [ ]
|
<42> [ ] [ ]
|
||||||
<43> [ ]
|
<43> [ ] [ ]
|
||||||
<44> [ ]
|
<44> [ ] [ ]
|
||||||
<45> [ ]
|
<45> [ ] [ ]
|
||||||
<46> [ ]
|
<46> [ ] [ ]
|
||||||
<47> [ ]
|
<47> [ ] [ ]
|
||||||
<48> [ ]
|
<48> [ ] [ ]
|
||||||
WITH_EXCEPT_START [X]
|
WITH_EXCEPT_START [X] [X]
|
||||||
GET_AITER [X]
|
GET_AITER [X] [X]
|
||||||
GET_ANEXT [X]
|
GET_ANEXT [X] [X]
|
||||||
BEFORE_ASYNC_WITH [X]
|
BEFORE_ASYNC_WITH [X] [X]
|
||||||
BEFORE_WITH [X]
|
BEFORE_WITH [X] [X]
|
||||||
END_ASYNC_FOR [X]
|
END_ASYNC_FOR [X] [X]
|
||||||
<55> [ ]
|
CLEANUP_THROW [ ] [X]
|
||||||
<56> [ ]
|
<56> [ ] [ ]
|
||||||
<57> [ ]
|
<57> [ ] [ ]
|
||||||
<58> [ ]
|
<58> [ ] [ ]
|
||||||
<59> [ ]
|
<59> [ ] [ ]
|
||||||
STORE_SUBSCR [X]
|
STORE_SUBSCR [X] [X]
|
||||||
DELETE_SUBSCR [X]
|
DELETE_SUBSCR [X] [X]
|
||||||
<62> [ ]
|
<62> [ ] [ ]
|
||||||
<63> [ ]
|
<63> [ ] [ ]
|
||||||
<64> [ ]
|
<64> [ ] [ ]
|
||||||
<65> [ ]
|
<65> [ ] [ ]
|
||||||
<66> [ ]
|
<66> [ ] [ ]
|
||||||
<67> [ ]
|
<67> [ ] [ ]
|
||||||
GET_ITER [X]
|
GET_ITER [X] [X]
|
||||||
GET_YIELD_FROM_ITER [X]
|
GET_YIELD_FROM_ITER [X] [X]
|
||||||
PRINT_EXPR [X]
|
PRINT_EXPR [X] [ ]
|
||||||
LOAD_BUILD_CLASS [X]
|
LOAD_BUILD_CLASS [X] [X]
|
||||||
<72> [ ]
|
<72> [ ] [ ]
|
||||||
<73> [ ]
|
<73> [ ] [ ]
|
||||||
LOAD_ASSERTION_ERROR [X]
|
LOAD_ASSERTION_ERROR [X] [X]
|
||||||
RETURN_GENERATOR [X]
|
RETURN_GENERATOR [X] [X]
|
||||||
<76> [ ]
|
<76> [ ] [ ]
|
||||||
<77> [ ]
|
<77> [ ] [ ]
|
||||||
<78> [ ]
|
<78> [ ] [ ]
|
||||||
<79> [ ]
|
<79> [ ] [ ]
|
||||||
<80> [ ]
|
<80> [ ] [ ]
|
||||||
<81> [ ]
|
<81> [ ] [ ]
|
||||||
LIST_TO_TUPLE [X]
|
LIST_TO_TUPLE [X] [ ]
|
||||||
RETURN_VALUE [X]
|
RETURN_VALUE [X] [X]
|
||||||
IMPORT_STAR [X]
|
IMPORT_STAR [X] [ ]
|
||||||
SETUP_ANNOTATIONS [X]
|
SETUP_ANNOTATIONS [X] [X]
|
||||||
YIELD_VALUE [X]
|
YIELD_VALUE [X] [ ]
|
||||||
ASYNC_GEN_WRAP [X]
|
ASYNC_GEN_WRAP ! [X]
|
||||||
PREP_RERAISE_STAR [X]
|
LOAD_LOCALS ! [X]
|
||||||
POP_EXCEPT [X]
|
PREP_RERAISE_STAR [X] [ ]
|
||||||
STORE_NAME [X]
|
POP_EXCEPT [X] [X]
|
||||||
DELETE_NAME [X]
|
STORE_NAME [X] [X]
|
||||||
UNPACK_SEQUENCE [X]
|
DELETE_NAME [X] [X]
|
||||||
FOR_ITER [X]
|
UNPACK_SEQUENCE [X] [X]
|
||||||
UNPACK_EX [X]
|
FOR_ITER [X] [X]
|
||||||
STORE_ATTR [X]
|
UNPACK_EX [X] [X]
|
||||||
DELETE_ATTR [X]
|
STORE_ATTR [X] [X]
|
||||||
STORE_GLOBAL [X]
|
DELETE_ATTR [X] [X]
|
||||||
DELETE_GLOBAL [X]
|
STORE_GLOBAL [X] [X]
|
||||||
SWAP [X]
|
DELETE_GLOBAL [X] [X]
|
||||||
LOAD_CONST [X]
|
SWAP [X] [X]
|
||||||
LOAD_NAME [X]
|
LOAD_CONST [X] [X]
|
||||||
BUILD_TUPLE [X]
|
LOAD_NAME [X] [X]
|
||||||
BUILD_LIST [X]
|
BUILD_TUPLE [X] [X]
|
||||||
BUILD_SET [X]
|
BUILD_LIST [X] [X]
|
||||||
BUILD_MAP [X]
|
BUILD_SET [X] [X]
|
||||||
LOAD_ATTR [X]
|
BUILD_MAP [X] [X]
|
||||||
COMPARE_OP [X]
|
LOAD_ATTR [X] [X]
|
||||||
IMPORT_NAME [X]
|
COMPARE_OP [X] [X]
|
||||||
IMPORT_FROM [X]
|
IMPORT_NAME [X] [X]
|
||||||
JUMP_FORWARD [X]
|
IMPORT_FROM [X] [X]
|
||||||
JUMP_IF_FALSE_OR_POP [X]
|
JUMP_FORWARD [X] [X]
|
||||||
JUMP_IF_TRUE_OR_POP [X]
|
JUMP_IF_FALSE_OR_POP [X] [ ]
|
||||||
<113> [ ]
|
JUMP_IF_TRUE_OR_POP [X] [ ]
|
||||||
POP_JUMP_FORWARD_IF_FALSE [X]
|
<113> [ ] [ ]
|
||||||
POP_JUMP_FORWARD_IF_TRUE [X]
|
POP_JUMP_FORWARD_IF_FALSE ! [X]
|
||||||
LOAD_GLOBAL [X]
|
POP_JUMP_IF_FALSE ! [X]
|
||||||
IS_OP [X]
|
POP_JUMP_FORWARD_IF_TRUE ! [X]
|
||||||
CONTAINS_OP [X]
|
POP_JUMP_IF_TRUE ! [X]
|
||||||
RERAISE [X]
|
LOAD_GLOBAL [X] [X]
|
||||||
COPY [X]
|
IS_OP [X] [X]
|
||||||
<121> [ ]
|
CONTAINS_OP [X] [X]
|
||||||
BINARY_OP [X]
|
RERAISE [X] [X]
|
||||||
SEND [X]
|
COPY [X] [X]
|
||||||
LOAD_FAST [X]
|
RETURN_CONST [ ] [X]
|
||||||
STORE_FAST [X]
|
BINARY_OP [X] [X]
|
||||||
DELETE_FAST [X]
|
SEND [X] [X]
|
||||||
<127> [ ]
|
LOAD_FAST [X] [X]
|
||||||
POP_JUMP_FORWARD_IF_NOT_NONE [X]
|
STORE_FAST [X] [X]
|
||||||
POP_JUMP_FORWARD_IF_NONE [X]
|
DELETE_FAST [X] [X]
|
||||||
RAISE_VARARGS [X]
|
LOAD_FAST_CHECK [ ] [X]
|
||||||
GET_AWAITABLE [X]
|
POP_JUMP_FORWARD_IF_NOT_NONE ! [X]
|
||||||
MAKE_FUNCTION [X]
|
POP_JUMP_IF_NOT_NONE ! [X]
|
||||||
BUILD_SLICE [X]
|
POP_JUMP_FORWARD_IF_NONE ! [X]
|
||||||
JUMP_BACKWARD_NO_INTERRUPT [X]
|
POP_JUMP_IF_NONE ! [X]
|
||||||
MAKE_CELL [X]
|
RAISE_VARARGS [X] [X]
|
||||||
LOAD_CLOSURE [X]
|
GET_AWAITABLE [X] [X]
|
||||||
LOAD_DEREF [X]
|
MAKE_FUNCTION [X] [X]
|
||||||
STORE_DEREF [X]
|
BUILD_SLICE [X] [X]
|
||||||
DELETE_DEREF [X]
|
JUMP_BACKWARD_NO_INTERRUPT [X] [X]
|
||||||
JUMP_BACKWARD [X]
|
MAKE_CELL [X] [X]
|
||||||
<141> [ ]
|
LOAD_CLOSURE [X] [X]
|
||||||
CALL_FUNCTION_EX [X]
|
LOAD_DEREF [X] [X]
|
||||||
<143> [ ]
|
STORE_DEREF [X] [X]
|
||||||
EXTENDED_ARG [X]
|
DELETE_DEREF [X] [X]
|
||||||
LIST_APPEND [X]
|
JUMP_BACKWARD [X] [X]
|
||||||
SET_ADD [X]
|
LOAD_SUPER_ATTR [ ] [X]
|
||||||
MAP_ADD [X]
|
CALL_FUNCTION_EX [X] [X]
|
||||||
LOAD_CLASSDEREF [X]
|
LOAD_FAST_AND_CLEAR [ ] [X]
|
||||||
COPY_FREE_VARS [X]
|
EXTENDED_ARG [X] [X]
|
||||||
<150> [ ]
|
LIST_APPEND [X] [X]
|
||||||
RESUME [X]
|
SET_ADD [X] [X]
|
||||||
MATCH_CLASS [X]
|
MAP_ADD [X] [X]
|
||||||
<153> [ ]
|
LOAD_CLASSDEREF [X] [ ]
|
||||||
<154> [ ]
|
COPY_FREE_VARS [X] [X]
|
||||||
FORMAT_VALUE [X]
|
YIELD_VALUE [ ] [X]
|
||||||
BUILD_CONST_KEY_MAP [X]
|
RESUME [X] [X]
|
||||||
BUILD_STRING [X]
|
MATCH_CLASS [X] [X]
|
||||||
<158> [ ]
|
<153> [ ] [ ]
|
||||||
<159> [ ]
|
<154> [ ] [ ]
|
||||||
LOAD_METHOD [X]
|
FORMAT_VALUE [X] [X]
|
||||||
<161> [ ]
|
BUILD_CONST_KEY_MAP [X] [X]
|
||||||
LIST_EXTEND [X]
|
BUILD_STRING [X] [X]
|
||||||
SET_UPDATE [X]
|
<158> [ ] [ ]
|
||||||
DICT_MERGE [X]
|
<159> [ ] [ ]
|
||||||
DICT_UPDATE [X]
|
LOAD_METHOD [X] [ ]
|
||||||
PRECALL [X]
|
<161> [ ] [ ]
|
||||||
<167> [ ]
|
LIST_EXTEND [X] [X]
|
||||||
<168> [ ]
|
SET_UPDATE [X] [X]
|
||||||
<169> [ ]
|
DICT_MERGE [X] [X]
|
||||||
<170> [ ]
|
DICT_UPDATE [X] [X]
|
||||||
CALL [X]
|
PRECALL [X] [ ]
|
||||||
KW_NAMES [X]
|
<167> [ ] [ ]
|
||||||
POP_JUMP_BACKWARD_IF_NOT_NONE [X]
|
<168> [ ] [ ]
|
||||||
POP_JUMP_BACKWARD_IF_NONE [X]
|
<169> [ ] [ ]
|
||||||
POP_JUMP_BACKWARD_IF_FALSE [X]
|
<170> [ ] [ ]
|
||||||
POP_JUMP_BACKWARD_IF_TRUE [X]
|
CALL [X] [X]
|
||||||
|
KW_NAMES [X] [X]
|
||||||
|
POP_JUMP_BACKWARD_IF_NOT_NONE ! [X]
|
||||||
|
CALL_INTRINSIC_1 ! [X]
|
||||||
|
POP_JUMP_BACKWARD_IF_NONE ! [X]
|
||||||
|
CALL_INTRINSIC_2 ! [X]
|
||||||
|
POP_JUMP_BACKWARD_IF_FALSE ! [X]
|
||||||
|
LOAD_FROM_DICT_OR_GLOBALS ! [X]
|
||||||
|
POP_JUMP_BACKWARD_IF_TRUE ! [X]
|
||||||
|
LOAD_FROM_DICT_OR_DEREF ! [X]
|
||||||
<177>
|
<177>
|
||||||
<178>
|
<178>
|
||||||
<179>
|
<179>
|
||||||
.
|
.
|
||||||
.
|
.
|
||||||
.
|
.
|
||||||
|
<234>
|
||||||
|
<235>
|
||||||
|
<236>
|
||||||
|
INSTRUMENTED_LOAD_SUPER_ATTR [ ] [X]
|
||||||
|
INSTRUMENTED_POP_JUMP_IF_NONE [ ] [X]
|
||||||
|
INSTRUMENTED_POP_JUMP_IF_NOT_NONE [ ] [X]
|
||||||
|
INSTRUMENTED_RESUME [ ] [X]
|
||||||
|
INSTRUMENTED_CALL [ ] [X]
|
||||||
|
INSTRUMENTED_RETURN_VALUE [ ] [X]
|
||||||
|
INSTRUMENTED_YIELD_VALUE [ ] [X]
|
||||||
|
INSTRUMENTED_CALL_FUNCTION_EX [ ] [X]
|
||||||
|
INSTRUMENTED_JUMP_FORWARD [ ] [X]
|
||||||
|
INSTRUMENTED_JUMP_BACKWARD [ ] [X]
|
||||||
|
INSTRUMENTED_RETURN_CONST [ ] [X]
|
||||||
|
INSTRUMENTED_FOR_ITER [ ] [X]
|
||||||
|
INSTRUMENTED_POP_JUMP_IF_FALSE [ ] [X]
|
||||||
|
INSTRUMENTED_POP_JUMP_IF_TRUE [ ] [X]
|
||||||
|
INSTRUMENTED_END_FOR [ ] [X]
|
||||||
|
INSTRUMENTED_END_SEND [ ] [X]
|
||||||
|
INSTRUMENTED_INSTRUCTION [ ] [X]
|
||||||
|
INSTRUMENTED_LINE [ ] [X]
|
||||||
|
<255>
|
||||||
|
|
||||||
|
|
||||||
|
[Intrinsic 1] 3.12
|
||||||
|
INVALID [X]
|
||||||
|
PRINT [X]
|
||||||
|
IMPORT_STAR [X]
|
||||||
|
STOPITERATION_ERROR [X]
|
||||||
|
ASYNC_GEN_WRAP [X]
|
||||||
|
UNARY_POSITIVE [X]
|
||||||
|
LIST_TO_TUPLE [X]
|
||||||
|
TYPEVAR [X]
|
||||||
|
PARAMSPEC [X]
|
||||||
|
TYPEVARTUPLE [X]
|
||||||
|
SUBSCRIPT_GENERIC [X]
|
||||||
|
TYPEALIAS [X]
|
||||||
|
|
||||||
|
|
||||||
|
[Intrinsic 2] 3.12
|
||||||
|
INVALID [X]
|
||||||
|
PREP_RERAISE_STAR [X]
|
||||||
|
TYPEVAR_WITH_BOUND [X]
|
||||||
|
TYPEVAR_WITH_CONSTRAINTS [X]
|
||||||
|
SET_FUNCTION_TYPE_PARAMS [X]
|
||||||
|
|
||||||
|
|
||||||
1.0 1.3 1.4 1.5 1.6
|
1.0 1.3 1.4 1.5 1.6
|
||||||
|
|||||||
31
bytecode.cpp
31
bytecode.cpp
@@ -38,6 +38,7 @@ DECLARE_PYTHON(3, 8)
|
|||||||
DECLARE_PYTHON(3, 9)
|
DECLARE_PYTHON(3, 9)
|
||||||
DECLARE_PYTHON(3, 10)
|
DECLARE_PYTHON(3, 10)
|
||||||
DECLARE_PYTHON(3, 11)
|
DECLARE_PYTHON(3, 11)
|
||||||
|
DECLARE_PYTHON(3, 12)
|
||||||
|
|
||||||
const char* Pyc::OpcodeName(int opcode)
|
const char* Pyc::OpcodeName(int opcode)
|
||||||
{
|
{
|
||||||
@@ -106,6 +107,7 @@ int Pyc::ByteToOpcode(int maj, int min, int opcode)
|
|||||||
case 9: return python_39_map(opcode);
|
case 9: return python_39_map(opcode);
|
||||||
case 10: return python_310_map(opcode);
|
case 10: return python_310_map(opcode);
|
||||||
case 11: return python_311_map(opcode);
|
case 11: return python_311_map(opcode);
|
||||||
|
case 12: return python_312_map(opcode);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -114,7 +116,8 @@ int Pyc::ByteToOpcode(int maj, int min, int opcode)
|
|||||||
|
|
||||||
bool Pyc::IsConstArg(int opcode)
|
bool Pyc::IsConstArg(int opcode)
|
||||||
{
|
{
|
||||||
return (opcode == Pyc::LOAD_CONST_A) || (opcode == Pyc::RESERVE_FAST_A);
|
return (opcode == Pyc::LOAD_CONST_A) || (opcode == Pyc::RESERVE_FAST_A) ||
|
||||||
|
(opcode == Pyc::RETURN_CONST_A);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Pyc::IsNameArg(int opcode)
|
bool Pyc::IsNameArg(int opcode)
|
||||||
@@ -370,6 +373,22 @@ void bc_disasm(std::ostream& pyc_output, PycRef<PycCode> code, PycModule* mod,
|
|||||||
};
|
};
|
||||||
static const size_t binop_strings_len = sizeof(binop_strings) / sizeof(binop_strings[0]);
|
static const size_t binop_strings_len = sizeof(binop_strings) / sizeof(binop_strings[0]);
|
||||||
|
|
||||||
|
static const char *intrinsic1_names[] = {
|
||||||
|
"INTRINSIC_1_INVALID", "INTRINSIC_PRINT", "INTRINSIC_IMPORT_STAR",
|
||||||
|
"INTRINSIC_STOPITERATION_ERROR", "INTRINSIC_ASYNC_GEN_WRAP",
|
||||||
|
"INTRINSIC_UNARY_POSITIVE", "INTRINSIC_LIST_TO_TUPLE", "INTRINSIC_TYPEVAR",
|
||||||
|
"INTRINSIC_PARAMSPEC", "INTRINSIC_TYPEVARTUPLE",
|
||||||
|
"INTRINSIC_SUBSCRIPT_GENERIC", "INTRINSIC_TYPEALIAS",
|
||||||
|
};
|
||||||
|
static const size_t intrinsic1_names_len = sizeof(intrinsic1_names) / sizeof(intrinsic1_names[0]);
|
||||||
|
|
||||||
|
static const char *intrinsic2_names[] = {
|
||||||
|
"INTRINSIC_2_INVALID", "INTRINSIC_PREP_RERAISE_STAR",
|
||||||
|
"INTRINSIC_TYPEVAR_WITH_BOUND", "INTRINSIC_TYPEVAR_WITH_CONSTRAINTS",
|
||||||
|
"INTRINSIC_SET_FUNCTION_TYPE_PARAMS",
|
||||||
|
};
|
||||||
|
static const size_t intrinsic2_names_len = sizeof(intrinsic2_names) / sizeof(intrinsic2_names[0]);
|
||||||
|
|
||||||
PycBuffer source(code->code()->value(), code->code()->length());
|
PycBuffer source(code->code()->value(), code->code()->length());
|
||||||
|
|
||||||
int opcode, operand;
|
int opcode, operand;
|
||||||
@@ -453,6 +472,16 @@ void bc_disasm(std::ostream& pyc_output, PycRef<PycCode> code, PycModule* mod,
|
|||||||
formatted_print(pyc_output, "%d (%s)", operand, (operand == 0) ? "in"
|
formatted_print(pyc_output, "%d (%s)", operand, (operand == 0) ? "in"
|
||||||
: (operand == 1) ? "not in"
|
: (operand == 1) ? "not in"
|
||||||
: "UNKNOWN");
|
: "UNKNOWN");
|
||||||
|
} else if (opcode == Pyc::CALL_INTRINSIC_1_A) {
|
||||||
|
if (static_cast<size_t>(operand) < intrinsic1_names_len)
|
||||||
|
formatted_print(pyc_output, "%d (%s)", operand, intrinsic1_names[operand]);
|
||||||
|
else
|
||||||
|
formatted_print(pyc_output, "%d (UNKNOWN)", operand);
|
||||||
|
} else if (opcode == Pyc::CALL_INTRINSIC_2_A) {
|
||||||
|
if (static_cast<size_t>(operand) < intrinsic2_names_len)
|
||||||
|
formatted_print(pyc_output, "%d (%s)", operand, intrinsic2_names[operand]);
|
||||||
|
else
|
||||||
|
formatted_print(pyc_output, "%d (UNKNOWN)", operand);
|
||||||
} else {
|
} else {
|
||||||
formatted_print(pyc_output, "%d", operand);
|
formatted_print(pyc_output, "%d", operand);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -111,6 +111,13 @@ OPCODE(BEFORE_WITH)
|
|||||||
OPCODE(RETURN_GENERATOR)
|
OPCODE(RETURN_GENERATOR)
|
||||||
OPCODE(ASYNC_GEN_WRAP)
|
OPCODE(ASYNC_GEN_WRAP)
|
||||||
OPCODE(PREP_RERAISE_STAR)
|
OPCODE(PREP_RERAISE_STAR)
|
||||||
|
OPCODE(INTERPRETER_EXIT)
|
||||||
|
OPCODE(END_FOR)
|
||||||
|
OPCODE(END_SEND)
|
||||||
|
OPCODE(RESERVED)
|
||||||
|
OPCODE(BINARY_SLICE)
|
||||||
|
OPCODE(STORE_SLICE)
|
||||||
|
OPCODE(CLEANUP_THROW)
|
||||||
|
|
||||||
/* Has parameter word */
|
/* Has parameter word */
|
||||||
OPCODE_A_FIRST(STORE_NAME)
|
OPCODE_A_FIRST(STORE_NAME)
|
||||||
@@ -224,3 +231,33 @@ OPCODE_A(POP_JUMP_BACKWARD_IF_NOT_NONE)
|
|||||||
OPCODE_A(POP_JUMP_BACKWARD_IF_NONE)
|
OPCODE_A(POP_JUMP_BACKWARD_IF_NONE)
|
||||||
OPCODE_A(POP_JUMP_BACKWARD_IF_FALSE)
|
OPCODE_A(POP_JUMP_BACKWARD_IF_FALSE)
|
||||||
OPCODE_A(POP_JUMP_BACKWARD_IF_TRUE)
|
OPCODE_A(POP_JUMP_BACKWARD_IF_TRUE)
|
||||||
|
OPCODE_A(RETURN_CONST)
|
||||||
|
OPCODE_A(LOAD_FAST_CHECK)
|
||||||
|
OPCODE_A(POP_JUMP_IF_NOT_NONE)
|
||||||
|
OPCODE_A(POP_JUMP_IF_NONE)
|
||||||
|
OPCODE_A(LOAD_SUPER_ATTR)
|
||||||
|
OPCODE_A(LOAD_FAST_AND_CLEAR)
|
||||||
|
OPCODE_A(YIELD_VALUE)
|
||||||
|
OPCODE_A(CALL_INTRINSIC_1)
|
||||||
|
OPCODE_A(CALL_INTRINSIC_2)
|
||||||
|
OPCODE_A(LOAD_FROM_DICT_OR_GLOBALS)
|
||||||
|
OPCODE_A(LOAD_FROM_DICT_OR_DEREF)
|
||||||
|
|
||||||
|
OPCODE_A(INSTRUMENTED_LOAD_SUPER_ATTR)
|
||||||
|
OPCODE_A(INSTRUMENTED_POP_JUMP_IF_NONE)
|
||||||
|
OPCODE_A(INSTRUMENTED_POP_JUMP_IF_NOT_NONE)
|
||||||
|
OPCODE_A(INSTRUMENTED_RESUME)
|
||||||
|
OPCODE_A(INSTRUMENTED_CALL)
|
||||||
|
OPCODE_A(INSTRUMENTED_RETURN_VALUE)
|
||||||
|
OPCODE_A(INSTRUMENTED_YIELD_VALUE)
|
||||||
|
OPCODE_A(INSTRUMENTED_CALL_FUNCTION_EX)
|
||||||
|
OPCODE_A(INSTRUMENTED_JUMP_FORWARD)
|
||||||
|
OPCODE_A(INSTRUMENTED_JUMP_BACKWARD)
|
||||||
|
OPCODE_A(INSTRUMENTED_RETURN_CONST)
|
||||||
|
OPCODE_A(INSTRUMENTED_FOR_ITER)
|
||||||
|
OPCODE_A(INSTRUMENTED_POP_JUMP_IF_FALSE)
|
||||||
|
OPCODE_A(INSTRUMENTED_POP_JUMP_IF_TRUE)
|
||||||
|
OPCODE_A(INSTRUMENTED_END_FOR)
|
||||||
|
OPCODE_A(INSTRUMENTED_END_SEND)
|
||||||
|
OPCODE_A(INSTRUMENTED_INSTRUCTION)
|
||||||
|
OPCODE_A(INSTRUMENTED_LINE)
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ if not os.path.exists(sys.argv[2]):
|
|||||||
|
|
||||||
maplist = [ 10, 11, 13, 14, 15, 16,
|
maplist = [ 10, 11, 13, 14, 15, 16,
|
||||||
20, 21, 22, 23, 24, 25, 26, 27,
|
20, 21, 22, 23, 24, 25, 26, 27,
|
||||||
30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 310, 311 ]
|
30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 310, 311, 312 ]
|
||||||
|
|
||||||
for mapver in maplist:
|
for mapver in maplist:
|
||||||
infile = open(os.path.join(sys.argv[1], 'python_%d.map' % mapver), 'rt')
|
infile = open(os.path.join(sys.argv[1], 'python_%d.map' % mapver), 'rt')
|
||||||
|
|||||||
129
bytes/python_312.map
Normal file
129
bytes/python_312.map
Normal file
@@ -0,0 +1,129 @@
|
|||||||
|
0 CACHE
|
||||||
|
1 POP_TOP
|
||||||
|
2 PUSH_NULL
|
||||||
|
3 INTERPRETER_EXIT
|
||||||
|
4 END_FOR
|
||||||
|
5 END_SEND
|
||||||
|
9 NOP
|
||||||
|
11 UNARY_NEGATIVE
|
||||||
|
12 UNARY_NOT
|
||||||
|
15 UNARY_INVERT
|
||||||
|
17 RESERVED
|
||||||
|
25 BINARY_SUBSCR
|
||||||
|
26 BINARY_SLICE
|
||||||
|
27 STORE_SLICE
|
||||||
|
30 GET_LEN
|
||||||
|
31 MATCH_MAPPING
|
||||||
|
32 MATCH_SEQUENCE
|
||||||
|
33 MATCH_KEYS
|
||||||
|
35 PUSH_EXC_INFO
|
||||||
|
36 CHECK_EXC_MATCH
|
||||||
|
37 CHECK_EG_MATCH
|
||||||
|
49 WITH_EXCEPT_START
|
||||||
|
50 GET_AITER
|
||||||
|
51 GET_ANEXT
|
||||||
|
52 BEFORE_ASYNC_WITH
|
||||||
|
53 BEFORE_WITH
|
||||||
|
54 END_ASYNC_FOR
|
||||||
|
55 CLEANUP_THROW
|
||||||
|
60 STORE_SUBSCR
|
||||||
|
61 DELETE_SUBSCR
|
||||||
|
68 GET_ITER
|
||||||
|
69 GET_YIELD_FROM_ITER
|
||||||
|
71 LOAD_BUILD_CLASS
|
||||||
|
74 LOAD_ASSERTION_ERROR
|
||||||
|
75 RETURN_GENERATOR
|
||||||
|
83 RETURN_VALUE
|
||||||
|
85 SETUP_ANNOTATIONS
|
||||||
|
87 LOAD_LOCALS
|
||||||
|
89 POP_EXCEPT
|
||||||
|
90 STORE_NAME_A
|
||||||
|
91 DELETE_NAME_A
|
||||||
|
92 UNPACK_SEQUENCE_A
|
||||||
|
93 FOR_ITER_A
|
||||||
|
94 UNPACK_EX_A
|
||||||
|
95 STORE_ATTR_A
|
||||||
|
96 DELETE_ATTR_A
|
||||||
|
97 STORE_GLOBAL_A
|
||||||
|
98 DELETE_GLOBAL_A
|
||||||
|
99 SWAP_A
|
||||||
|
100 LOAD_CONST_A
|
||||||
|
101 LOAD_NAME_A
|
||||||
|
102 BUILD_TUPLE_A
|
||||||
|
103 BUILD_LIST_A
|
||||||
|
104 BUILD_SET_A
|
||||||
|
105 BUILD_MAP_A
|
||||||
|
106 LOAD_ATTR_A
|
||||||
|
107 COMPARE_OP_A
|
||||||
|
108 IMPORT_NAME_A
|
||||||
|
109 IMPORT_FROM_A
|
||||||
|
110 JUMP_FORWARD_A
|
||||||
|
114 POP_JUMP_IF_FALSE_A
|
||||||
|
115 POP_JUMP_IF_TRUE_A
|
||||||
|
116 LOAD_GLOBAL_A
|
||||||
|
117 IS_OP_A
|
||||||
|
118 CONTAINS_OP_A
|
||||||
|
119 RERAISE_A
|
||||||
|
120 COPY_A
|
||||||
|
121 RETURN_CONST_A
|
||||||
|
122 BINARY_OP_A
|
||||||
|
123 SEND_A
|
||||||
|
124 LOAD_FAST_A
|
||||||
|
125 STORE_FAST_A
|
||||||
|
126 DELETE_FAST_A
|
||||||
|
127 LOAD_FAST_CHECK_A
|
||||||
|
128 POP_JUMP_IF_NOT_NONE_A
|
||||||
|
129 POP_JUMP_IF_NONE_A
|
||||||
|
130 RAISE_VARARGS_A
|
||||||
|
131 GET_AWAITABLE_A
|
||||||
|
132 MAKE_FUNCTION_A
|
||||||
|
133 BUILD_SLICE_A
|
||||||
|
134 JUMP_BACKWARD_NO_INTERRUPT_A
|
||||||
|
135 MAKE_CELL_A
|
||||||
|
136 LOAD_CLOSURE_A
|
||||||
|
137 LOAD_DEREF_A
|
||||||
|
138 STORE_DEREF_A
|
||||||
|
139 DELETE_DEREF_A
|
||||||
|
140 JUMP_BACKWARD_A
|
||||||
|
141 LOAD_SUPER_ATTR_A
|
||||||
|
142 CALL_FUNCTION_EX_A
|
||||||
|
143 LOAD_FAST_AND_CLEAR_A
|
||||||
|
144 EXTENDED_ARG_A
|
||||||
|
145 LIST_APPEND_A
|
||||||
|
146 SET_ADD_A
|
||||||
|
147 MAP_ADD_A
|
||||||
|
149 COPY_FREE_VARS_A
|
||||||
|
150 YIELD_VALUE_A
|
||||||
|
151 RESUME_A
|
||||||
|
152 MATCH_CLASS_A
|
||||||
|
155 FORMAT_VALUE_A
|
||||||
|
156 BUILD_CONST_KEY_MAP_A
|
||||||
|
157 BUILD_STRING_A
|
||||||
|
162 LIST_EXTEND_A
|
||||||
|
163 SET_UPDATE_A
|
||||||
|
164 DICT_MERGE_A
|
||||||
|
165 DICT_UPDATE_A
|
||||||
|
171 CALL_A
|
||||||
|
172 KW_NAMES_A
|
||||||
|
173 CALL_INTRINSIC_1_A
|
||||||
|
174 CALL_INTRINSIC_2_A
|
||||||
|
175 LOAD_FROM_DICT_OR_GLOBALS_A
|
||||||
|
176 LOAD_FROM_DICT_OR_DEREF_A
|
||||||
|
237 INSTRUMENTED_LOAD_SUPER_ATTR_A
|
||||||
|
238 INSTRUMENTED_POP_JUMP_IF_NONE_A
|
||||||
|
239 INSTRUMENTED_POP_JUMP_IF_NOT_NONE_A
|
||||||
|
240 INSTRUMENTED_RESUME_A
|
||||||
|
241 INSTRUMENTED_CALL_A
|
||||||
|
242 INSTRUMENTED_RETURN_VALUE_A
|
||||||
|
243 INSTRUMENTED_YIELD_VALUE_A
|
||||||
|
244 INSTRUMENTED_CALL_FUNCTION_EX_A
|
||||||
|
245 INSTRUMENTED_JUMP_FORWARD_A
|
||||||
|
246 INSTRUMENTED_JUMP_BACKWARD_A
|
||||||
|
247 INSTRUMENTED_RETURN_CONST_A
|
||||||
|
248 INSTRUMENTED_FOR_ITER_A
|
||||||
|
249 INSTRUMENTED_POP_JUMP_IF_FALSE_A
|
||||||
|
250 INSTRUMENTED_POP_JUMP_IF_TRUE_A
|
||||||
|
251 INSTRUMENTED_END_FOR_A
|
||||||
|
252 INSTRUMENTED_END_SEND_A
|
||||||
|
253 INSTRUMENTED_INSTRUCTION_A
|
||||||
|
254 INSTRUMENTED_LINE_A
|
||||||
@@ -170,6 +170,12 @@ void PycModule::setVersion(unsigned int magic)
|
|||||||
m_unicode = true;
|
m_unicode = true;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case MAGIC_3_12:
|
||||||
|
m_maj = 3;
|
||||||
|
m_min = 12;
|
||||||
|
m_unicode = true;
|
||||||
|
break;
|
||||||
|
|
||||||
/* Bad Magic detected */
|
/* Bad Magic detected */
|
||||||
default:
|
default:
|
||||||
m_maj = -1;
|
m_maj = -1;
|
||||||
@@ -185,7 +191,7 @@ bool PycModule::isSupportedVersion(int major, int minor)
|
|||||||
case 2:
|
case 2:
|
||||||
return (minor >= 0 && minor <= 7);
|
return (minor >= 0 && minor <= 7);
|
||||||
case 3:
|
case 3:
|
||||||
return (minor >= 0 && minor <= 11);
|
return (minor >= 0 && minor <= 12);
|
||||||
default:
|
default:
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ enum PycMagic {
|
|||||||
MAGIC_3_9 = 0x0A0D0D61,
|
MAGIC_3_9 = 0x0A0D0D61,
|
||||||
MAGIC_3_10 = 0x0A0D0D6F,
|
MAGIC_3_10 = 0x0A0D0D6F,
|
||||||
MAGIC_3_11 = 0x0A0D0DA7,
|
MAGIC_3_11 = 0x0A0D0DA7,
|
||||||
|
MAGIC_3_12 = 0x0A0D0DCB,
|
||||||
|
|
||||||
INVALID = 0,
|
INVALID = 0,
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -130,7 +130,7 @@ void PycString::print(std::ostream &pyc_output, PycModule* mod, bool triple,
|
|||||||
// Unicode stored as UTF-8... Let the stream interpret it
|
// Unicode stored as UTF-8... Let the stream interpret it
|
||||||
pyc_output << ch;
|
pyc_output << ch;
|
||||||
} else {
|
} else {
|
||||||
formatted_print(pyc_output, "\\x%x", (ch & 0xFF));
|
formatted_print(pyc_output, "\\x%02x", (ch & 0xFF));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (!useQuotes && ch == '\'')
|
if (!useQuotes && ch == '\'')
|
||||||
|
|||||||
@@ -30,11 +30,12 @@ PYVERS = {
|
|||||||
'3.4': '3.4.10',
|
'3.4': '3.4.10',
|
||||||
'3.5': '3.5.10',
|
'3.5': '3.5.10',
|
||||||
'3.6': '3.6.15',
|
'3.6': '3.6.15',
|
||||||
'3.7': '3.7.16',
|
'3.7': '3.7.17',
|
||||||
'3.8': '3.8.16',
|
'3.8': '3.8.18',
|
||||||
'3.9': '3.9.16',
|
'3.9': '3.9.18',
|
||||||
'3.10': '3.10.9',
|
'3.10': '3.10.13',
|
||||||
'3.11': '3.11.1',
|
'3.11': '3.11.6',
|
||||||
|
'3.12': '3.12.0',
|
||||||
}
|
}
|
||||||
|
|
||||||
OLD_PYTHONS = ('1.0', '1.1', '1.2', '1.3', '1.4', '1.5')
|
OLD_PYTHONS = ('1.0', '1.1', '1.2', '1.3', '1.4', '1.5')
|
||||||
@@ -54,6 +55,7 @@ PYVER_CONTAINERS = {
|
|||||||
'3.9',
|
'3.9',
|
||||||
'3.10',
|
'3.10',
|
||||||
'3.11',
|
'3.11',
|
||||||
|
'3.12',
|
||||||
}
|
}
|
||||||
CONTAINER_EXES = ['podman', 'docker']
|
CONTAINER_EXES = ['podman', 'docker']
|
||||||
CONTAINER_EXE_EXTRA_ARGS = {
|
CONTAINER_EXE_EXTRA_ARGS = {
|
||||||
|
|||||||
BIN
tests/compiled/simple_const.3.12.pyc
Normal file
BIN
tests/compiled/simple_const.3.12.pyc
Normal file
Binary file not shown.
Reference in New Issue
Block a user