[pypy-commit] pypy stmgc-c8-hashtable: Re-introduce this part from stmgc-c7

arigo noreply at buildbot.pypy.org
Thu Mar 12 17:56:38 CET 2015


Author: Armin Rigo <arigo at tunes.org>
Branch: stmgc-c8-hashtable
Changeset: r76356:8dead8bff1d7
Date: 2015-03-12 17:49 +0100
http://bitbucket.org/pypy/pypy/changeset/8dead8bff1d7/

Log:	Re-introduce this part from stmgc-c7

diff --git a/rpython/rlib/rstm.py b/rpython/rlib/rstm.py
--- a/rpython/rlib/rstm.py
+++ b/rpython/rlib/rstm.py
@@ -256,8 +256,7 @@
                                       'freelist': _ll_hashtable_freelist,
                                         'lookup': _ll_hashtable_lookup,
                                       'writeobj': _ll_hashtable_writeobj})
-# NULL_HASHTABLE = lltype.nullptr(_HASHTABLE_OBJ)
-NULL_HASHTABLE = None
+NULL_HASHTABLE = lltype.nullptr(_HASHTABLE_OBJ)
 
 def _ll_hashtable_trace(gc, obj, callback, arg):
     from rpython.memory.gctransform.stmframework import get_visit_function
@@ -277,67 +276,23 @@
 def create_hashtable():
     if not we_are_translated():
         return HashtableForTest()      # for tests
-    return HashtableEmulation()
-    # rgc.register_custom_light_finalizer(_HASHTABLE_OBJ, lambda_hashtable_finlz)
-    # rgc.register_custom_trace_hook(_HASHTABLE_OBJ, lambda_hashtable_trace)
-    # # Pass a null pointer to _STM_HASHTABLE_ENTRY to stm_hashtable_create().
-    # # Make sure we see a malloc() of it, so that its typeid is correctly
-    # # initialized.  It can be done in a NonConstant(False) path so that
-    # # the C compiler will actually drop it.
-    # if _false:
-    #     p = lltype.malloc(_STM_HASHTABLE_ENTRY)
-    # else:
-    #     p = lltype.nullptr(_STM_HASHTABLE_ENTRY)
-    # h = lltype.malloc(_HASHTABLE_OBJ)
-    # h.ll_raw_hashtable = lltype.nullptr(_STM_HASHTABLE_P.TO)
-    # h.ll_raw_hashtable = llop.stm_hashtable_create(_STM_HASHTABLE_P, p)
-    # return h
+    rgc.register_custom_light_finalizer(_HASHTABLE_OBJ, lambda_hashtable_finlz)
+    rgc.register_custom_trace_hook(_HASHTABLE_OBJ, lambda_hashtable_trace)
+    # Pass a null pointer to _STM_HASHTABLE_ENTRY to stm_hashtable_create().
+    # Make sure we see a malloc() of it, so that its typeid is correctly
+    # initialized.  It can be done in a NonConstant(False) path so that
+    # the C compiler will actually drop it.
+    if _false:
+        p = lltype.malloc(_STM_HASHTABLE_ENTRY)
+    else:
+        p = lltype.nullptr(_STM_HASHTABLE_ENTRY)
+    h = lltype.malloc(_HASHTABLE_OBJ)
+    h.ll_raw_hashtable = lltype.nullptr(_STM_HASHTABLE_P.TO)
+    h.ll_raw_hashtable = llop.stm_hashtable_create(_STM_HASHTABLE_P, p)
+    return h
 
 NULL_GCREF = lltype.nullptr(llmemory.GCREF.TO)
 
-class HashtableEmulation(object):
-    def __init__(self):
-        self._content = {}      # dict {integer: GCREF}
-
-    def get(self, key):
-        return self._content.get(key, NULL_GCREF)
-
-    def set(self, key, value):
-        if value:
-            self._content[key] = value
-        else:
-            try:
-                del self._content[key]
-            except KeyError:
-                pass
-
-    def len(self):
-        return len(self._content)
-
-    def list(self):
-        items = []
-        for key in self._content.keys():
-            items.append(self.lookup(key))
-        count = len(items)
-        return items, count
-
-    def freelist(self, array):
-        pass
-
-    def lookup(self, key):
-        return EntryObjectEmulation(self, key)
-
-    def writeobj(self, entry, nvalue):
-        self.set(entry.key, nvalue)
-
-class EntryObjectEmulation(object):
-    def __init__(self, hashtable, key):
-        self.hashtable = hashtable
-        self.key = key
-        self.index = r_uint(key)
-        self.object = hashtable.get(key)
-
-
 class HashtableForTest(object):
     def __init__(self):
         self._content = {}      # dict {integer: GCREF}


More information about the pypy-commit mailing list