[pypy-commit] pypy gc_no_cleanup_nursery: kill malloc_nonmovable - it turned out to be a bad idea to start with

fijal noreply at buildbot.pypy.org
Wed Sep 3 19:29:14 CEST 2014


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: gc_no_cleanup_nursery
Changeset: r73289:b1e335a09328
Date: 2014-09-03 11:28 -0600
http://bitbucket.org/pypy/pypy/changeset/b1e335a09328/

Log:	kill malloc_nonmovable - it turned out to be a bad idea to start
	with

diff --git a/pypy/tool/pypyjit_child.py b/pypy/tool/pypyjit_child.py
--- a/pypy/tool/pypyjit_child.py
+++ b/pypy/tool/pypyjit_child.py
@@ -10,10 +10,6 @@
     graph = loc['graph']
     interp.malloc_check = False
 
-    def returns_null(T, *args, **kwds):
-        return lltype.nullptr(T)
-    interp.heap.malloc_nonmovable = returns_null     # XXX
-
     from rpython.jit.backend.llgraph.runner import LLGraphCPU
     #LLtypeCPU.supports_floats = False     # for now
     apply_jit(interp, graph, LLGraphCPU)
diff --git a/rpython/jit/backend/llsupport/test/zrpy_gc_test.py b/rpython/jit/backend/llsupport/test/zrpy_gc_test.py
--- a/rpython/jit/backend/llsupport/test/zrpy_gc_test.py
+++ b/rpython/jit/backend/llsupport/test/zrpy_gc_test.py
@@ -223,7 +223,7 @@
 ##        return None, f, None
 
     def define_compile_framework_1(cls):
-        # a moving GC.  Supports malloc_varsize_nonmovable.  Simple test, works
+        # a moving GC.  Simple test, works
         # without write_barriers and root stack enumeration.
         def f(n, x, *args):
             y = X()
diff --git a/rpython/jit/tl/jittest.py b/rpython/jit/tl/jittest.py
--- a/rpython/jit/tl/jittest.py
+++ b/rpython/jit/tl/jittest.py
@@ -6,7 +6,6 @@
 
 import os
 from rpython import conftest
-from rpython.rtyper.lltypesystem import lltype
 from rpython.rtyper.llinterp import LLInterpreter
 from rpython.rtyper.annlowlevel import llstr
 from rpython.jit.metainterp import warmspot
@@ -24,10 +23,6 @@
     graph = driver.translator._graphof(driver.entry_point)
     interp = LLInterpreter(driver.translator.rtyper)
 
-    def returns_null(T, *args, **kwds):
-        return lltype.nullptr(T)
-    interp.heap.malloc_nonmovable = returns_null     # XXX
-
     get_policy = driver.extra['jitpolicy']
     jitpolicy = get_policy(driver)
 
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
@@ -47,9 +47,6 @@
     def _teardown(self):
         pass
 
-    def can_malloc_nonmovable(self):
-        return not self.moving_gc
-
     def can_optimize_clean_setarrayitems(self):
         return True     # False in case of card marking
 
@@ -168,9 +165,6 @@
         # lots of cast and reverse-cast around...
         return llmemory.cast_ptr_to_adr(ref)
 
-    def malloc_nonmovable(self, typeid, length=0, zero=False):
-        return self.malloc(typeid, length, zero)
-
     def id(self, ptr):
         return lltype.cast_ptr_to_int(ptr)
 
diff --git a/rpython/memory/gc/hybrid.py b/rpython/memory/gc/hybrid.py
--- a/rpython/memory/gc/hybrid.py
+++ b/rpython/memory/gc/hybrid.py
@@ -167,7 +167,7 @@
                                                 llmemory.GCREF)
         return self.malloc_varsize_slowpath(typeid, length)
 
-    def malloc_varsize_slowpath(self, typeid, length, force_nonmovable=False):
+    def malloc_varsize_slowpath(self, typeid, length):
         # For objects that are too large, or when the nursery is exhausted.
         # In order to keep malloc_varsize_clear() as compact as possible,
         # we recompute what we need in this slow path instead of passing
@@ -185,7 +185,7 @@
             nonlarge_max = self.nonlarge_gcptrs_max
         else:
             nonlarge_max = self.nonlarge_max
-        if force_nonmovable or raw_malloc_usage(totalsize) > nonlarge_max:
+        if raw_malloc_usage(totalsize) > nonlarge_max:
             result = self.malloc_varsize_marknsweep(totalsize)
             flags = self.GCFLAGS_FOR_NEW_EXTERNAL_OBJECTS | GCFLAG_UNVISITED
         else:
@@ -197,17 +197,6 @@
 
     malloc_varsize_slowpath._dont_inline_ = True
 
-    def malloc_varsize_nonmovable(self, typeid, length):
-        return self.malloc_varsize_slowpath(typeid, length, True)
-
-    def malloc_nonmovable(self, typeid, length, zero):
-        # helper for testing, same as GCBase.malloc
-        if self.is_varsize(typeid):
-            gcref = self.malloc_varsize_slowpath(typeid, length, True)
-        else:
-            raise NotImplementedError("Not supported")
-        return llmemory.cast_ptr_to_adr(gcref)
-
     def can_move(self, addr):
         tid = self.header(addr).tid
         return not (tid & GCFLAG_EXTERNAL)
@@ -554,6 +543,3 @@
                   "gen3: unexpected GCFLAG_UNVISITED")
         ll_assert((tid & GCFLAG_AGE_MASK) == GCFLAG_AGE_MAX,
                   "gen3: wrong age field")
-
-    def can_malloc_nonmovable(self):
-        return True
diff --git a/rpython/memory/gc/incminimark.py b/rpython/memory/gc/incminimark.py
--- a/rpython/memory/gc/incminimark.py
+++ b/rpython/memory/gc/incminimark.py
@@ -427,7 +427,7 @@
         # the start of the nursery: we actually allocate a bit more for
         # the nursery than really needed, to simplify pointer arithmetic
         # in malloc_fixedsize_clear().  The few extra pages are never used
-        # anyway so it doesn't even count.
+        # anyway so it doesn't even counct.
         nursery = llarena.arena_malloc(self._nursery_memory_size(), 0)
         if not nursery:
             raise MemoryError("cannot allocate nursery")
@@ -830,9 +830,6 @@
             # that one will occur very soon
             self.nursery_free = self.nursery_top
 
-    def can_malloc_nonmovable(self):
-        return True
-
     def can_optimize_clean_setarrayitems(self):
         if self.card_page_indices > 0:
             return False
@@ -868,20 +865,6 @@
         (obj + offset_to_length).signed[0] = smallerlength
         return True
 
-
-    def malloc_fixedsize_nonmovable(self, typeid):
-        obj = self.external_malloc(typeid, 0)
-        return llmemory.cast_adr_to_ptr(obj, llmemory.GCREF)
-
-    def malloc_varsize_nonmovable(self, typeid, length):
-        obj = self.external_malloc(typeid, length)
-        return llmemory.cast_adr_to_ptr(obj, llmemory.GCREF)
-
-    def malloc_nonmovable(self, typeid, length, zero):
-        # helper for testing, same as GCBase.malloc
-        return self.external_malloc(typeid, length or 0)    # None -> 0
-
-
     # ----------
     # Simple helpers
 
diff --git a/rpython/memory/gc/minimark.py b/rpython/memory/gc/minimark.py
--- a/rpython/memory/gc/minimark.py
+++ b/rpython/memory/gc/minimark.py
@@ -822,9 +822,6 @@
             self.nursery_top = self.nursery_real_top
             self.nursery_free = self.nursery_real_top
 
-    def can_malloc_nonmovable(self):
-        return True
-
     def can_optimize_clean_setarrayitems(self):
         if self.card_page_indices > 0:
             return False
@@ -861,19 +858,6 @@
         return True
 
 
-    def malloc_fixedsize_nonmovable(self, typeid):
-        obj = self.external_malloc(typeid, 0)
-        return llmemory.cast_adr_to_ptr(obj, llmemory.GCREF)
-
-    def malloc_varsize_nonmovable(self, typeid, length):
-        obj = self.external_malloc(typeid, length)
-        return llmemory.cast_adr_to_ptr(obj, llmemory.GCREF)
-
-    def malloc_nonmovable(self, typeid, length, zero):
-        # helper for testing, same as GCBase.malloc
-        return self.external_malloc(typeid, length or 0)    # None -> 0
-
-
     # ----------
     # Simple helpers
 
