Author: Stefan Beyer <[email protected]>
Branch: cpyext-gc-cycle
Changeset: r95602:65ead3f78618
Date: 2018-04-12 10:21 +0200
http://bitbucket.org/pypy/pypy/changeset/65ead3f78618/
Log: Removed unnecessary code
diff --git a/pypy/module/cpyext/include/object.h
b/pypy/module/cpyext/include/object.h
--- a/pypy/module/cpyext/include/object.h
+++ b/pypy/module/cpyext/include/object.h
@@ -14,8 +14,7 @@
#define PY_SSIZE_T_MIN (-PY_SSIZE_T_MAX-1)
#define PY_REFCNT_FROM_PYPY (4L << ((long)(log(PY_SSIZE_T_MAX) / log(2) - 2)))
-#define PY_REFCNT_GREEN (4L << ((long)(log(PY_SSIZE_T_MAX) / log(2) - 7)))
-#define PY_REFCNT_OVERFLOW (1L << ((long)(log(PY_SSIZE_T_MAX) / log(2) - 7) /
2L - 1L))
+#define PY_REFCNT_OVERFLOW (1L << ((long)(log(PY_SSIZE_T_MAX) / log(2) - 4) -
1L))
#define PY_REFCNT_MASK ((PY_REFCNT_OVERFLOW << 1L) - 1L)
#define Py_RETURN_NONE return (((((PyObject *)(Py_None))->ob_refcnt &
PY_REFCNT_OVERFLOW) == 0) ? \
((PyObject *)(Py_None))->ob_refcnt++ :
Py_IncRef((PyObject *)(Py_None))), Py_None
@@ -48,12 +47,11 @@
Py_IncRef((PyObject *)(ob));
\
} while (0)
#define Py_DECREF(ob) do {
\
- if (!(((PyObject *)(ob))->ob_refcnt &
PY_REFCNT_GREEN) || \
- (((PyObject *)(ob))->ob_refcnt &
PY_REFCNT_OVERFLOW)) \
- Py_DecRef((PyObject *)(ob));
\
+ if ((((PyObject *)(ob))->ob_refcnt &
PY_REFCNT_OVERFLOW)) \
+ Py_DecRef((PyObject *)(ob));
\
else if (--((PyObject *)(ob))->ob_refcnt &
PY_REFCNT_MASK) \
;
\
- else if ((!((PyObject *)(ob))->ob_refcnt) &
PY_REFCNT_FROM_PYPY) \
+ else
\
_Py_Dealloc((PyObject *)(ob));
\
} while (0)
diff --git a/pypy/module/cpyext/pyobject.py b/pypy/module/cpyext/pyobject.py
--- a/pypy/module/cpyext/pyobject.py
+++ b/pypy/module/cpyext/pyobject.py
@@ -18,9 +18,8 @@
from rpython.rtyper.annlowlevel import llhelper, cast_instance_to_base_ptr
from rpython.rlib import rawrefcount, jit
from rpython.rlib.debug import ll_assert, fatalerror, debug_print
-from rpython.rlib.rawrefcount import (
- REFCNT_MASK, REFCNT_FROM_PYPY, REFCNT_OVERFLOW, REFCNT_CYCLE_BUFFERED,
- REFCNT_CLR_MASK, REFCNT_CLR_GREEN, REFCNT_CLR_PURPLE)
+from rpython.rlib.rawrefcount import (REFCNT_MASK, REFCNT_FROM_PYPY,
+ REFCNT_OVERFLOW)
from pypy.module.cpyext.api import slot_function
from pypy.module.cpyext.typeobjectdefs import visitproc
@@ -401,31 +400,13 @@
rawrefcount.decref(pyobj)
rc = pyobj.c_ob_refcnt
if rc & REFCNT_MASK == 0:
- if rc & REFCNT_FROM_PYPY == 0 and rc & REFCNT_CLR_MASK !=
REFCNT_CLR_PURPLE:
- state = space.fromcache(State)
- generic_cpy_call(space, state.C._Py_Dealloc, pyobj)
- elif rc & REFCNT_CLR_MASK != REFCNT_CLR_GREEN:
- possible_root(space, pyobj)
+ state = space.fromcache(State)
+ generic_cpy_call(space, state.C._Py_Dealloc, pyobj)
#else:
# w_obj = rawrefcount.to_obj(W_Root, ref)
# if w_obj is not None:
# assert pyobj.c_ob_refcnt >= rawrefcount.REFCNT_FROM_PYPY
[email protected]_look_inside
-def possible_root(space, obj):
- #debug_print("possible root", obj)
- rc = obj.c_ob_refcnt
- if not obj.c_ob_type or not obj.c_ob_type.c_tp_traverse:
- #debug_print("mark green", obj)
- rc = rc & ~REFCNT_CLR_MASK | REFCNT_CLR_GREEN
- elif rc & REFCNT_CLR_MASK != REFCNT_CLR_PURPLE:
- rc = rc & ~REFCNT_CLR_MASK | REFCNT_CLR_PURPLE
- if rc & REFCNT_CYCLE_BUFFERED == 0:
- #debug_print("mark purple", obj)
- rawrefcount.buffer_pyobj(obj)
- rc = rc | REFCNT_CYCLE_BUFFERED
- obj.c_ob_refcnt = rc
-
@cpython_api([PyObject], lltype.Void)
def Py_IncRef(space, obj):
incref(space, obj)
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
@@ -3067,9 +3067,6 @@
objint = llmemory.cast_adr_to_int(obj, "symbolic")
self._pyobj(pyobject).c_ob_pypy_link = objint
- def rawrefcount_buffer_pyobj(self, pyobject):
- self.rrc_buffered.append(pyobject)
-
def rawrefcount_from_obj(self, gcobj):
obj = llmemory.cast_ptr_to_adr(gcobj)
if self.is_in_nursery(obj):
@@ -3254,12 +3251,11 @@
self.rrc_more_pyobjects_to_scan = self.AddressStack()
def _rrc_mark_cpyobj(self, pyobj):
- from rpython.rlib.rawrefcount import (REFCNT_CLR_GRAY,
- REFCNT_CLR_MASK)
+ from rpython.rlib.rawrefcount import REFCNT_VISITED
# if the pyobj is not marked, remember it and if there is a linked pypy
# object also remember it
- if pyobj.c_ob_refcnt & REFCNT_CLR_MASK != REFCNT_CLR_GRAY:
- pyobj.c_ob_refcnt = REFCNT_CLR_GRAY
+ if pyobj.c_ob_refcnt & REFCNT_VISITED != REFCNT_VISITED:
+ pyobj.c_ob_refcnt |= REFCNT_VISITED
pyobject = llmemory.cast_ptr_to_adr(pyobj)
self.rrc_more_pyobjects_to_scan.append(pyobject)
intobj = pyobj.c_ob_pypy_link
@@ -3270,8 +3266,7 @@
self.objects_to_trace.append(obj)
def _rrc_major_scan_non_rc_roots(self, pyobject, ignore):
- from rpython.rlib.rawrefcount import (REFCNT_CLR_GRAY,
- REFCNT_CLR_MASK)
+ from rpython.rlib.rawrefcount import REFCNT_VISITED
# check in the object header of the linked pypy object, if it is marked
# or not
pyobj = self._pyobj(pyobject)
@@ -3279,9 +3274,9 @@
obj = llmemory.cast_int_to_adr(intobj)
hdr = self.header(obj)
if hdr.tid & GCFLAG_VISITED:
- if pyobj.c_ob_refcnt & REFCNT_CLR_MASK != REFCNT_CLR_GRAY: # TODO
change to black, but make white default
+ if pyobj.c_ob_refcnt & REFCNT_VISITED != REFCNT_VISITED:
# process the pyobject now
- pyobj.c_ob_refcnt = REFCNT_CLR_GRAY
+ pyobj.c_ob_refcnt |= REFCNT_VISITED
self.rrc_pyobjects_to_trace.append(pyobject)
else:
# save the pyobject for later, in case its linked object becomes
diff --git a/rpython/memory/gc/test/test_rawrefcount.py
b/rpython/memory/gc/test/test_rawrefcount.py
--- a/rpython/memory/gc/test/test_rawrefcount.py
+++ b/rpython/memory/gc/test/test_rawrefcount.py
@@ -128,13 +128,6 @@
r1.base.c_ob_refcnt = 1
return r1
- def _rawrefcount_buffer_obj(self, obj):
- from rpython.rlib.rawrefcount import REFCNT_CLR_MASK, REFCNT_CLR_PURPLE
- rc = obj.base.c_ob_refcnt
- obj.base.c_ob_refcnt = rc & ~REFCNT_CLR_MASK | REFCNT_CLR_PURPLE
- objaddr = llmemory.cast_ptr_to_adr(obj)
- self.gc.rawrefcount_buffer_pyobj(objaddr)
-
def test_rawrefcount_objects_basic(self, old=False):
p1, p1ref, r1, r1addr, check_alive = (
self._rawrefcount_pair(42, is_light=True, create_old=old))
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
@@ -490,10 +490,6 @@
GCClass.rawrefcount_mark_deallocating,
[s_gc, s_gcref, SomeAddress()],
annmodel.s_None)
- self.rawrefcount_buffer_pyobj = getfn(
- GCClass.rawrefcount_buffer_pyobj,
- [s_gc, SomeAddress()],
- annmodel.s_None)
self.rawrefcount_from_obj_ptr = getfn(
GCClass.rawrefcount_from_obj, [s_gc, s_gcref], SomeAddress(),
inline = True)
@@ -1346,13 +1342,6 @@
[self.rawrefcount_mark_deallocating, self.c_const_gc,
v_gcobj, v_pyobject])
- def gct_gc_rawrefcount_buffer_pyobj(self, hop):
- [v_pyobject] = hop.spaceop.args
- assert v_pyobject.concretetype == llmemory.Address
- hop.genop("direct_call",
- [self.rawrefcount_buffer_pyobj, self.c_const_gc,
- v_pyobject])
-
def gct_gc_rawrefcount_from_obj(self, hop):
[v_gcobj] = hop.spaceop.args
assert v_gcobj.concretetype == llmemory.GCREF
diff --git a/rpython/rlib/rawrefcount.py b/rpython/rlib/rawrefcount.py
--- a/rpython/rlib/rawrefcount.py
+++ b/rpython/rlib/rawrefcount.py
@@ -17,31 +17,9 @@
# Flags
REFCNT_FROM_PYPY = 1 << MAX_BIT - 2 # Reference
from a pypy object
REFCNT_FROM_PYPY_LIGHT = (1 << MAX_BIT - 1) + REFCNT_FROM_PYPY # Light
reference from a pypy object
-REFCNT_CYCLE_BUFFERED = 1 << MAX_BIT - 3 # Object in
roots buffer (for potential cycles)
-REFCNT_IN_WAVEFRONT = 1 << MAX_BIT - 4 # Object in
any wavefront
-
-# Offsets and sizes
-REFCNT_CLR_OFFS = MAX_BIT - 7
-REFCNT_CRC_OFFS = REFCNT_CLR_OFFS / 2
-REFCNT_BITS = REFCNT_CRC_OFFS - 1
-
-# Concurrent cycle collection colors
-REFCNT_CLR_BLACK = 0 << REFCNT_CLR_OFFS # In use or free (default)
-REFCNT_CLR_GRAY = 1 << REFCNT_CLR_OFFS # Possible member of cycle
-REFCNT_CLR_YELLOW = 2 << REFCNT_CLR_OFFS # Member of garbage cycle
-REFCNT_CLR_PURPLE = 3 << REFCNT_CLR_OFFS # Possible root of cycle
-REFCNT_CLR_GREEN = 4 << REFCNT_CLR_OFFS # Acyclic
-REFCNT_CLR_ORANGE = 5 << REFCNT_CLR_OFFS # In orange wavefront (might change
to YELLOW + IN_WAVEFRONT + phase = 3)
-REFCNT_CLR_MASK = 7 << REFCNT_CLR_OFFS
-
-# Cyclic reference count with overflow bit
-REFCNT_CRC_OVERFLOW = 1 << REFCNT_CRC_OFFS + REFCNT_BITS
-REFCNT_CRC_MASK = (1 << REFCNT_CRC_OFFS + REFCNT_BITS + 1) - 1
-REFCNT_CRC = 1 < REFCNT_CRC_OFFS
-
-# True reference count with overflow bit
-REFCNT_OVERFLOW = 1 << REFCNT_BITS
-REFCNT_MASK = (1 << REFCNT_BITS + 1) - 1
+REFCNT_VISITED = 1 << MAX_BIT - 3 # Object
visited during marking
+REFCNT_OVERFLOW = 1 << MAX_BIT - 4 # Overflow bit
for reference count
+REFCNT_MASK = (REFCNT_OVERFLOW << 1) - 1 # Mask for
reference count (including overflow bit)
PYOBJ_HDR = lltype.Struct('GCHdr_PyObject',
('c_ob_refcnt', lltype.Signed),
@@ -101,7 +79,6 @@
def overflow_get(obj):
return _refcount_overflow[objectmodel.current_object_addr_as_int(obj)]
-# TODO: _cyclic_refcount_overflow = dict()
@not_rpython
def init(dealloc_trigger_callback=None, tp_traverse=None):
@@ -161,10 +138,6 @@
ob.c_ob_pypy_link = _build_pypy_link(marker)
@not_rpython
-def buffer_pyobj(ob):
- pass # TODO: implement?
-
-@not_rpython
def from_obj(OB_PTR_TYPE, p):
ob = _pypy2ob.get(p)
if ob is None:
@@ -350,18 +323,6 @@
hop.genop('direct_call', [c_func])
class Entry(ExtRegistryEntry):
- _about_ = buffer_pyobj
-
- def compute_result_annotation(self, s_ob):
- pass
-
- def specialize_call(self, hop):
- name = 'gc_rawrefcount_buffer_pyobj'
- hop.exception_cannot_occur()
- v_ob = hop.inputarg(hop.args_r[0], arg=0)
- hop.genop(name, [_unspec_ob(hop, v_ob)])
-
-class Entry(ExtRegistryEntry):
_about_ = from_obj
def compute_result_annotation(self, s_OB_PTR_TYPE, s_p):
diff --git a/rpython/rtyper/llinterp.py b/rpython/rtyper/llinterp.py
--- a/rpython/rtyper/llinterp.py
+++ b/rpython/rtyper/llinterp.py
@@ -969,9 +969,6 @@
def op_gc_rawrefcount_mark_deallocating(self, *args):
raise NotImplementedError("gc_rawrefcount_mark_deallocating")
- def op_gc_rawrefcount_buffer_pyobj(self, *args):
- raise NotImplementedError("gc_rawrefcount_buffer_pyobj")
-
def op_gc_rawrefcount_next_dead(self, *args):
raise NotImplementedError("gc_rawrefcount_next_dead")
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
@@ -494,7 +494,6 @@
'gc_rawrefcount_create_link_pypy': LLOp(),
'gc_rawrefcount_create_link_pyobj': LLOp(),
'gc_rawrefcount_mark_deallocating': LLOp(),
- 'gc_rawrefcount_buffer_pyobj': LLOp(),
'gc_rawrefcount_from_obj': LLOp(sideeffects=False),
'gc_rawrefcount_to_obj': LLOp(sideeffects=False),
'gc_rawrefcount_next_dead': LLOp(),
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit