[pypy-commit] pypy default: Preserve the order of entries in configure_entries() which now takes a list instead of a dict
rlamy
pypy.commits at gmail.com
Thu Jan 26 14:55:25 EST 2017
Author: Ronan Lamy <ronan.lamy at gmail.com>
Branch:
Changeset: r89793:e484cf6b06b6
Date: 2017-01-26 19:54 +0000
http://bitbucket.org/pypy/pypy/changeset/e484cf6b06b6/
Log: Preserve the order of entries in configure_entries() which now takes
a list instead of a dict
diff --git a/pypy/module/cpyext/cparser.py b/pypy/module/cpyext/cparser.py
--- a/pypy/module/cpyext/cparser.py
+++ b/pypy/module/cpyext/cparser.py
@@ -699,8 +699,7 @@
self.headers = headers if headers is not None else ['sys/types.h']
self.parsed_headers = []
self.sources = []
- self._config_entries = []
- self._TYPES = {}
+ self._config_entries = OrderedDict()
self.includes = []
self.struct_typedefs = {}
self._handled = set()
@@ -758,11 +757,8 @@
def realize_struct(self, struct):
type_name = struct.get_type_name()
- configname = type_name.replace(' ', '__')
- assert not any(x[0] == configname for x in self._config_entries)
- self._config_entries.append(
- (configname, rffi_platform.Struct(type_name, struct.fields)))
- self._TYPES[configname] = struct.TYPE
+ entry = rffi_platform.Struct(type_name, struct.fields)
+ self._config_entries[entry] = struct.TYPE
return struct.TYPE
def build_eci(self):
@@ -799,14 +795,12 @@
if not self._config_entries:
return
eci = self.build_eci()
- result = rffi_platform.configure_entries(self._config_entries, eci)
- for name, TYPE in result.iteritems():
+ result = rffi_platform.configure_entries(list(self._config_entries), eci)
+ for entry, TYPE in zip(self._config_entries, result):
# hack: prevent the source from being pasted into common_header.h
del TYPE._hints['eci']
- if name in self._TYPES:
- self._TYPES[name].become(TYPE)
- del self._TYPES[name]
- self._config_entries[:] = []
+ self._config_entries[entry].become(TYPE)
+ self._config_entries.clear()
def convert_type(self, obj, quals=0):
if isinstance(obj, model.DefinedType):
diff --git a/rpython/rtyper/tool/rffi_platform.py b/rpython/rtyper/tool/rffi_platform.py
--- a/rpython/rtyper/tool/rffi_platform.py
+++ b/rpython/rtyper/tool/rffi_platform.py
@@ -131,25 +131,20 @@
# General interface
class ConfigResult:
- def __init__(self, eci, info, entries):
+ def __init__(self, eci, info):
self.eci = eci
+ self.info = info
self.result = {}
- self.info = info
- self.entries = entries
def get_entry_result(self, entry):
try:
return self.result[entry]
except KeyError:
pass
- name = self.entries[entry]
- info = self.info[name]
+ info = self.info[entry]
self.result[entry] = entry.build_result(info, self)
return self.result[entry]
- def get_result(self):
- return dict([(name, self.result[entry])
- for entry, name in self.entries.iteritems()])
class _CWriter(object):
""" A simple class which aggregates config parts
@@ -207,16 +202,18 @@
"Found legacy attribute %s on CConfig" % attr
eci = CConfig._compilation_info_
- entries = []
+ entries = {}
for key in dir(CConfig):
value = getattr(CConfig, key)
if isinstance(value, CConfigEntry):
- entries.append((key, value))
+ entries[key] = value
+ res = {}
if entries: # can be empty if there are only CConfigSingleEntries
- res = configure_entries(entries, eci, ignore_errors=ignore_errors)
- else:
- res = {}
+ results = configure_entries(
+ entries.values(), eci, ignore_errors=ignore_errors)
+ for name, result in zip(entries, results):
+ res[name] = result
for key in dir(CConfig):
value = getattr(CConfig, key)
@@ -231,12 +228,12 @@
def configure_entries(entries, eci, ignore_errors=False):
writer = _CWriter(eci)
writer.write_header()
- for key, entry in entries:
- writer.write_entry(key, entry)
+ for i, entry in enumerate(entries):
+ writer.write_entry(str(i), entry)
writer.start_main()
- for key, entry in entries:
- writer.write_entry_main(key)
+ for i, entry in enumerate(entries):
+ writer.write_entry_main(str(i))
writer.close()
infolist = list(run_example_code(
@@ -244,15 +241,11 @@
assert len(infolist) == len(entries)
resultinfo = {}
- resultentries = {}
- for info, (key, entry) in zip(infolist, entries):
- resultinfo[key] = info
- resultentries[entry] = key
+ for info, entry in zip(infolist, entries):
+ resultinfo[entry] = info
- result = ConfigResult(eci, resultinfo, resultentries)
- for name, entry in entries:
- result.get_entry_result(entry)
- return result.get_result()
+ result = ConfigResult(eci, resultinfo)
+ return [result.get_entry_result(entry) for entry in entries]
# ____________________________________________________________
More information about the pypy-commit
mailing list