You've already forked python-uncompyle6
mirror of
https://github.com/rocky/python-uncompyle6.git
synced 2025-08-04 01:09:52 +08:00
Possibly closer to getting 2.7 to read 3.4 bytecode
This commit is contained in:
@@ -88,15 +88,16 @@ def load_module(filename, code_objects={}):
|
|||||||
magic_int = magics.magic2int(magic)
|
magic_int = magics.magic2int(magic)
|
||||||
my_magic_int = magics.magic2int(imp.get_magic())
|
my_magic_int = magics.magic2int(imp.get_magic())
|
||||||
|
|
||||||
|
# Note: a higher magic number doesn't necessarily mean a later
|
||||||
|
# release. At Python 3.0 the magic number decreased
|
||||||
|
# significantly. Hence the range below. Also note inclusion of
|
||||||
|
# the size info, occurred within a Python major/minor
|
||||||
|
# release. Hence the test on the magic value rather than
|
||||||
|
# PYTHON_VERSION, although PYTHON_VERSION would probably work.
|
||||||
|
if 3200 <= magic_int < 20121:
|
||||||
|
fp.read(4) # size mod 2**32
|
||||||
|
|
||||||
if my_magic_int == magic_int:
|
if my_magic_int == magic_int:
|
||||||
# Note: a higher magic number necessarily mean a later
|
|
||||||
# release. At Python 3.0 the magic number decreased
|
|
||||||
# significantly. Hence the range below. Also note
|
|
||||||
# inclusion of the size info, occurred within a
|
|
||||||
# Python magor/minor release. Hence the test on the
|
|
||||||
# magic value rather than PYTHON_VERSION
|
|
||||||
if 3200 <= magic_int < 20121:
|
|
||||||
fp.read(4) # size mod 2**32
|
|
||||||
bytecode = fp.read()
|
bytecode = fp.read()
|
||||||
co = marshal.loads(bytecode)
|
co = marshal.loads(bytecode)
|
||||||
else:
|
else:
|
||||||
|
@@ -43,7 +43,13 @@ def load_code(fp, magic_int, code_objects={}):
|
|||||||
internStrings = []
|
internStrings = []
|
||||||
seek_pos = fp.tell()
|
seek_pos = fp.tell()
|
||||||
# Do a sanity check. Is this a code type?
|
# Do a sanity check. Is this a code type?
|
||||||
if fp.read(1).decode('utf-8') != 'c':
|
b = ord(fp.read(1))
|
||||||
|
|
||||||
|
if (b & 0x80):
|
||||||
|
b = b & 0x7f
|
||||||
|
|
||||||
|
c = chr(b)
|
||||||
|
if c != 'c':
|
||||||
raise TypeError("File %s doesn't smell like Python bytecode" % fp.name)
|
raise TypeError("File %s doesn't smell like Python bytecode" % fp.name)
|
||||||
|
|
||||||
fp.seek(seek_pos)
|
fp.seek(seek_pos)
|
||||||
@@ -52,8 +58,11 @@ def load_code(fp, magic_int, code_objects={}):
|
|||||||
def load_code_internal(fp, magic_int, bytes_for_s=False, code_objects={}):
|
def load_code_internal(fp, magic_int, bytes_for_s=False, code_objects={}):
|
||||||
global internStrings
|
global internStrings
|
||||||
|
|
||||||
b1 = fp.read(1)
|
b1 = ord(fp.read(1))
|
||||||
marshalType = b1.decode('utf-8')
|
if b1 & 0x80:
|
||||||
|
TypeError("Can't handle object references yet")
|
||||||
|
|
||||||
|
marshalType = chr(b1)
|
||||||
if marshalType == 'c':
|
if marshalType == 'c':
|
||||||
Code = types.CodeType
|
Code = types.CodeType
|
||||||
|
|
||||||
@@ -114,6 +123,8 @@ def load_code_internal(fp, magic_int, bytes_for_s=False, code_objects={}):
|
|||||||
code_objects[str(code)] = code
|
code_objects[str(code)] = code
|
||||||
return code
|
return code
|
||||||
|
|
||||||
|
elif marshalType == 'C':
|
||||||
|
raise KeyError("New-style code not finished yet")
|
||||||
# const type
|
# const type
|
||||||
elif marshalType == '.':
|
elif marshalType == '.':
|
||||||
return Ellipsis
|
return Ellipsis
|
||||||
|
Reference in New Issue
Block a user