-
Notifications
You must be signed in to change notification settings - Fork 746
Implement Python 3.8 && 3.9 try-except-finally logic #493
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
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 $?
0 On 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_A
with a fakeCMP_EXCEPTION
followed by aPOP_JUMP_IF_TRUE
;Implement
BEGIN_FINALLY
with a fakeLOAD_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 targeted block that seems to either be aPOP_TOP
or aDUP_TOP
in the case of an EXCEPT block;Implement
RERAISE
with a fakeEND_FINALLY
;In Python 3.9+, emulate a
BEGIN_FINALLY
whenPOP_BLOCK
is 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
.