[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