diff --git a/rpython/memory/gctransform/framework.py b/rpython/memory/gctransform/framework.py
--- a/rpython/memory/gctransform/framework.py
+++ b/rpython/memory/gctransform/framework.py
@@ -388,17 +388,6 @@
                 annmodel.SomeInteger(nonneg=True)], s_gcref,
                 inline = True)
 
-        if getattr(GCClass, 'malloc_varsize_nonmovable', False):
-            malloc_nonmovable = func_with_new_name(
-                GCClass.malloc_varsize_nonmovable.im_func,
-                "malloc_varsize_nonmovable")
-            self.malloc_varsize_nonmovable_ptr = getfn(
-                malloc_nonmovable,
-                [s_gc, s_typeid16,
-                 annmodel.SomeInteger(nonneg=True)], s_gcref)
-        else:
-            self.malloc_varsize_nonmovable_ptr = None
-
         if getattr(GCClass, 'raw_malloc_memory_pressure', False):
             def raw_malloc_memory_pressure_varsize(length, itemsize):
                 totalmem = length * itemsize
@@ -665,7 +654,6 @@
                                                   has_light_finalizer)
 
         if not op.opname.endswith('_varsize') and not flags.get('varsize'):
-            #TODO:check if it's safe to remove the zero-flag
             zero = flags.get('zero', False)
             if (self.malloc_fast_ptr is not None and
                 not c_has_finalizer.value and
@@ -684,18 +672,12 @@
                                               info_varsize.ofstolength)
             c_varitemsize = rmodel.inputconst(lltype.Signed,
                                               info_varsize.varitemsize)
-            if flags.get('nonmovable') and self.malloc_varsize_nonmovable_ptr:
-                # we don't have tests for such cases, let's fail
-                # explicitely
-                malloc_ptr = self.malloc_varsize_nonmovable_ptr
-                args = [self.c_const_gc, c_type_id, v_length]
+            if self.malloc_varsize_fast_ptr is not None:
+                malloc_ptr = self.malloc_varsize_fast_ptr
             else:
-                if self.malloc_varsize_fast_ptr is not None:
-                    malloc_ptr = self.malloc_varsize_fast_ptr
-                else:
-                    malloc_ptr = self.malloc_varsize_ptr
-                args = [self.c_const_gc, c_type_id, v_length, c_size,
-                        c_varitemsize, c_ofstolength]
+                malloc_ptr = self.malloc_varsize_ptr
+            args = [self.c_const_gc, c_type_id, v_length, c_size,
+                    c_varitemsize, c_ofstolength]
         livevars = self.push_roots(hop)
         v_result = hop.genop("direct_call", [malloc_ptr] + args,
                              resulttype=llmemory.GCREF)
@@ -1076,20 +1058,6 @@
                   resultvar=hop.spaceop.result)
         self.pop_roots(hop, livevars)
 
-    def gct_malloc_nonmovable_varsize(self, hop):
-        TYPE = hop.spaceop.result.concretetype
-        if self.gcdata.gc.can_malloc_nonmovable():
-            return self.gct_malloc_varsize(hop, {'nonmovable':True})
-        c = rmodel.inputconst(TYPE, lltype.nullptr(TYPE.TO))
-        return hop.cast_result(c)
-
-    def gct_malloc_nonmovable(self, hop):
-        TYPE = hop.spaceop.result.concretetype
-        if self.gcdata.gc.can_malloc_nonmovable():
-            return self.gct_malloc(hop, {'nonmovable':True})
-        c = rmodel.inputconst(TYPE, lltype.nullptr(TYPE.TO))
-        return hop.cast_result(c)
-
     def _set_into_gc_array_part(self, op):
         if op.opname == 'setarrayitem':
             return op.args[1]
@@ -1231,7 +1199,7 @@
                 v_adr = llops.genop('adr_add', [v_a, c_fixedofs],
                                     resulttype=llmemory.Address)
                 llops.genop('raw_memclear', [v_adr, v_totalsize])
