3.6 class signature problems...

This time getting the class name in when a "load_closure" is added.
This commit is contained in:
rocky
2018-03-04 17:25:42 -05:00
parent dc1971f559
commit ffbce9cb77
5 changed files with 51 additions and 76 deletions

View File

@@ -1,49 +0,0 @@
# Bug was found in 3.6 _osx_support.py in if/elif needing
# EXTENDED_ARGS which are the targets of jumps.
def get_platform_osx(_config_vars, osname, release, machine, sys, re):
"""Filter values for get_platform()"""
macver = _config_vars.get('MACOSX_DEPLOYMENT_TARGET', '')
macrelease = release or 10
macver = macver or macrelease
if macver:
release = macver
osname = "macosx"
cflags = _config_vars.get('CFLAGS', _config_vars.get('CFLAGS', ''))
if macrelease:
try:
macrelease = tuple(int(i) for i in macrelease.split('.')[0:2])
except ValueError:
macrelease = (10, 0)
else:
macrelease = (10, 0)
if (macrelease >= (10, 4)) and '-arch' in cflags.strip():
machine = 'fat'
archs = re.findall(r'-arch\s+(\S+)', cflags)
archs = tuple(sorted(set(archs)))
if len(archs) == 1:
machine = archs[0]
elif archs == ('i386', 'ppc'):
machine = 'fat'
elif archs == ('i386', 'x86_64'):
machine = 'intel'
elif archs == ('i386', 'ppc', 'x86_64'):
machine = 'fat3'
elif archs == ('ppc64', 'x86_64'):
machine = 'fat64'
elif archs == ('i386', 'ppc', 'ppc64', 'x86_64'):
machine = 'universal'
else:
raise ValueError(
"Don't know machine value for archs=%r" % (archs,))
elif machine == 'i386':
if sys.maxsize >= 2**32:
machine = 'x86_64'
return (osname, release, machine)

View File

@@ -1,10 +1,30 @@
# Python 3.6's changes for calling functions.
# See https://github.com/rocky/python-uncompyle6/issues/58
# CALL_FUNCTION_EX takes 2 to 3 arguments on the stack: the function, the tuple of positional arguments,
# and optionally the dict of keyword arguments if bit 0 of oparg is 1.
# CALL_FUNCTION_EX takes 2 to 3 arguments on the stack:
# * the function,
# * the tuple of positional arguments, and optionally
# * the dict of keyword arguments if bit 0 of oparg is 1.
from foo import f, dialect, args, kwds, reader
f(*[])
# From Python 3.6 csv.py
# (f, dialect) are positional arg tuples, *args, is by itself, i.e.
# no tuple.
x = reader(f, dialect, *args, **kwds)
# From 3.6 functools.py
# Below there is a load_closure instruction added
def cmp_to_key(mycmp):
class K(object):
def __ge__():
return mycmp()
return
# In this situation though, there is no load_closure
def cmp2_to_key(mycmp):
class K2(object):
def __ge__():
return 5
return

View File

@@ -1531,17 +1531,21 @@ class SourceWalker(GenericASTTraversal, object):
class_name = node[2][0].pattr
else:
class_name = node[1][2].pattr
buildclass = node
build_class = node
else:
build_class = node[0]
if self.version >= 3.6:
class_name = node[0][1][0].attr.co_name
buildclass = node[0]
if build_class[1][0] == 'load_closure':
code_node = build_class[1][1]
else:
code_node = build_class[1][0]
class_name = code_node.attr.co_name
else:
class_name = node[1][0].pattr
buildclass = node[0]
build_class = node[0]
assert 'mkfunc' == buildclass[1]
mkfunc = buildclass[1]
assert 'mkfunc' == build_class[1]
mkfunc = build_class[1]
if mkfunc[0] == 'kwargs':
if 3.0 <= self.version <= 3.2:
for n in mkfunc:
@@ -1563,9 +1567,9 @@ class SourceWalker(GenericASTTraversal, object):
subclass_info = node
else:
subclass_info = node[0]
elif buildclass[1][0] == 'load_closure':
elif build_class[1][0] == 'load_closure':
# Python 3 with closures not functions
load_closure = buildclass[1]
load_closure = build_class[1]
if hasattr(load_closure[-3], 'attr'):
# Python 3.3 classes with closures work like this.
# Note have to test before 3.2 case because
@@ -1576,34 +1580,34 @@ class SourceWalker(GenericASTTraversal, object):
subclass_code = load_closure[-2].attr
else:
raise 'Internal Error n_classdef: cannot find class body'
if hasattr(buildclass[3], '__len__'):
subclass_info = buildclass[3]
elif hasattr(buildclass[2], '__len__'):
subclass_info = buildclass[2]
if hasattr(build_class[3], '__len__'):
subclass_info = build_class[3]
elif hasattr(build_class[2], '__len__'):
subclass_info = build_class[2]
else:
raise 'Internal Error n_classdef: cannot superclass name'
elif self.version >= 3.6 and node == 'classdefdeco2':
subclass_info = node
subclass_code = buildclass[1][0].attr
subclass_code = build_class[1][0].attr
else:
subclass_code = buildclass[1][0].attr
subclass_code = build_class[1][0].attr
subclass_info = node[0]
else:
if node == 'classdefdeco2':
buildclass = node
build_class = node
else:
buildclass = node[0]
build_list = buildclass[1][0]
if hasattr(buildclass[-3][0], 'attr'):
subclass_code = buildclass[-3][0].attr
class_name = buildclass[0].pattr
elif (buildclass[-3] == 'mkfunc' and
build_class = node[0]
build_list = build_class[1][0]
if hasattr(build_class[-3][0], 'attr'):
subclass_code = build_class[-3][0].attr
class_name = build_class[0].pattr
elif (build_class[-3] == 'mkfunc' and
node == 'classdefdeco2' and
buildclass[-3][0] == 'load_closure'):
subclass_code = buildclass[-3][1].attr
class_name = buildclass[-3][0][0].pattr
build_class[-3][0] == 'load_closure'):
subclass_code = build_class[-3][1].attr
class_name = build_class[-3][0][0].pattr
elif hasattr(node[0][0], 'pattr'):
subclass_code = buildclass[-3][1].attr
subclass_code = build_class[-3][1].attr
class_name = node[0][0].pattr
else:
raise 'Internal Error n_classdef: cannot find class name'