[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