-            elif isinstance(TYPE, lltype.Struct):
+            elif isinstance(ITEM, lltype.Struct):
                 xxx
             return
         else:
diff --git a/rpython/memory/gctransform/transform.py b/rpython/memory/gctransform/transform.py
--- a/rpython/memory/gctransform/transform.py
+++ b/rpython/memory/gctransform/transform.py
@@ -510,12 +510,6 @@
         assert meth, "%s has no support for malloc_varsize with flavor %r" % (self, flavor)
         return self.varsize_malloc_helper(hop, flags, meth, [])
 
-    def gct_malloc_nonmovable(self, *args, **kwds):
-        return self.gct_malloc(*args, **kwds)
-
-    def gct_malloc_nonmovable_varsize(self, *args, **kwds):
-        return self.gct_malloc_varsize(*args, **kwds)
-
     def gct_gc_add_memory_pressure(self, hop):
         if hasattr(self, 'raw_malloc_memory_pressure_ptr'):
             op = hop.spaceop
diff --git a/rpython/memory/gcwrapper.py b/rpython/memory/gcwrapper.py
--- a/rpython/memory/gcwrapper.py
+++ b/rpython/memory/gcwrapper.py
@@ -57,16 +57,6 @@
             return lltype.malloc(TYPE, n, flavor=flavor, zero=zero,
                                  track_allocation=track_allocation)
 
-    def malloc_nonmovable(self, TYPE, n=None, zero=False):
-        typeid = self.get_type_id(TYPE)
-        if not self.gc.can_malloc_nonmovable():
-            return lltype.nullptr(TYPE)
-        addr = self.gc.malloc_nonmovable(typeid, n, zero=zero)
-        result = llmemory.cast_adr_to_ptr(addr, lltype.Ptr(TYPE))
-        if not self.gc.malloc_zero_filled:
-            gctypelayout.zero_gc_pointers(result)
-        return result
-
     def add_memory_pressure(self, size):
         if hasattr(self.gc, 'raw_malloc_memory_pressure'):
             self.gc.raw_malloc_memory_pressure(size)
diff --git a/rpython/memory/test/gc_test_base.py b/rpython/memory/test/gc_test_base.py
--- a/rpython/memory/test/gc_test_base.py
+++ b/rpython/memory/test/gc_test_base.py
@@ -25,7 +25,6 @@
 class GCTest(object):
     GC_PARAMS = {}
     GC_CAN_MOVE = False
-    GC_CAN_MALLOC_NONMOVABLE = True
     GC_CAN_SHRINK_ARRAY = False
     GC_CAN_SHRINK_BIG_ARRAY = False
     BUT_HOW_BIG_IS_A_BIG_STRING = 3*WORD
@@ -614,34 +613,6 @@
             return rgc.can_move(lltype.malloc(TP, 1))
         assert self.interpret(func, []) == self.GC_CAN_MOVE
 
-
-    def test_malloc_nonmovable(self):
-        TP = lltype.GcArray(lltype.Char)
-        def func():
-            a = rgc.malloc_nonmovable(TP, 3)
-            if a:
-                assert not rgc.can_move(a)
-                return 1
-            return 0
-
-        assert self.interpret(func, []) == int(self.GC_CAN_MALLOC_NONMOVABLE)
-
-    def test_malloc_nonmovable_fixsize(self):
-        S = lltype.GcStruct('S', ('x', lltype.Float))
-        TP = lltype.GcStruct('T', ('s', lltype.Ptr(S)))
-        def func():
-            try:
-                a = rgc.malloc_nonmovable(TP)
-                rgc.collect()
-                if a:
-                    assert not rgc.can_move(a)
-                    return 1
-                return 0
-            except Exception:
-                return 2
-
-        assert self.interpret(func, []) == int(self.GC_CAN_MALLOC_NONMOVABLE)
-
     def test_shrink_array(self):
         from rpython.rtyper.lltypesystem.rstr import STR
 
diff --git a/rpython/memory/test/test_hybrid_gc.py b/rpython/memory/test/test_hybrid_gc.py
--- a/rpython/memory/test/test_hybrid_gc.py
+++ b/rpython/memory/test/test_hybrid_gc.py
@@ -8,7 +8,6 @@
 
 class TestHybridGC(test_generational_gc.TestGenerationalGC):
     from rpython.memory.gc.hybrid import HybridGC as GCClass
-    GC_CAN_MALLOC_NONMOVABLE = True
     GC_CAN_SHRINK_BIG_ARRAY = False
 
     def test_ref_from_rawmalloced_to_regular(self):
@@ -71,6 +70,3 @@
             return b.num_deleted
         res = self.interpret(f, [15])
         assert res == 16
-
-    def test_malloc_nonmovable_fixsize(self):
-        py.test.skip("Not supported")
diff --git a/rpython/memory/test/test_hybrid_gc_smallheap.py b/rpython/memory/test/test_hybrid_gc_smallheap.py
--- a/rpython/memory/test/test_hybrid_gc_smallheap.py
+++ b/rpython/memory/test/test_hybrid_gc_smallheap.py
@@ -10,7 +10,6 @@
     from rpython.memory.gc.hybrid import HybridGC as GCClass
     GC_CAN_MOVE = False # with this size of heap, stuff gets allocated
                         # in 3rd gen.
