[pypy-svn] pypy extend-rweakdict: Simplify code a bit:

amauryfa commits-noreply at bitbucket.org
Sun Mar 13 23:41:36 CET 2011


Author: Amaury Forgeot d'Arc <amauryfa at gmail.com>
Branch: extend-rweakdict
Changeset: r42579:9a46f08db058
Date: 2011-03-13 23:10 +0100
http://bitbucket.org/pypy/pypy/changeset/9a46f08db058/

Log:	Simplify code a bit: remove the "traits" class and put all methods
	in the Repr itself.

diff --git a/pypy/rlib/rweakref.py b/pypy/rlib/rweakref.py
--- a/pypy/rlib/rweakref.py
+++ b/pypy/rlib/rweakref.py
@@ -106,7 +106,7 @@
 
     def specialize_call(self, hop):
         from pypy.rlib import _rweakvaldict
-        return _rweakvaldict.specialize_make_weakdict(hop, hop.r_result.traits)
+        return _rweakvaldict.specialize_make_weakdict(hop)
 
 class Entry(extregistry.ExtRegistryEntry):
     _type_ = RWeakValueDictionary

diff --git a/pypy/rlib/_rweakvaldict.py b/pypy/rlib/_rweakvaldict.py
--- a/pypy/rlib/_rweakvaldict.py
+++ b/pypy/rlib/_rweakvaldict.py
@@ -13,8 +13,51 @@
     def __init__(self, rtyper, r_key):
         self.rtyper = rtyper
         self.r_key = r_key
-        self.traits = make_WEAKDICT(r_key)
-        self.lowleveltype = lltype.Ptr(self.traits.WEAKDICT)
+
+        fasthashfn = r_key.get_ll_fasthash_function()
+        self.ll_keyhash = r_key.get_ll_hash_function()
+        ll_keyeq = lltype.staticAdtMethod(r_key.get_ll_eq_function())
+
+        def ll_valid(entries, i):
+            value = entries[i].value
+            return bool(value) and bool(weakref_deref(rclass.OBJECTPTR, value))
+
+        def ll_everused(entries, i):
+            return bool(entries[i].value)
+
+        def ll_hash(entries, i):
+            return fasthashfn(entries[i].key)
+
+        entrymeths = {
+            'allocate': lltype.typeMethod(rdict._ll_malloc_entries),
+            'delete': rdict._ll_free_entries,
+            'valid': ll_valid,
+            'everused': ll_everused,
+            'hash': ll_hash,
+            }
+        WEAKDICTENTRY = lltype.Struct("weakdictentry",
+                                      ("key", r_key.lowleveltype),
+                                      ("value", llmemory.WeakRefPtr))
+        WEAKDICTENTRYARRAY = lltype.GcArray(WEAKDICTENTRY,
+                                            adtmeths=entrymeths,
+                                            hints={'weakarray': 'value'})
+        # NB. the 'hints' is not used so far ^^^
+
+        dictmeths = {
+            'll_get': self.ll_get,
+            'll_set': self.ll_set,
+            'keyeq': ll_keyeq,
+            'paranoia': False,
+            }
+
+        self.WEAKDICT = lltype.GcStruct(
+            "weakvaldict",
+            ("num_items", lltype.Signed),
+            ("num_pristine_entries", lltype.Signed),
+            ("entries", lltype.Ptr(WEAKDICTENTRYARRAY)),
+            adtmeths=dictmeths)
+
+        self.lowleveltype = lltype.Ptr(self.WEAKDICT)
         self.dict_cache = {}
 
     def convert_const(self, weakdict):
@@ -26,7 +69,7 @@
             return self.dict_cache[key]
         except KeyError:
             self.setup()
-            l_dict = self.traits.ll_new_weakdict()
+            l_dict = self.ll_new_weakdict()
             self.dict_cache[key] = l_dict
             bk = self.rtyper.annotator.bookkeeper
             classdef = bk.getuniqueclassdef(weakdict._valueclass)
@@ -36,14 +79,13 @@
                 llvalue = r_value.convert_const(dictvalue)
                 if llvalue:
                     llvalue = lltype.cast_pointer(rclass.OBJECTPTR, llvalue)
-                    self.traits.ll_set_nonnull(l_dict, llkey, llvalue)
+                    self.ll_set_nonnull(l_dict, llkey, llvalue)
             return l_dict
 
     def rtype_method_get(self, hop):
-        
         v_d, v_key = hop.inputargs(self, self.r_key)
         hop.exception_cannot_occur()
-        v_result = hop.gendirectcall(self.traits.ll_get, v_d, v_key)
+        v_result = hop.gendirectcall(self.ll_get, v_d, v_key)
         v_result = hop.genop("cast_pointer", [v_result],
                              resulttype=hop.r_result.lowleveltype)
         return v_result
@@ -53,136 +95,81 @@
         v_d, v_key, v_value = hop.inputargs(self, self.r_key, r_object)
         hop.exception_cannot_occur()
         if hop.args_s[2].is_constant() and hop.args_s[2].const is None:
-            hop.gendirectcall(self.traits.ll_set_null, v_d, v_key)
+            hop.gendirectcall(self.ll_set_null, v_d, v_key)
         else:
-            hop.gendirectcall(self.traits.ll_set, v_d, v_key, v_value)
+            hop.gendirectcall(self.ll_set, v_d, v_key, v_value)
 
 
-def specialize_make_weakdict(hop, traits):
+    # ____________________________________________________________
+
+    @jit.dont_look_inside
+    def ll_new_weakdict(self):
+        d = lltype.malloc(self.WEAKDICT)
+        d.entries = self.WEAKDICT.entries.TO.allocate(rdict.DICT_INITSIZE)
+        d.num_items = 0
+        d.num_pristine_entries = rdict.DICT_INITSIZE
+        return d
+
+    @jit.dont_look_inside
+    def ll_get(self, d, llkey):
+        hash = self.ll_keyhash(llkey)
+        i = rdict.ll_dict_lookup(d, llkey, hash)
+        #llop.debug_print(lltype.Void, i, 'get')
+        valueref = d.entries[i].value
+        if valueref:
+            return weakref_deref(rclass.OBJECTPTR, valueref)
+        else:
+            return lltype.nullptr(rclass.OBJECTPTR.TO)
+
+    @jit.dont_look_inside
+    def ll_set(self, d, llkey, llvalue):
+        if llvalue:
+            self.ll_set_nonnull(d, llkey, llvalue)
+        else:
+            self.ll_set_null(d, llkey)
+
+    @jit.dont_look_inside
+    def ll_set_nonnull(self, d, llkey, llvalue):
+        hash = self.ll_keyhash(llkey)
+        valueref = weakref_create(llvalue)    # GC effects here, before the rest
+        i = rdict.ll_dict_lookup(d, llkey, hash)
+        everused = d.entries.everused(i)
+        d.entries[i].key = llkey
+        d.entries[i].value = valueref
+        #llop.debug_print(lltype.Void, i, 'stored')
+        if not everused:
+            d.num_pristine_entries -= 1
+            if d.num_pristine_entries * 3 <= len(d.entries):
+                #llop.debug_print(lltype.Void, 'RESIZE')
+                self.ll_weakdict_resize(d)
+
+    @jit.dont_look_inside
+    def ll_set_null(self, d, llkey):
+        hash = self.ll_keyhash(llkey)
+        i = rdict.ll_dict_lookup(d, llkey, hash)
+        if d.entries.everused(i):
+            # If the entry was ever used, clean up its key and value.
+            # We don't store a NULL value, but a dead weakref, because
+            # the entry must still be marked as everused().
+            d.entries[i].value = llmemory.dead_wref
+            if isinstance(self.r_key.lowleveltype, lltype.Ptr):
+                d.entries[i].key = self.r_key.convert_const(None)
+            else:
+                d.entries[i].key = self.r_key.convert_const(0)
+            #llop.debug_print(lltype.Void, i, 'zero')
+
+    def ll_weakdict_resize(self, d):
+        # first set num_items to its correct, up-to-date value
+        entries = d.entries
+        num_items = 0
+        for i in range(len(entries)):
+            if entries.valid(i):
+                num_items += 1
+        d.num_items = num_items
+        rdict.ll_dict_resize(d)
+
+def specialize_make_weakdict(hop):
     hop.exception_cannot_occur()
-    v_d = hop.gendirectcall(traits.ll_new_weakdict)
+    v_d = hop.gendirectcall(hop.r_result.ll_new_weakdict)
     return v_d
 
-# ____________________________________________________________
-
-def make_WEAKDICT(r_key):
-    KEY = r_key.lowleveltype
-    ll_keyhash = r_key.get_ll_hash_function()
-    if isinstance(KEY, lltype.Ptr):
-        zero_key = r_key.convert_const(None)
-    else:
-        zero_key = r_key.convert_const(0)
-
-    WEAKDICTENTRY = lltype.Struct("weakdictentry",
-                                  ("key", KEY),
-                                  ("value", llmemory.WeakRefPtr))
-
-    def ll_valid(entries, i):
-        value = entries[i].value
-        return bool(value) and bool(weakref_deref(rclass.OBJECTPTR, value))
-
-    def ll_everused(entries, i):
-        return bool(entries[i].value)
-
-    def ll_hash(entries, i):
-        return fasthashfn(entries[i].key)
-    fasthashfn = r_key.get_ll_fasthash_function()
-
-    entrymeths = {
-        'allocate': lltype.typeMethod(rdict._ll_malloc_entries),
-        'delete': rdict._ll_free_entries,
-        'valid': ll_valid,
-        'everused': ll_everused,
-        'hash': ll_hash,
-        }
-    WEAKDICTENTRYARRAY = lltype.GcArray(WEAKDICTENTRY,
-                                        adtmeths=entrymeths,
-                                        hints={'weakarray': 'value'})
-    # NB. the 'hints' is not used so far ^^^
-
-    class Traits:
-        @staticmethod
-        @jit.dont_look_inside
-        def ll_new_weakdict():
-            d = lltype.malloc(Traits.WEAKDICT)
-            d.entries = Traits.WEAKDICT.entries.TO.allocate(rdict.DICT_INITSIZE)
-            d.num_items = 0
-            d.num_pristine_entries = rdict.DICT_INITSIZE
-            return d
-
-        @staticmethod
-        @jit.dont_look_inside
-        def ll_get(d, llkey):
-            hash = ll_keyhash(llkey)
-            i = rdict.ll_dict_lookup(d, llkey, hash)
-            #llop.debug_print(lltype.Void, i, 'get')
-            valueref = d.entries[i].value
-            if valueref:
-                return weakref_deref(rclass.OBJECTPTR, valueref)
-            else:
-                return lltype.nullptr(rclass.OBJECTPTR.TO)
-
-        @staticmethod
-        @jit.dont_look_inside
-        def ll_set(d, llkey, llvalue):
-            if llvalue:
-                Traits.ll_set_nonnull(d, llkey, llvalue)
-            else:
-                Traits.ll_set_null(d, llkey)
-
-        @staticmethod
-        @jit.dont_look_inside
-        def ll_set_nonnull(d, llkey, llvalue):
-            hash = ll_keyhash(llkey)
-            valueref = weakref_create(llvalue)    # GC effects here, before the rest
-            i = rdict.ll_dict_lookup(d, llkey, hash)
-            everused = d.entries.everused(i)
-            d.entries[i].key = llkey
-            d.entries[i].value = valueref
-            #llop.debug_print(lltype.Void, i, 'stored')
-            if not everused:
-                d.num_pristine_entries -= 1
-                if d.num_pristine_entries * 3 <= len(d.entries):
-                    #llop.debug_print(lltype.Void, 'RESIZE')
-                    Traits.ll_weakdict_resize(d)
-
-        @staticmethod
-        @jit.dont_look_inside
-        def ll_set_null(d, llkey):
-            hash = ll_keyhash(llkey)
-            i = rdict.ll_dict_lookup(d, llkey, hash)
-            if d.entries.everused(i):
-                # If the entry was ever used, clean up its key and value.
-                # We don't store a NULL value, but a dead weakref, because
-                # the entry must still be marked as everused().
-                d.entries[i].value = llmemory.dead_wref
-                d.entries[i].key = zero_key
-                #llop.debug_print(lltype.Void, i, 'zero')
-
-        @staticmethod
-        def ll_weakdict_resize(d):
-            # first set num_items to its correct, up-to-date value
-            entries = d.entries
-            num_items = 0
-            for i in range(len(entries)):
-                if entries.valid(i):
-                    num_items += 1
-            d.num_items = num_items
-            rdict.ll_dict_resize(d)
-
-        ll_keyeq = lltype.staticAdtMethod(r_key.get_ll_eq_function())
-
-        dictmeths = {
-            'll_get': ll_get,
-            'll_set': ll_set,
-            'keyeq': ll_keyeq,
-            'paranoia': False,
-            }
-
-        WEAKDICT = lltype.GcStruct("weakvaldict",
-                                   ("num_items", lltype.Signed),
-                                   ("num_pristine_entries", lltype.Signed),
-                                   ("entries", lltype.Ptr(WEAKDICTENTRYARRAY)),
-                                   adtmeths=dictmeths)
-
-    return Traits


More information about the Pypy-commit mailing list