Author: Jasper.Schulz <jasper.b.sch...@gmail.com>
Branch: reorder-map-attributes
Changeset: r82173:ece37fb4ad10
Date: 2016-02-11 16:08 +0000
http://bitbucket.org/pypy/pypy/changeset/ece37fb4ad10/

Log:    (cfbolz, jbs): optimized stacks

diff --git a/pypy/objspace/std/mapdict.py b/pypy/objspace/std/mapdict.py
--- a/pypy/objspace/std/mapdict.py
+++ b/pypy/objspace/std/mapdict.py
@@ -194,10 +194,12 @@
             jit.isconstant(name) and
             jit.isconstant(index))
     def _reorder_and_add(self, obj, name, index, w_value):
-        stack = []
+        stack_maps = None
+        stack_values = None
+        stack_index = 0
         while True:
             current = self
-            localstack = []
+            localstack_index = stack_index
             while True:
                 attr = current._get_cache_attr(name, index)
                 if attr is None:
@@ -209,28 +211,37 @@
                     # if not found try parent
                     else:
                         w_self_value = 
obj._mapdict_read_storage(current.storageindex)
-                        localstack.append((current, w_self_value))
+                        if stack_maps is None:
+                            stack_maps = [None] * self.length()
+                            stack_values = [None] * self.length()
+                        stack_maps[localstack_index] = current
+                        stack_values[localstack_index] = w_self_value
+                        localstack_index += 1
                         current = current.back
                 else:
                     attr._switch_map_and_write_storage(obj, w_value)
-                    stack.extend(localstack)
+                    stack_index = localstack_index
                     break
 
-            if not stack:
+            if not stack_index:
                 return
             
             # add the first attribute of the stack without reordering
             # to prevent an endless loop
-            next_map, w_value = stack.pop()
+            stack_index += -1
+            next_map = stack_maps[stack_index]
+            w_value = stack_values[stack_index]
             obj._get_mapdict_map()._add_attr_without_reordering(
                 obj, next_map.name, next_map.index, w_value)
 
-            if not stack:
+            if not stack_index:
                 return
 
             # readd all other values from the stack (with reordering)
             # the last element of the stack will be the new current
-            next_map, w_value = stack.pop()
+            stack_index += -1
+            next_map = stack_maps[stack_index]
+            w_value = stack_values[stack_index]
             name = next_map.name
             index = next_map.index
             self = obj._get_mapdict_map()
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to