Author: Armin Rigo <[email protected]>
Branch: gc-del-3
Changeset: r84185:b628173116b0
Date: 2016-05-04 10:25 +0200
http://bitbucket.org/pypy/pypy/changeset/b628173116b0/

Log:    Hacks to make the non-translated tests pass again

diff --git a/rpython/memory/gc/base.py b/rpython/memory/gc/base.py
--- a/rpython/memory/gc/base.py
+++ b/rpython/memory/gc/base.py
@@ -393,15 +393,6 @@
         finally:
             self.finalizer_lock = False
 
-    def finalizer_next_dead(self, fq_index):
-        xxxxxxxxxxxx
-        fdeque = self.get_run_finalizer_queue(self.AddressDeque, fq_index)
-        if fdeque.non_empty():
-            obj = fdeque.popleft()
-        else:
-            obj = llmemory.NULL
-        return llmemory.cast_adr_to_ptr(obj, llmemory.GCREF)
-
 
 class MovingGCBase(GCBase):
     moving_gc = True
diff --git a/rpython/memory/gcwrapper.py b/rpython/memory/gcwrapper.py
--- a/rpython/memory/gcwrapper.py
+++ b/rpython/memory/gcwrapper.py
@@ -1,7 +1,7 @@
 from rpython.translator.backendopt.finalizer import FinalizerAnalyzer
 from rpython.rtyper.lltypesystem import lltype, llmemory, llheap
 from rpython.rtyper import llinterp, rclass
-from rpython.rtyper.annlowlevel import llhelper
+from rpython.rtyper.annlowlevel import llhelper, cast_nongc_instance_to_adr
 from rpython.memory import gctypelayout
 from rpython.flowspace.model import Constant
 from rpython.rlib import rgc
@@ -22,8 +22,6 @@
         self.llinterp = llinterp
         self.prepare_graphs(flowgraphs)
         self.gc.setup()
-        self.finalizer_queue_indexes = {}
-        self.finalizer_queues = {}
         self.has_write_barrier_from_array = hasattr(self.gc,
                                                     'write_barrier_from_array')
 
@@ -34,9 +32,12 @@
                                                self.llinterp)
         self.get_type_id = layoutbuilder.get_type_id
         gcdata = layoutbuilder.initialize_gc_query_function(self.gc)
-        gcdata.init_finalizer_trigger(self.finalizer_trigger)
         self.gcdata = gcdata
 
+        self.finalizer_queue_indexes = {}
+        self.finalizer_handlers = []
+        self.update_finalizer_handlers()
+
         constants = collect_constants(flowgraphs)
         for obj in constants:
             TYPE = lltype.typeOf(obj)
@@ -193,14 +194,27 @@
     def thread_run(self):
         pass
 
-    def finalizer_trigger(self, fq_index):
-        fq = self.finalizer_queues[fq_index]
+    def _get_finalizer_trigger(self, fq):
         graph = self.translator._graphof(fq.finalizer_trigger.im_func)
-        try:
-            self.llinterp.eval_graph(graph, [None], recursive=True)
-        except llinterp.LLException:
-            raise RuntimeError(
-                "finalizer_trigger() raised an exception, shouldn't happen")
+        def ll_trigger():
+            try:
+                self.llinterp.eval_graph(graph, [None], recursive=True)
+            except llinterp.LLException:
+                raise RuntimeError(
+                    "finalizer_trigger() raised an exception, shouldn't 
happen")
+        return ll_trigger
+
+    def update_finalizer_handlers(self):
+        handlers = self.finalizer_handlers
+        ll_handlers = lltype.malloc(gctypelayout.FIN_HANDLER_ARRAY,
+                                    len(handlers), immortal=True)
+        for i in range(len(handlers)):
+            fq, deque = handlers[i]
+            ll_handlers[i].deque = cast_nongc_instance_to_adr(deque)
+            ll_handlers[i].trigger = llhelper(
+                lltype.Ptr(gctypelayout.FIN_TRIGGER_FUNC),
+                self._get_finalizer_trigger(fq))
+        self.gcdata.finalizer_handlers = llmemory.cast_ptr_to_adr(ll_handlers)
 
     def get_finalizer_queue_index(self, fq_tag):
         assert fq_tag.expr == 'FinalizerQueue TAG'
@@ -208,16 +222,21 @@
         try:
             index = self.finalizer_queue_indexes[fq]
         except KeyError:
-            index = self.gcdata.register_next_finalizer_queue(
-                self.gc.AddressDeque)
+            index = len(self.finalizer_handlers)
             self.finalizer_queue_indexes[fq] = index
-            self.finalizer_queues[index] = fq
+            deque = self.gc.AddressDeque()
+            self.finalizer_handlers.append((fq, deque))
+            self.update_finalizer_handlers()
         return index
 
     def gc_fq_next_dead(self, fq_tag):
         index = self.get_finalizer_queue_index(fq_tag)
-        return lltype.cast_opaque_ptr(rclass.OBJECTPTR,
-                                      self.gc.finalizer_next_dead(index))
+        deque = self.finalizer_handlers[index][1]
+        if deque.non_empty():
+            obj = deque.popleft()
+        else:
+            obj = llmemory.NULL
+        return llmemory.cast_adr_to_ptr(obj, rclass.OBJECTPTR)
 
     def gc_fq_register(self, fq_tag, ptr):
         index = self.get_finalizer_queue_index(fq_tag)
diff --git a/rpython/memory/support.py b/rpython/memory/support.py
--- a/rpython/memory/support.py
+++ b/rpython/memory/support.py
@@ -295,6 +295,9 @@
                 cur = next
             free_non_gc_object(self)
 
+        def _was_freed(self):
+            return False    # otherwise, the __class__ changes
+
     cache[chunk_size] = AddressDeque
     return AddressDeque
 
diff --git a/rpython/rtyper/annlowlevel.py b/rpython/rtyper/annlowlevel.py
--- a/rpython/rtyper/annlowlevel.py
+++ b/rpython/rtyper/annlowlevel.py
@@ -476,6 +476,10 @@
     from rpython.rtyper.rclass import NONGCOBJECTPTR
     return cast_object_to_ptr(NONGCOBJECTPTR, instance)
 
[email protected](0)
+def cast_nongc_instance_to_adr(instance):
+    return llmemory.cast_ptr_to_adr(cast_nongc_instance_to_base_ptr(instance))
+
 class CastObjectToPtrEntry(extregistry.ExtRegistryEntry):
     _about_ = cast_object_to_ptr
 
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to