Author: Armin Rigo <[email protected]>
Branch: py3.6
Changeset: r97241:27e4db43a117
Date: 2019-08-22 12:04 +0200
http://bitbucket.org/pypy/pypy/changeset/27e4db43a117/
Log: hg merge default
diff --git a/pypy/module/gc/referents.py b/pypy/module/gc/referents.py
--- a/pypy/module/gc/referents.py
+++ b/pypy/module/gc/referents.py
@@ -14,6 +14,8 @@
def try_cast_gcref_to_w_root(gcref):
+ if rgc.get_gcflag_dummy(gcref):
+ return None
w_obj = rgc.try_cast_gcref_to_instance(W_Root, gcref)
# Ignore the instances of W_Root that are not really valid as Python
# objects. There is e.g. WeakrefLifeline in module/_weakref that
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
@@ -23,6 +23,7 @@
can_usually_pin_objects = False
object_minimal_size = 0
gcflag_extra = 0 # or a dedicated GC flag that the GC initializes to 0
+ gcflag_dummy = 0 # dedicated GC flag set only on rmodel.ll_dummy_value
_totalroots_rpy = 0 # for inspector.py
def __init__(self, config, chunk_size=DEFAULT_CHUNK_SIZE,
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
@@ -162,7 +162,11 @@
# It does not need an additional copy in trace out
GCFLAG_SHADOW_INITIALIZED = first_gcflag << 11
-_GCFLAG_FIRST_UNUSED = first_gcflag << 12 # the first unused bit
+# another flag set only on specific objects: the ll_dummy_value from
+# rpython.rtyper.rmodel
+GCFLAG_DUMMY = first_gcflag << 12
+
+_GCFLAG_FIRST_UNUSED = first_gcflag << 13 # the first unused bit
# States for the incremental GC
@@ -203,6 +207,7 @@
can_usually_pin_objects = True
malloc_zero_filled = False
gcflag_extra = GCFLAG_EXTRA
+ gcflag_dummy = GCFLAG_DUMMY
# All objects start with a HDR, i.e. with a field 'tid' which contains
# a word. This word is divided in two halves: the lower half contains
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
@@ -122,7 +122,11 @@
# note that GCFLAG_CARDS_SET is the most significant bit of a byte:
# this is required for the JIT (x86)
-_GCFLAG_FIRST_UNUSED = first_gcflag << 8 # the first unused bit
+# another flag set only on specific objects: the ll_dummy_value from
+# rpython.rtyper.rmodel
+GCFLAG_DUMMY = first_gcflag << 8
+
+_GCFLAG_FIRST_UNUSED = first_gcflag << 9 # the first unused bit
FORWARDSTUB = lltype.GcStruct('forwarding_stub',
@@ -140,6 +144,7 @@
prebuilt_gc_objects_are_static_roots = False
malloc_zero_filled = True # xxx experiment with False
gcflag_extra = GCFLAG_EXTRA
+ gcflag_dummy = GCFLAG_DUMMY
# All objects start with a HDR, i.e. with a field 'tid' which contains
# a word. This word is divided in two halves: the lower half contains
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
@@ -1675,6 +1675,15 @@
self.translator = translator
super(TransformerLayoutBuilder, self).__init__(GCClass, lltype2vtable)
+ def is_dummy_struct(self, obj):
+ # overrides the base method
+ TYPE = lltype.typeOf(obj)
+ try:
+ dummy = self.translator.rtyper.cache_dummy_values[TYPE]
+ except KeyError:
+ return False
+ return dummy._obj == obj
+
def has_destructor(self, TYPE):
rtti = get_rtti(TYPE)
return rtti is not None and getattr(rtti._obj, 'destructor_funcptr',
diff --git a/rpython/memory/gctypelayout.py b/rpython/memory/gctypelayout.py
--- a/rpython/memory/gctypelayout.py
+++ b/rpython/memory/gctypelayout.py
@@ -466,7 +466,10 @@
typeid = self.get_type_id(TYPE)
hdr = gc.gcheaderbuilder.new_header(value)
adr = llmemory.cast_ptr_to_adr(hdr)
- gc.init_gc_object_immortal(adr, typeid)
+ if gc.gcflag_dummy and self.is_dummy_struct(value):
+ gc.init_gc_object_immortal(adr, typeid, flags=gc.gcflag_dummy)
+ else:
+ gc.init_gc_object_immortal(adr, typeid)
self.all_prebuilt_gc.append(value)
# The following collects the addresses of all the fields that have
@@ -484,6 +487,10 @@
for a in gc_pointers_inside(value, adr, mutable_only=True):
appendto.append(a)
+ def is_dummy_struct(self, obj):
+ return False # overridden in TransformerLayoutBuilder
+
+
# ____________________________________________________________
#
# Helpers to discover GC pointers inside structures
diff --git a/rpython/memory/gcwrapper.py b/rpython/memory/gcwrapper.py
--- a/rpython/memory/gcwrapper.py
+++ b/rpython/memory/gcwrapper.py
@@ -188,6 +188,9 @@
hdr.tid &= ~self.gc.gcflag_extra
else:
hdr.tid |= self.gc.gcflag_extra
+ elif subopnum == 4: # get_gcflag_dummy
+ # returns always False if gc.gcflag_dummy == 0
+ return (hdr.tid & self.gc.gcflag_dummy) != 0
return (hdr.tid & self.gc.gcflag_extra) != 0
def thread_run(self):
diff --git a/rpython/rlib/rgc.py b/rpython/rlib/rgc.py
--- a/rpython/rlib/rgc.py
+++ b/rpython/rlib/rgc.py
@@ -835,6 +835,11 @@
_gcflag_extras.add(gcref)
toggle_gcflag_extra._subopnum = 3
+@not_rpython
+def get_gcflag_dummy(gcref):
+ return False
+get_gcflag_dummy._subopnum = 4
+
def assert_no_more_gcflags():
if not we_are_translated():
assert not _gcflag_extras
@@ -1079,7 +1084,8 @@
return hop.genop('gc_typeids_list', [], resulttype = hop.r_result)
class Entry(ExtRegistryEntry):
- _about_ = (has_gcflag_extra, get_gcflag_extra, toggle_gcflag_extra)
+ _about_ = (has_gcflag_extra, get_gcflag_extra, toggle_gcflag_extra,
+ get_gcflag_dummy)
def compute_result_annotation(self, s_arg=None):
from rpython.annotator.model import s_Bool
return s_Bool
diff --git a/rpython/translator/c/funcgen.py b/rpython/translator/c/funcgen.py
--- a/rpython/translator/c/funcgen.py
+++ b/rpython/translator/c/funcgen.py
@@ -562,7 +562,7 @@
return '%s = %d;' % (self.expr(op.result),
ARRAY.length)
else:
- return self.generic_get(op, '%s->length;' % self.expr(op.args[0]))
+ return self.generic_get(op, '%s->length' % self.expr(op.args[0]))
def OP_GETARRAYITEM(self, op):
ARRAY = self.lltypemap(op.args[0]).TO
diff --git a/rpython/translator/c/gc.py b/rpython/translator/c/gc.py
--- a/rpython/translator/c/gc.py
+++ b/rpython/translator/c/gc.py
@@ -388,10 +388,14 @@
raise Exception("the FramewokGCTransformer should handle this")
def OP_GC_GCFLAG_EXTRA(self, funcgen, op):
- gcflag_extra = self.db.gctransformer.gcdata.gc.gcflag_extra
+ subopnum = op.args[0].value
+ if subopnum != 4:
+ gcflag_extra = self.db.gctransformer.gcdata.gc.gcflag_extra
+ else:
+ gcflag_extra = self.db.gctransformer.gcdata.gc.gcflag_dummy
+ #
if gcflag_extra == 0:
return BasicGcPolicy.OP_GC_GCFLAG_EXTRA(self, funcgen, op)
- subopnum = op.args[0].value
if subopnum == 1:
return '%s = 1; /* has_gcflag_extra */' % (
funcgen.expr(op.result),)
@@ -407,6 +411,8 @@
parts.insert(0, '%s ^= %dL;' % (hdrfield,
gcflag_extra))
parts.append('/* toggle_gcflag_extra */')
+ elif subopnum == 4: # get_gcflag_dummy
+ parts.append('/* get_gcflag_dummy */')
else:
raise AssertionError(subopnum)
return ' '.join(parts)
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit