[pypy-commit] pypy rdict-experiments-3: (fijal, arigo) RPythonification

arigo noreply at buildbot.pypy.org
Wed Oct 9 19:22:42 CEST 2013


Author: Armin Rigo <arigo at tunes.org>
Branch: rdict-experiments-3
Changeset: r67257:2a1d6345670e
Date: 2013-10-09 19:21 +0200
http://bitbucket.org/pypy/pypy/changeset/2a1d6345670e/

Log:	(fijal, arigo) RPythonification

diff --git a/rpython/rtyper/lltypesystem/rdict.py b/rpython/rtyper/lltypesystem/rdict.py
--- a/rpython/rtyper/lltypesystem/rdict.py
+++ b/rpython/rtyper/lltypesystem/rdict.py
@@ -139,8 +139,9 @@
     adtmeths['KEY']   = DICTKEY
     adtmeths['VALUE'] = DICTVALUE
     adtmeths['allocate'] = lltype.typeMethod(_ll_malloc_dict)
-    adtmeths['empty_array'] = DICTENTRYARRAY.allocate(0)
 
+    family = LookupFamily()
+    family.empty_array = DICTENTRYARRAY.allocate(0)
     for name, T in [('byte', rffi.UCHAR),
                     ('short', rffi.USHORT),
                     ('int', rffi.UINT),
@@ -149,13 +150,19 @@
             continue
         lookupfn, lookcleanfn = new_lookup_functions(LOOKUP_FUNC,
                                                      LOOKCLEAN_FUNC, T=T)
-        adtmeths['%s_lookup_function' % name] = lookupfn
-        adtmeths['%s_lookup_clean_function' % name] = lookcleanfn
+        setattr(family, '%s_lookup_function' % name, lookupfn)
+        setattr(family, '%s_insert_clean_function' % name, lookcleanfn)
+    adtmeths['lookup_family'] = family
 
     DICT.become(lltype.GcStruct("dicttable", adtmeths=adtmeths,
                                 *fields))
     return DICT
 
+class LookupFamily:
+    def _freeze_(self):
+        return True
+
+
 class DictRepr(AbstractDictRepr):
 
     def __init__(self, rtyper, key_repr, value_repr, dictkey, dictvalue,
@@ -404,34 +411,35 @@
         d.indexes = lltype.cast_opaque_ptr(llmemory.GCREF,
                                            lltype.malloc(DICTINDEX_BYTE.TO, n,
                                                          zero=True))
-        d.lookup_function = DICT.byte_lookup_function
+        d.lookup_function = DICT.lookup_family.byte_lookup_function
     elif n <= 65536:
         d.indexes = lltype.cast_opaque_ptr(llmemory.GCREF,
                                            lltype.malloc(DICTINDEX_SHORT.TO, n,
                                                          zero=True))
-        d.lookup_function = DICT.short_lookup_function
+        d.lookup_function = DICT.lookup_family.short_lookup_function
     elif IS_64BIT and n <= 2 ** 32:
         d.indexes = lltype.cast_opaque_ptr(llmemory.GCREF,
                                            lltype.malloc(DICTINDEX_INT.TO, n,
                                                          zero=True))
-        d.lookup_function = DICT.int_lookup_function
+        d.lookup_function = DICT.lookup_family.int_lookup_function
     else:
         d.indexes = lltype.cast_opaque_ptr(llmemory.GCREF,
                                            lltype.malloc(DICTINDEX_LONG.TO, n,
                                                          zero=True))
-        d.lookup_function = DICT.long_lookup_function
+        d.lookup_function = DICT.lookup_family.long_lookup_function
 ll_malloc_indexes_and_choose_lookup._always_inline_ = True
 
 def ll_pick_insert_clean_function(d):
     DICT = lltype.typeOf(d).TO
-    if d.lookup_function == DICT.byte_lookup_function:
-        return d.byte_lookup_clean_function
-    if d.lookup_function == DICT.short_lookup_function:
-        return d.short_lookup_clean_function
-    if IS_64BIT and d.lookup_function == DICT.int_lookup_function:
-        return d.int_lookup_clean_function
-    if d.lookup_function == DICT.long_lookup_function:
-        return d.long_lookup_clean_function
+    if d.lookup_function == DICT.lookup_family.byte_lookup_function:
+        return DICT.lookup_family.byte_insert_clean_function
+    if d.lookup_function == DICT.lookup_family.short_lookup_function:
+        return DICT.lookup_family.short_insert_clean_function
+    if IS_64BIT:
+        if d.lookup_function == DICT.lookup_family.int_lookup_function:
+            return DICT.lookup_family.int_insert_clean_function
+    if d.lookup_function == DICT.lookup_family.long_lookup_function:
+        return DICT.lookup_family.long_insert_clean_function
     assert False
 
 def ll_valid_from_flag(entries, i):
@@ -838,7 +846,7 @@
 
 def ll_newdict(DICT):
     d = DICT.allocate()
-    d.entries = DICT.empty_array
+    d.entries = DICT.lookup_family.empty_array
     ll_malloc_indexes_and_choose_lookup(d, DICT_INITSIZE)
     d.num_items = 0
     d.num_used_items = 0


More information about the pypy-commit mailing list