-    GC_CAN_MALLOC_NONMOVABLE = True
     GC_PARAMS = {'space_size': 48*WORD,
                  'min_nursery_size': 12*WORD,
                  'nursery_size': 12*WORD,
@@ -51,6 +50,3 @@
                     return i
         res = self.interpret(f, [200])
         assert res == 401
-
-    def test_malloc_nonmovable_fixsize(self):
-        py.test.skip("Not supported")
diff --git a/rpython/memory/test/test_transformed_gc.py b/rpython/memory/test/test_transformed_gc.py
--- a/rpython/memory/test/test_transformed_gc.py
+++ b/rpython/memory/test/test_transformed_gc.py
@@ -44,7 +44,6 @@
 class GCTest(object):
     gcpolicy = None
     GC_CAN_MOVE = False
-    GC_CAN_MALLOC_NONMOVABLE = True
     taggedpointers = False
 
     def setup_class(cls):
@@ -622,45 +621,6 @@
         res = run([])
         assert res == self.GC_CAN_MOVE
 
-    def define_malloc_nonmovable(cls):
-        TP = lltype.GcArray(lltype.Char)
-        def func():
-            #try:
-            a = rgc.malloc_nonmovable(TP, 3, zero=True)
-            rgc.collect()
-            if a:
-                assert not rgc.can_move(a)
-                return 1
-            return 0
-            #except Exception, e:
-            #    return 2
-
-        return func
-
-    def test_malloc_nonmovable(self):
-        run = self.runner("malloc_nonmovable")
-        assert int(self.GC_CAN_MALLOC_NONMOVABLE) == run([])
-
-    def define_malloc_nonmovable_fixsize(cls):
-        S = lltype.GcStruct('S', ('x', lltype.Float))
-        TP = lltype.GcStruct('T', ('s', lltype.Ptr(S)))
-        def func():
-            try:
-                a = rgc.malloc_nonmovable(TP)
-                rgc.collect()
-                if a:
-                    assert not rgc.can_move(a)
-                    return 1
-                return 0
-            except Exception, e:
-                return 2
-
-        return func
-
-    def test_malloc_nonmovable_fixsize(self):
-        run = self.runner("malloc_nonmovable_fixsize")
-        assert run([]) == int(self.GC_CAN_MALLOC_NONMOVABLE)
-
     def define_shrink_array(cls):
         from rpython.rtyper.lltypesystem.rstr import STR
 
@@ -708,7 +668,6 @@
 
 class GenericMovingGCTests(GenericGCTests):
     GC_CAN_MOVE = True
-    GC_CAN_MALLOC_NONMOVABLE = False
     GC_CAN_TEST_ID = False
     def define_many_ids(cls):
         class A(object):
@@ -1169,7 +1128,6 @@
 
 class TestHybridGC(TestGenerationGC):
     gcname = "hybrid"
-    GC_CAN_MALLOC_NONMOVABLE = True
 
     class gcpolicy(gc.BasicFrameworkGcPolicy):
         class transformerclass(shadowstack.ShadowStackFrameworkGCTransformer):
@@ -1230,9 +1188,6 @@
         run = self.runner("write_barrier_direct")
         res = run([])
         assert res == 42
-
-    def test_malloc_nonmovable_fixsize(self):
-        py.test.skip("not supported")
     
 class TestMiniMarkGC(TestHybridGC):
     gcname = "minimark"
diff --git a/rpython/rlib/rgc.py b/rpython/rlib/rgc.py
--- a/rpython/rlib/rgc.py
+++ b/rpython/rlib/rgc.py
@@ -101,40 +101,6 @@
         hop.exception_is_here()
         return hop.genop('gc_heap_stats', [], resulttype=hop.r_result)
 
-def malloc_nonmovable(TP, n=None, zero=False):
-    """ Allocate a non-moving buffer or return nullptr.
-    When running directly, will pretend that gc is always
-    moving (might be configurable in a future)
-    """
-    return lltype.nullptr(TP)
-
-class MallocNonMovingEntry(ExtRegistryEntry):
-    _about_ = malloc_nonmovable
-
-    def compute_result_annotation(self, s_TP, s_n=None, s_zero=None):
-        # basically return the same as malloc
-        from rpython.annotator.builtin import BUILTIN_ANALYZERS
-        return BUILTIN_ANALYZERS[lltype.malloc](s_TP, s_n, s_zero=s_zero)
-
-    def specialize_call(self, hop, i_zero=None):
-        # XXX assume flavor and zero to be None by now
-        assert hop.args_s[0].is_constant()
-        vlist = [hop.inputarg(lltype.Void, arg=0)]
-        opname = 'malloc_nonmovable'
-        flags = {'flavor': 'gc'}
-        if i_zero is not None:
-            flags['zero'] = hop.args_s[i_zero].const
-            nb_args = hop.nb_args - 1
-        else:
-            nb_args = hop.nb_args
-        vlist.append(hop.inputconst(lltype.Void, flags))
-
-        if nb_args == 2:
-            vlist.append(hop.inputarg(lltype.Signed, arg=1))
-            opname += '_varsize'
-
-        hop.exception_cannot_occur()
-        return hop.genop(opname, vlist, resulttype = hop.r_result.lowleveltype)
 
 def copy_struct_item(source, dest, si, di):
     TP = lltype.typeOf(source).TO.OF
diff --git a/rpython/rtyper/llinterp.py b/rpython/rtyper/llinterp.py
--- a/rpython/rtyper/llinterp.py
+++ b/rpython/rtyper/llinterp.py
@@ -682,18 +682,6 @@
         except MemoryError:
             self.make_llexception()
 
-    def op_malloc_nonmovable(self, TYPE, flags):
-        flavor = flags['flavor']
-        assert flavor == 'gc'
-        zero = flags.get('zero', False)
-        return self.heap.malloc_nonmovable(TYPE, zero=zero)
-
-    def op_malloc_nonmovable_varsize(self, TYPE, flags, size):
-        flavor = flags['flavor']
-        assert flavor == 'gc'
-        zero = flags.get('zero', False)
-        return self.heap.malloc_nonmovable(TYPE, size, zero=zero)
-
     def op_free(self, obj, flags):
         assert flags['flavor'] == 'raw'
         track_allocation = flags.get('track_allocation', True)
diff --git a/rpython/rtyper/lltypesystem/llheap.py b/rpython/rtyper/lltypesystem/llheap.py
--- a/rpython/rtyper/lltypesystem/llheap.py
+++ b/rpython/rtyper/lltypesystem/llheap.py
@@ -18,7 +18,6 @@
 def weakref_create_getlazy(objgetter):
     return weakref_create(objgetter())
 
-malloc_nonmovable = malloc
 
 def shrink_array(p, smallersize):
     return False
diff --git a/rpython/rtyper/lltypesystem/lloperation.py b/rpython/rtyper/lltypesystem/lloperation.py
--- a/rpython/rtyper/lltypesystem/lloperation.py
+++ b/rpython/rtyper/lltypesystem/lloperation.py
@@ -368,8 +368,6 @@
 
     'malloc':               LLOp(canmallocgc=True),
     'malloc_varsize':       LLOp(canmallocgc=True),
-    'malloc_nonmovable':    LLOp(canmallocgc=True),
-    'malloc_nonmovable_varsize':LLOp(canmallocgc=True),
     'shrink_array':         LLOp(canrun=True),
     'zero_gc_pointers_inside': LLOp(),
     'free':                 LLOp(),
diff --git a/rpython/rtyper/lltypesystem/rclass.py b/rpython/rtyper/lltypesystem/rclass.py
--- a/rpython/rtyper/lltypesystem/rclass.py
+++ b/rpython/rtyper/lltypesystem/rclass.py
@@ -505,13 +505,7 @@
         ctype = inputconst(Void, self.object_type)
         cflags = inputconst(Void, flags)
         vlist = [ctype, cflags]
-        cnonmovable = self.classdef.classdesc.read_attribute(
-            '_alloc_nonmovable_', Constant(False))
-        if cnonmovable.value:
-            opname = 'malloc_nonmovable'
-        else:
-            opname = 'malloc'
-        vptr = llops.genop(opname, vlist,
+        vptr = llops.genop('malloc', vlist,
                            resulttype = Ptr(self.object_type))
         ctypeptr = inputconst(CLASSTYPE, self.rclass.getvtable())
         self.setfield(vptr, '__class__', ctypeptr, llops)
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
@@ -2,6 +2,7 @@
 from rpython.flowspace.model import Constant
 from rpython.rtyper.rdict import AbstractDictRepr, AbstractDictIteratorRepr
 from rpython.rtyper.lltypesystem import lltype
+from rpython.rtyper.lltypesystem.lloperation import llop
 from rpython.rlib import objectmodel, jit
 from rpython.rlib.debug import ll_assert
 from rpython.rlib.rarithmetic import r_uint, intmask, LONG_BIT
@@ -615,18 +616,22 @@
         i = i & mask
         # keep 'i' as a signed number here, to consistently pass signed
         # arguments to the small helper methods.
+        llop.debug_print(lltype.Void, "looking in", i)
         if not entries.everused(i):
             if freeslot == -1:
                 freeslot = intmask(i)
             return r_uint(freeslot) | HIGHEST_BIT
         elif entries.valid(i):
+            llop.debug_print(lltype.Void, "found!", hash, entries.hash(i))
             checkingkey = entries[i].key
             if direct_compare and checkingkey == key:
                 return i
             if d.keyeq is not None and entries.hash(i) == hash:
                 # correct hash, maybe the key is e.g. a different pointer to
                 # an equal object
+                llop.debug_print(lltype.Void, "hashes compare")
                 found = d.keyeq(checkingkey, key)
+                llop.debug_print(lltype.Void, "found", found)
                 if d.paranoia:
                     if (entries != d.entries or
                         not entries.valid(i) or entries[i].key != checkingkey):
diff --git a/rpython/rtyper/test/test_rclass.py b/rpython/rtyper/test/test_rclass.py
--- a/rpython/rtyper/test/test_rclass.py
+++ b/rpython/rtyper/test/test_rclass.py
@@ -1144,17 +1144,6 @@
             assert sorted([u]) == [6]                    # 32-bit types
             assert sorted([i, r, d, l]) == [2, 3, 4, 5]  # 64-bit types
 
-    def test_nonmovable(self):
-        for (nonmovable, opname) in [(True, 'malloc_nonmovable'),
-                                     (False, 'malloc')]:
-            class A(object):
-                _alloc_nonmovable_ = nonmovable
-            def f():
-                return A()
-            t, typer, graph = self.gengraph(f, [])
-            assert summary(graph) == {opname: 1,
-                                      'cast_pointer': 1,
-                                      'setfield': 1}
 
     def test_iter(self):
         class Iterable(object):
diff --git a/rpython/translator/c/test/test_boehm.py b/rpython/translator/c/test/test_boehm.py
--- a/rpython/translator/c/test/test_boehm.py
+++ b/rpython/translator/c/test/test_boehm.py
@@ -336,22 +336,6 @@
         c_fn = self.getcompiled(fn, [])
         assert not c_fn()
 
-    def test_malloc_nonmovable(self):
-        TP = lltype.GcArray(lltype.Char)
-        def func():
-            try:
-                a = rgc.malloc_nonmovable(TP, 3)
-                rgc.collect()
-                if a:
-                    assert not rgc.can_move(a)
-                    return 0
-                return 1
-            except Exception:
-                return 2
-
-        run = self.getcompiled(func)
-        assert run() == 0
-
     def test_shrink_array(self):
         def f():
             ptr = lltype.malloc(STR, 3)
diff --git a/rpython/translator/c/test/test_newgc.py b/rpython/translator/c/test/test_newgc.py
--- a/rpython/translator/c/test/test_newgc.py
+++ b/rpython/translator/c/test/test_newgc.py
@@ -22,7 +22,6 @@
     removetypeptr = False
     taggedpointers = False
     GC_CAN_MOVE = False
-    GC_CAN_MALLOC_NONMOVABLE = True
     GC_CAN_SHRINK_ARRAY = False
 
     _isolated_func = None
@@ -721,25 +720,6 @@
     def test_can_move(self):
         assert self.run('can_move') == self.GC_CAN_MOVE
 
-    def define_malloc_nonmovable(cls):
-        TP = lltype.GcArray(lltype.Char)
-        def func():
-            try:
-                a = rgc.malloc_nonmovable(TP, 3)
-                rgc.collect()
-                if a:
-                    assert not rgc.can_move(a)
-                    return 1
-                return 0
-            except Exception:
-                return 2
-
-        return func
-
-    def test_malloc_nonmovable(self):
-        res = self.run('malloc_nonmovable')
-        assert res == self.GC_CAN_MALLOC_NONMOVABLE
-
     def define_resizable_buffer(cls):
         from rpython.rtyper.lltypesystem.rstr import STR
 
@@ -1219,7 +1199,6 @@
     gcpolicy = "semispace"
     should_be_moving = True
     GC_CAN_MOVE = True
-    GC_CAN_MALLOC_NONMOVABLE = False
     GC_CAN_SHRINK_ARRAY = True
 
     # for snippets
@@ -1420,7 +1399,6 @@
 class TestHybridGC(TestGenerationalGC):
     gcpolicy = "hybrid"
     should_be_moving = True
-    GC_CAN_MALLOC_NONMOVABLE = True
 
     def test_gc_set_max_heap_size(self):
         py.test.skip("not implemented")
@@ -1433,7 +1411,6 @@
 class TestMiniMarkGC(TestSemiSpaceGC):
     gcpolicy = "minimark"
     should_be_moving = True
-    GC_CAN_MALLOC_NONMOVABLE = True
     GC_CAN_SHRINK_ARRAY = True
 
     def test_gc_heap_stats(self):
diff --git a/rpython/translator/exceptiontransform.py b/rpython/translator/exceptiontransform.py
--- a/rpython/translator/exceptiontransform.py
+++ b/rpython/translator/exceptiontransform.py
@@ -251,8 +251,7 @@
               len(block.operations) and
               (block.exits[0].args[0].concretetype is lltype.Void or
                block.exits[0].args[0] is block.operations[-1].result) and
-              block.operations[-1].opname not in ('malloc',     # special cases
-                                                  'malloc_nonmovable')):
+              block.operations[-1].opname != 'malloc'):     # special cases
             last_operation -= 1
         lastblock = block
         for i in range(last_operation, -1, -1):
@@ -423,14 +422,6 @@
             flavor = spaceop.args[1].value['flavor']
             if flavor == 'gc':
                 insert_zeroing_op = True
-        elif spaceop.opname == 'malloc_nonmovable':
-            # xxx we cannot insert zero_gc_pointers_inside after
-            # malloc_nonmovable, because it can return null.  For now
-            # we simply always force the zero=True flag on
-            # malloc_nonmovable.
-            c_flags = spaceop.args[1]
-            c_flags.value = c_flags.value.copy()
-            spaceop.args[1].value['zero'] = True
         # NB. when inserting more special-cases here, keep in mind that
         # you also need to list the opnames in transform_block()
         # (see "special cases")


More information about the pypy-commit mailing list