Implement Python 3.8 && 3.9 try-except-finally logic#493
Implement Python 3.8 && 3.9 try-except-finally logic#493Levak wants to merge 1 commit intozrax:masterfrom
Conversation
- Add tests for simple cases of try-except-finally; - Implement `JUMP_IF_NOT_EXC_MATCH_A` with a fake `CMP_EXCEPTION` followed by a `POP_JUMP_IF_TRUE`; - Implement `BEGIN_FINALLY` with a fake `LOAD_CONST_A None`; - Implement Python 3.8+ specific `SETUP_FINALLY_A` handling both EXCEPT and FINALLY cases. We guess which is which by looking at the targetted block that seems to either be a POP_TOP or a DUP_TOP in the case of an EXCEPT block; - Implement RERAISE with a fake END_FINALLY; - In Python 3.9+, skip the duplicated code from the FINALLY blocks with a jump in bytecode and a fake `END_FINALLY`.
|
Fantastic update! I think this one works the best so far. There are still a few I'm not able to resolve, but I'm reviewing everyone’s repos to get more insights. Unsupported opcode: LOAD_ASSERTION_ERROR |
|
was it merged? |
|
I'm getting a crash on this PR's branch that doesn't happen on master... On master: $ ./build/pycdc install.pyc -o install.py
Unsupported opcode: JUMP_IF_NOT_EXC_MATCH (210)
$ echo $?
0On this PR: $ ./build/pycdc install.pyc -o install.py
fish: Job 1, './build/pycdc install.pyc -o in…' terminated by signal SIGSEGV (Address boundary error)gdb backtrace$ gdb -ex run --args ./build/pycdc install.pyc -o install.py
Reading symbols from ./build/pycdc...
Starting program: /tmp/pycdc/build/pycdc install.pyc -o install.py
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/usr/lib/libthread_db.so.1".
Program received signal SIGSEGV, Segmentation fault.
0x00005555555771c5 in PycRef<ASTBlock>::~PycRef (this=0x1f8) at /tmp/pycdc/pyc_object.h:30
30 if (m_obj)
(gdb) bt full
#0 0x00005555555771c5 in PycRef<ASTBlock>::~PycRef (this=0x1f8) at /tmp/pycdc/pyc_object.h:30
No locals.
#1 std::__new_allocator<PycRef<ASTBlock> >::destroy<PycRef<ASTBlock> > (this=0x7fffffffd6d0, __p=0x1f8) at /usr/include/c++/15.1.1/bits/new_allocator.h:198
No locals.
#2 std::allocator_traits<std::allocator<PycRef<ASTBlock> > >::destroy<PycRef<ASTBlock> > (__a=..., __p=0x1f8) at /usr/include/c++/15.1.1/bits/alloc_traits.h:696
No locals.
#3 std::deque<PycRef<ASTBlock>, std::allocator<PycRef<ASTBlock> > >::_M_pop_back_aux (this=0x7fffffffd6d0) at /usr/include/c++/15.1.1/bits/deque.tcc:566
No locals.
#4 std::deque<PycRef<ASTBlock>, std::allocator<PycRef<ASTBlock> > >::pop_back (this=0x7fffffffd6d0) at /usr/include/c++/15.1.1/bits/stl_deque.h:1675
No locals.
#5 std::stack<PycRef<ASTBlock>, std::deque<PycRef<ASTBlock>, std::allocator<PycRef<ASTBlock> > > >::pop (this=0x7fffffffd6d0) at /usr/include/c++/15.1.1/bits/stl_stack.h:334
No locals.
#6 BuildFromCode (code=..., mod=mod@entry=0x7fffffffd9f0) at /tmp/pycdc/ASTree.cpp:1332
offs = 10
prev = {m_obj = 0x5555555cba60}
nil = {m_obj = 0x0}
push = <optimized out>
source = {<PycData> = {_vptr.PycData = 0x5555555b5480 <vtable for PycBuffer+16>}, m_buffer = 0x5555555cc860 "d", m_size = 970, m_pos = 396}
stack = {m_stack = std::vector of length 10, capacity 10 = {{m_obj = 0x0}, {m_obj = 0x0}, {m_obj = 0x0}, {m_obj = 0x0}, {m_obj = 0x0}, {m_obj = 0x0}, {m_obj = 0x0}, {m_obj = 0x0}, {
m_obj = 0x0}, {m_obj = 0x0}}, m_ptr = <optimized out>}
stack_hist = <optimized out>
blocks = <optimized out>
defblock = <optimized out>
curblock = {m_obj = 0x5555555cba60}
opcode = 145
operand = 5
curpos = <optimized out>
pos = 396
unpack = 0
else_pop = <optimized out>
variable_annotations = false
#7 0x0000555555592e4d in decompyle (code=..., mod=mod@entry=0x7fffffffd9f0, pyc_output=...) at /tmp/pycdc/ASTree.cpp:3452
source = <optimized out>
clean = <optimized out>
part1clean = <optimized out>
#8 0x00005555555685fe in main (argc=<optimized out>, argv=<optimized out>) at /tmp/pycdc/pycdc.cpp:97
infile = <optimized out>
marshalled = <optimized out>
version = <optimized out>
pyc_output = <optimized out>
out_file = {<std::basic_ostream<char, std::char_traits<char> >> = {<std::basic_ios<char, std::char_traits<char> >> = {<std::ios_base> = {
_vptr.ios_base = 0x7ffff7e88d88 <vtable for std::basic_ofstream<char, std::char_traits<char> >+64>, static boolalpha = std::_S_boolalpha, static dec = std::_S_dec,
static fixed = std::_S_fixed, static hex = std::_S_hex, static internal = std::_S_internal, static left = std::_S_left, static oct = std::_S_oct,
static right = std::_S_right, static scientific = std::_S_scientific, static showbase = std::_S_showbase, static showpoint = std::_S_showpoint,
static showpos = std::_S_showpos, static skipws = std::_S_skipws, static unitbuf = std::_S_unitbuf, static uppercase = std::_S_uppercase,
static adjustfield = std::_S_adjustfield, static basefield = std::_S_basefield, static floatfield = std::_S_floatfield, static badbit = std::_S_badbit,
static eofbit = std::_S_eofbit, static failbit = std::_S_failbit, static goodbit = std::_S_goodbit, static app = std::_S_app, static ate = std::_S_ate,
static binary = std::_S_bin, static in = std::_S_in, static out = std::_S_out, static trunc = std::_S_trunc, static __noreplace = std::_S_noreplace,
static beg = std::_S_beg, static cur = std::_S_cur, static end = std::_S_end, _M_precision = 6, _M_width = 0, _M_flags = 4098, _M_exception = std::_S_goodbit,
_M_streambuf_state = std::_S_goodbit, _M_callbacks = 0x0, _M_word_zero = {_M_pword = 0x0, _M_iword = 0}, _M_local_word = {{_M_pword = 0x0, _M_iword = 0}, {_M_pword = 0x0,
_M_iword = 0}, {_M_pword = 0x0, _M_iword = 0}, {_M_pword = 0x0, _M_iword = 0}, {_M_pword = 0x0, _M_iword = 0}, {_M_pword = 0x0, _M_iword = 0}, {_M_pword = 0x0,
_M_iword = 0}, {_M_pword = 0x0, _M_iword = 0}}, _M_word_size = 8, _M_word = 0x7fffffffdbb8, _M_ios_locale = std::locale = "C"}, _M_tie = 0x0, _M_fill = 32 ' ',
_M_fill_init = true, _M_streambuf = 0x7fffffffda88, _M_ctype = 0x7ffff7e91920 <(anonymous namespace)::ctype_c>,
_M_num_put = 0x7ffff7e918b0 <(anonymous namespace)::num_put_c>, _M_num_get = 0x7ffff7e918c0 <(anonymous namespace)::num_get_c>},
_vptr.basic_ostream = 0x7ffff7e88d60 <vtable for std::basic_ofstream<char, std::char_traits<char> >+24>}, _M_filebuf = {<std::basic_streambuf<char, std::char_traits<char> >> = {
_vptr.basic_streambuf = 0x7ffff7e88ba8 <vtable for std::basic_filebuf<char, std::char_traits<char> >+16>,
_M_in_beg = 0x5555555c9530 "# Source Generated with Decompyle++\n# File: install.pyc (Python 3.10)\n\n",
_M_in_cur = 0x5555555c9530 "# Source Generated with Decompyle++\n# File: install.pyc (Python 3.10)\n\n",
_M_in_end = 0x5555555c9530 "# Source Generated with Decompyle++\n# File: install.pyc (Python 3.10)\n\n",
_M_out_beg = 0x5555555c9530 "# Source Generated with Decompyle++\n# File: install.pyc (Python 3.10)\n\n", _M_out_cur = 0x5555555c9577 "", _M_out_end = 0x5555555cb52f "",
_M_buf_locale = std::locale = "C"}, _M_lock = {__data = {__lock = 0, __count = 0, __owner = 0, __nusers = 0, __kind = 0, __spins = 0, __elision = 0, __list = {__prev = 0x0,
__next = 0x0}}, __size = '\000' <repeats 39 times>, __align = 0}, _M_file = {_M_cfile = 0x5555555c9350, _M_cfile_created = true}, _M_mode = std::_S_out, _M_state_beg = {
__count = 0, __value = {__wch = 0, __wchb = "\000\000\000"}}, _M_state_cur = {__count = 0, __value = {__wch = 0, __wchb = "\000\000\000"}}, _M_state_last = {__count = 0,
__value = {__wch = 0, __wchb = "\000\000\000"}}, _M_buf = 0x5555555c9530 "# Source Generated with Decompyle++\n# File: install.pyc (Python 3.10)\n\n", _M_buf_size = 8192,
_M_buf_allocated = true, _M_reading = false, _M_writing = true, _M_pback = 0 '\000', _M_pback_cur_save = 0x0, _M_pback_end_save = 0x0, _M_pback_init = false,
_M_codecvt = 0x7ffff7e91890 <(anonymous namespace)::codecvt_c>, _M_ext_buf = 0x0, _M_ext_buf_size = 0, _M_ext_next = 0x0, _M_ext_end = 0x0}}
mod = {m_maj = 3, m_min = 10, m_unicode = true, m_code = {m_obj = 0x5555555cc730}, m_interns = std::vector of length 345, capacity 512 = {{m_obj = 0x5555555cd010}, {
m_obj = 0x5555555cd120}, {m_obj = 0x5555555cd180}, {m_obj = 0x5555555cd1c0}, {m_obj = 0x5555555cd460}, {m_obj = 0x5555555ce1a0}, {m_obj = 0x5555555ce1e0}, {
m_obj = 0x5555555ce220}, {m_obj = 0x5555555ce310}, {m_obj = 0x5555555ce640}, {m_obj = 0x5555555cea40}, {m_obj = 0x5555555cea80}, {m_obj = 0x5555555ceed0}, {
m_obj = 0x5555555cf0a0}, {m_obj = 0x5555555cf280}, {m_obj = 0x5555555cf2c0}, {m_obj = 0x5555555cf600}, {m_obj = 0x5555555cf640}, {m_obj = 0x5555555cf680}, {
m_obj = 0x5555555cf6c0}, {m_obj = 0x5555555cf700}, {m_obj = 0x5555555cf7a0}, {m_obj = 0x5555555cf7e0}, {m_obj = 0x5555555cf820}, {m_obj = 0x5555555cf970}, {
m_obj = 0x5555555cf9b0}, {m_obj = 0x5555555cf9f0}, {m_obj = 0x5555555cfa30}, {m_obj = 0x5555555cfa70}, {m_obj = 0x5555555cfab0}, {m_obj = 0x5555555cfaf0}, {
m_obj = 0x5555555cfb30}, {m_obj = 0x5555555cfb70}, {m_obj = 0x5555555cfbb0}, {m_obj = 0x5555555cfc70}, {m_obj = 0x5555555cfcb0}, {m_obj = 0x5555555cfcf0}, {
m_obj = 0x5555555cfd30}, {m_obj = 0x5555555cfd70}, {m_obj = 0x5555555cfe70}, {m_obj = 0x5555555d0170}, {m_obj = 0x5555555d0250}, {m_obj = 0x5555555d0290}, {
m_obj = 0x5555555d02d0}, {m_obj = 0x5555555d0340}, {m_obj = 0x5555555d0380}, {m_obj = 0x5555555d03c0}, {m_obj = 0x5555555d0400}, {m_obj = 0x5555555d0440}, {
m_obj = 0x5555555d0480}, {m_obj = 0x5555555d0530}, {m_obj = 0x5555555d08a0}, {m_obj = 0x5555555d08e0}, {m_obj = 0x5555555d1130}, {m_obj = 0x5555555d11b0}, {
m_obj = 0x5555555d1440}, {m_obj = 0x5555555d1480}, {m_obj = 0x5555555d1530}, {m_obj = 0x5555555d1570}, {m_obj = 0x5555555d15b0}, {m_obj = 0x5555555d1630}, {
m_obj = 0x5555555d19a0}, {m_obj = 0x5555555d19e0}, {m_obj = 0x5555555d1a20}, {m_obj = 0x5555555d1a60}, {m_obj = 0x5555555d1aa0}, {m_obj = 0x5555555d1ae0}, {
m_obj = 0x5555555d1b20}, {m_obj = 0x5555555d1b60}, {m_obj = 0x5555555d1ba0}, {m_obj = 0x5555555d1be0}, {m_obj = 0x5555555d1c80}, {m_obj = 0x5555555d1d00}, {
m_obj = 0x5555555d20c0}, {m_obj = 0x5555555d2220}, {m_obj = 0x5555555d2260}, {m_obj = 0x5555555d22a0}, {m_obj = 0x5555555d22e0}, {m_obj = 0x5555555d23c0}, {
m_obj = 0x5555555d2440}, {m_obj = 0x5555555d28f0}, {m_obj = 0x5555555d2930}, {m_obj = 0x5555555d29d0}, {m_obj = 0x5555555d2a10}, {m_obj = 0x5555555d2a90}, {
m_obj = 0x5555555d2c60}, {m_obj = 0x5555555d2ce0}, {m_obj = 0x5555555d30a0}, {m_obj = 0x5555555d30e0}, {m_obj = 0x5555555d3120}, {m_obj = 0x5555555d3160}, {
m_obj = 0x5555555d3200}, {m_obj = 0x5555555d3240}, {m_obj = 0x5555555d32c0}, {m_obj = 0x5555555d3660}, {m_obj = 0x5555555d3750}, {m_obj = 0x5555555d3790}, {
m_obj = 0x5555555d37d0}, {m_obj = 0x5555555d3810}, {m_obj = 0x5555555d3850}, {m_obj = 0x5555555d3890}, {m_obj = 0x5555555d3970}, {m_obj = 0x5555555d3d30}, {
m_obj = 0x5555555d3d70}, {m_obj = 0x5555555d3db0}, {m_obj = 0x5555555d3e90}, {m_obj = 0x5555555d3ed0}, {m_obj = 0x5555555d3f10}, {m_obj = 0x5555555d3f50}, {
m_obj = 0x5555555d3fd0}, {m_obj = 0x5555555d43d0}, {m_obj = 0x5555555d4600}, {m_obj = 0x5555555d4640}, {m_obj = 0x5555555d4680}, {m_obj = 0x5555555d4730}, {
m_obj = 0x5555555d4770}, {m_obj = 0x5555555d47e0}, {m_obj = 0x5555555d4890}, {m_obj = 0x5555555d4e40}, {m_obj = 0x5555555d4e80}, {m_obj = 0x5555555d4f00}, {
m_obj = 0x5555555d0e10}, {m_obj = 0x5555555d0ed0}, {m_obj = 0x5555555d0f10}, {m_obj = 0x5555555d0f50}, {m_obj = 0x5555555d0f90}, {m_obj = 0x5555555d1010}, {
m_obj = 0x5555555d6b70}, {m_obj = 0x5555555d6bf0}, {m_obj = 0x5555555d78f0}, {m_obj = 0x5555555d7ea0}, {m_obj = 0x5555555d7fb0}, {m_obj = 0x5555555d88c0}, {
m_obj = 0x5555555d8900}, {m_obj = 0x5555555d8970}, {m_obj = 0x5555555d89b0}, {m_obj = 0x5555555d8a20}, {m_obj = 0x5555555d8a60}, {m_obj = 0x5555555d8aa0}, {
m_obj = 0x5555555d8ae0}, {m_obj = 0x5555555d8b20}, {m_obj = 0x5555555d8b60}, {m_obj = 0x5555555d8ba0}, {m_obj = 0x5555555d8be0}, {m_obj = 0x5555555d8ca0}, {
m_obj = 0x5555555d8ce0}, {m_obj = 0x5555555d8d20}, {m_obj = 0x5555555d8d60}, {m_obj = 0x5555555d8de0}, {m_obj = 0x5555555d9390}, {m_obj = 0x5555555d9670}, {
m_obj = 0x5555555d96b0}, {m_obj = 0x5555555d96f0}, {m_obj = 0x5555555d9760}, {m_obj = 0x5555555d97a0}, {m_obj = 0x5555555d97e0}, {m_obj = 0x5555555d9820}, {
m_obj = 0x5555555d9860}, {m_obj = 0x5555555d9910}, {m_obj = 0x5555555d9950}, {m_obj = 0x5555555d99d0}, {m_obj = 0x5555555d9e00}, {m_obj = 0x5555555d9f10}, {
m_obj = 0x5555555da3d0}, {m_obj = 0x5555555da410}, {m_obj = 0x5555555da450}, {m_obj = 0x5555555da490}, {m_obj = 0x5555555da570}, {m_obj = 0x5555555da5b0}, {
m_obj = 0x5555555da5f0}, {m_obj = 0x5555555da730}, {m_obj = 0x5555555da770}, {m_obj = 0x5555555da7b0}, {m_obj = 0x5555555da7f0}, {m_obj = 0x5555555da830}, {
m_obj = 0x5555555da870}, {m_obj = 0x5555555da8e0}, {m_obj = 0x5555555da950}, {m_obj = 0x5555555da990}, {m_obj = 0x5555555daa00}, {m_obj = 0x5555555daad0}, {
m_obj = 0x5555555dab50}, {m_obj = 0x5555555db0b0}, {m_obj = 0x5555555db0f0}, {m_obj = 0x5555555db130}, {m_obj = 0x5555555db170}, {m_obj = 0x5555555db1b0}, {
m_obj = 0x5555555db230}, {m_obj = 0x5555555db270}, {m_obj = 0x5555555db2b0}, {m_obj = 0x5555555db310}, {m_obj = 0x5555555db350}, {m_obj = 0x5555555db390}, {
m_obj = 0x5555555db520}, {m_obj = 0x5555555db560}, {m_obj = 0x5555555db5a0}, {m_obj = 0x5555555db610}, {m_obj = 0x5555555db6e0}, {m_obj = 0x5555555dbe70}, {
m_obj = 0x5555555dbef0}...}, m_refs = std::vector of length 759, capacity 1024 = {{m_obj = 0x5555555cc730}, {m_obj = 0x5555555cc800}, {m_obj = 0x5555555cc7e0}, {
m_obj = 0x5555555ccfd0}, {m_obj = 0x5555555cd010}, {m_obj = 0x5555555cd0c0}, {m_obj = 0x5555555cd120}, {m_obj = 0x5555555cd180}, {m_obj = 0x5555555cd1c0}, {
m_obj = 0x5555555cd290}, {m_obj = 0x5555555cd300}, {m_obj = 0x5555555cd340}, {m_obj = 0x5555555cd3b0}, {m_obj = 0x5555555cd3f0}, {m_obj = 0x5555555cd460}, {
m_obj = 0x5555555cd4a0}, {m_obj = 0x5555555cd4e0}, {m_obj = 0x5555555cd660}, {m_obj = 0x5555555cd6d0}, {m_obj = 0x5555555cd710}, {m_obj = 0x5555555cd780}, {
m_obj = 0x5555555cd7f0}, {m_obj = 0x5555555cd860}, {m_obj = 0x5555555cd8a0}, {m_obj = 0x5555555cd910}, {m_obj = 0x5555555cd980}, {m_obj = 0x5555555cd9f0}, {
m_obj = 0x5555555cda60}, {m_obj = 0x5555555cdad0}, {m_obj = 0x5555555cdb10}, {m_obj = 0x5555555cdb50}, {m_obj = 0x5555555cdb90}, {m_obj = 0x5555555cdc00}, {
m_obj = 0x5555555cde80}, {m_obj = 0x5555555cdef0}, {m_obj = 0x5555555cdf30}, {m_obj = 0x5555555cdf70}, {m_obj = 0x5555555cdff0}, {m_obj = 0x5555555ce060}, {
m_obj = 0x5555555ce0d0}, {m_obj = 0x5555555ce160}, {m_obj = 0x5555555ce1a0}, {m_obj = 0x5555555ce1e0}, {m_obj = 0x5555555ce220}, {m_obj = 0x5555555ce260}, {
m_obj = 0x5555555ce2a0}, {m_obj = 0x5555555ce310}, {m_obj = 0x5555555ce350}, {m_obj = 0x5555555ce3f0}, {m_obj = 0x5555555ce460}, {m_obj = 0x5555555ce4e0}, {
m_obj = 0x5555555ce520}, {m_obj = 0x5555555ce640}, {m_obj = 0x5555555ce680}, {m_obj = 0x5555555ce700}, {m_obj = 0x5555555ce740}, {m_obj = 0x5555555ce7b0}, {
m_obj = 0x5555555ce7f0}, {m_obj = 0x5555555ce830}, {m_obj = 0x5555555ce870}, {m_obj = 0x5555555ce8f0}, {m_obj = 0x5555555ce960}, {m_obj = 0x5555555ce9d0}, {
m_obj = 0x5555555cea40}, {m_obj = 0x5555555cea80}, {m_obj = 0x5555555ceed0}, {m_obj = 0x5555555cef10}, {m_obj = 0x5555555cef30}, {m_obj = 0x5555555cefa0}, {
m_obj = 0x5555555cf030}, {m_obj = 0x5555555cf0a0}, {m_obj = 0x5555555cf0e0}, {m_obj = 0x5555555cf1a0}, {m_obj = 0x5555555cf240}, {m_obj = 0x5555555cf280}, {
m_obj = 0x5555555cf2c0}, {m_obj = 0x5555555cf3b0}, {m_obj = 0x5555555cf550}, {m_obj = 0x5555555cf590}, {m_obj = 0x5555555cf600}, {m_obj = 0x5555555cf640}, {
m_obj = 0x5555555cf680}, {m_obj = 0x5555555cf6c0}, {m_obj = 0x5555555cf700}, {m_obj = 0x5555555cf740}, {m_obj = 0x5555555cf7a0}, {m_obj = 0x5555555cf7e0}, {
m_obj = 0x5555555cf820}, {m_obj = 0x5555555cf860}, {m_obj = 0x5555555cf8a0}, {m_obj = 0x5555555cf8c0}, {m_obj = 0x5555555cf970}, {m_obj = 0x5555555cf9b0}, {
m_obj = 0x5555555cf9f0}, {m_obj = 0x5555555cfa30}, {m_obj = 0x5555555cfa70}, {m_obj = 0x5555555cfab0}, {m_obj = 0x5555555cfaf0}, {m_obj = 0x5555555cfb30}, {
m_obj = 0x5555555cfb70}, {m_obj = 0x5555555cfbb0}, {m_obj = 0x5555555cfbf0}, {m_obj = 0x5555555cfc70}, {m_obj = 0x5555555cfcb0}, {m_obj = 0x5555555cfcf0}, {
m_obj = 0x5555555cfd30}, {m_obj = 0x5555555cfd70}, {m_obj = 0x5555555cfdf0}, {m_obj = 0x5555555cfe30}, {m_obj = 0x5555555cfe70}, {m_obj = 0x5555555cfef0}, {
m_obj = 0x5555555d0070}, {m_obj = 0x5555555d0170}, {m_obj = 0x5555555d01b0}, {m_obj = 0x5555555d0250}, {m_obj = 0x5555555d0290}, {m_obj = 0x5555555d02d0}, {
m_obj = 0x5555555d0340}, {m_obj = 0x5555555d0380}, {m_obj = 0x5555555d03c0}, {m_obj = 0x5555555d0400}, {m_obj = 0x5555555d0440}, {m_obj = 0x5555555d0480}, {
m_obj = 0x5555555d0530}, {m_obj = 0x5555555d05e0}, {m_obj = 0x5555555d0740}, {m_obj = 0x5555555d0840}, {m_obj = 0x5555555d08a0}, {m_obj = 0x5555555d08e0}, {
m_obj = 0x5555555d1130}, {m_obj = 0x5555555d1170}, {m_obj = 0x5555555d11b0}, {m_obj = 0x5555555d11f0}, {m_obj = 0x5555555d1230}, {m_obj = 0x5555555d1270}, {
m_obj = 0x5555555d1290}, {m_obj = 0x5555555d12d0}, {m_obj = 0x5555555d1310}, {m_obj = 0x5555555d1350}, {m_obj = 0x5555555d13c0}, {m_obj = 0x5555555d1440}, {
m_obj = 0x5555555d1480}, {m_obj = 0x5555555d14c0}, {m_obj = 0x5555555d1530}, {m_obj = 0x5555555d1570}, {m_obj = 0x5555555d15b0}, {m_obj = 0x5555555d1630}, {
m_obj = 0x5555555d16b0}, {m_obj = 0x5555555d1820}, {m_obj = 0x5555555d1900}, {m_obj = 0x5555555d19a0}, {m_obj = 0x5555555d19e0}, {m_obj = 0x5555555d1a20}, {
m_obj = 0x5555555d1a60}, {m_obj = 0x5555555d1aa0}, {m_obj = 0x5555555d1ae0}, {m_obj = 0x5555555d1b20}, {m_obj = 0x5555555d1b60}, {m_obj = 0x5555555d1ba0}, {
m_obj = 0x5555555d1be0}, {m_obj = 0x5555555d1c20}, {m_obj = 0x5555555d1c80}, {m_obj = 0x5555555d1d00}, {m_obj = 0x5555555d1db0}, {m_obj = 0x5555555d1ee0}, {
m_obj = 0x5555555d2080}, {m_obj = 0x5555555d20c0}, {m_obj = 0x5555555d2100}, {m_obj = 0x5555555d2170}, {m_obj = 0x5555555d2220}, {m_obj = 0x5555555d2260}, {
m_obj = 0x5555555d22a0}, {m_obj = 0x5555555d22e0}, {m_obj = 0x5555555d2350}, {m_obj = 0x5555555d23c0}, {m_obj = 0x5555555d2440}, {m_obj = 0x5555555d24f0}, {
m_obj = 0x5555555d2650}, {m_obj = 0x5555555d27d0}, {m_obj = 0x5555555d2880}, {m_obj = 0x5555555d28f0}, {m_obj = 0x5555555d2930}, {m_obj = 0x5555555d2970}, {
m_obj = 0x5555555d29d0}, {m_obj = 0x5555555d2a10}, {m_obj = 0x5555555d2a90}, {m_obj = 0x5555555d2b10}, {m_obj = 0x5555555d2b90}, {m_obj = 0x5555555d2c00}, {
m_obj = 0x5555555d2c60}, {m_obj = 0x5555555d2ce0}, {m_obj = 0x5555555d2d60}, {m_obj = 0x5555555d2e90}, {m_obj = 0x5555555d2fa0}, {m_obj = 0x5555555d3010}, {
m_obj = 0x5555555d30a0}, {m_obj = 0x5555555d30e0}, {m_obj = 0x5555555d3120}, {m_obj = 0x5555555d3160}, {m_obj = 0x5555555d31a0}...}}
dispname = 0x7fffffffe2c6 "install.pyc"
(gdb) quit |
|
any progress? |
No, I gave up on the project when I realized that new Python bytecode requires context checking trees rather than per-bytecode translation. Newer Python like 3.8+ optimize more and more the bytecode to remove unnecessary instructions for the execution which inherently destroys the one-to-one bijection that was before, where one instruction could result in only one step/line of python code . I used this tool and my fork to do the heavy lifting of decompiling a python 3.9 program I needed the sources of to run on linux, and when it would fail to decompile, I would decompile by hand the bytecode. I managed to decompile what I needed then I moved to other things. Seeing that the project is basically too anchored in previous versions of Python, it needs a complete rewrite for python 3.9+ I simply stopped all work. I haven't looked ever since if there was any better suited decompiler for python 3.8+ since I left this PR. |
Add tests for simple cases of try-except-finally (rename one old Python 2.6 test);
Implement
JUMP_IF_NOT_EXC_MATCH_Awith a fakeCMP_EXCEPTIONfollowed by aPOP_JUMP_IF_TRUE;Implement
BEGIN_FINALLYwith a fakeLOAD_CONST_A None;Implement Python 3.8+ specific
SETUP_FINALLY_Ahandling both EXCEPT and FINALLY cases. We guess which is which by looking at the targeted block that seems to either be aPOP_TOPor aDUP_TOPin the case of an EXCEPT block;Implement
RERAISEwith a fakeEND_FINALLY;In Python 3.9+, emulate a
BEGIN_FINALLYwhenPOP_BLOCKis not followed by aJUMP_FORWARD_A(maybe source of bugs);In Python 3.9+, skip the duplicated code from the FINALLY blocks with a jump in bytecode and a fake
END_FINALLY.