[pypy-commit] pypy gc-disable: implement the llinterp part of rgc.{enable, disable, isenabled}
antocuni
pypy.commits at gmail.com
Mon May 21 10:07:57 EDT 2018
Author: Antonio Cuni <anto.cuni at gmail.com>
Branch: gc-disable
Changeset: r94636:f7dbfd0f67ea
Date: 2018-05-21 11:46 +0200
http://bitbucket.org/pypy/pypy/changeset/f7dbfd0f67ea/
Log: implement the llinterp part of rgc.{enable,disable,isenabled}
diff --git a/rpython/rlib/rgc.py b/rpython/rlib/rgc.py
--- a/rpython/rlib/rgc.py
+++ b/rpython/rlib/rgc.py
@@ -13,6 +13,9 @@
# General GC features
collect = gc.collect
+enable = gc.enable
+disable = gc.disable
+isenabled = gc.isenabled
def set_max_heap_size(nbytes):
"""Limit the heap size to n bytes.
@@ -124,6 +127,32 @@
args_v = hop.inputargs(lltype.Signed)
return hop.genop('gc__collect', args_v, resulttype=hop.r_result)
+
+class EnableDisableEntry(ExtRegistryEntry):
+ _about_ = (gc.enable, gc.disable)
+
+ def compute_result_annotation(self):
+ from rpython.annotator import model as annmodel
+ return annmodel.s_None
+
+ def specialize_call(self, hop):
+ hop.exception_cannot_occur()
+ opname = self.instance.__name__
+ return hop.genop('gc__%s' % opname, hop.args_v, resulttype=hop.r_result)
+
+
+class IsEnabledEntry(ExtRegistryEntry):
+ _about_ = gc.isenabled
+
+ def compute_result_annotation(self):
+ from rpython.annotator import model as annmodel
+ return annmodel.s_Bool
+
+ def specialize_call(self, hop):
+ hop.exception_cannot_occur()
+ return hop.genop('gc__isenabled', hop.args_v, resulttype=hop.r_result)
+
+
class SetMaxHeapSizeEntry(ExtRegistryEntry):
_about_ = set_max_heap_size
diff --git a/rpython/rlib/test/test_rgc.py b/rpython/rlib/test/test_rgc.py
--- a/rpython/rlib/test/test_rgc.py
+++ b/rpython/rlib/test/test_rgc.py
@@ -39,6 +39,24 @@
assert res is None
+def test_enable_disable():
+ def f():
+ gc.enable()
+ a = gc.isenabled()
+ gc.disable()
+ b = gc.isenabled()
+ return a and not b
+
+ t, typer, graph = gengraph(f, [])
+ blockops = list(graph.iterblockops())
+ opnames = [op.opname for block, op in blockops
+ if op.opname.startswith('gc__')]
+ assert opnames == ['gc__enable', 'gc__isenabled',
+ 'gc__disable', 'gc__isenabled']
+ res = interpret(f, [])
+ assert res
+
+
def test_can_move():
T0 = lltype.GcStruct('T')
T1 = lltype.GcArray(lltype.Float)
diff --git a/rpython/rtyper/llinterp.py b/rpython/rtyper/llinterp.py
--- a/rpython/rtyper/llinterp.py
+++ b/rpython/rtyper/llinterp.py
@@ -819,6 +819,15 @@
def op_gc__collect(self, *gen):
self.heap.collect(*gen)
+ def op_gc__enable(self):
+ self.heap.enable()
+
+ def op_gc__disable(self):
+ self.heap.disable()
+
+ def op_gc__isenabled(self):
+ return self.heap.isenabled()
+
def op_gc_heap_stats(self):
raise NotImplementedError
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
@@ -5,7 +5,7 @@
setfield = setattr
from operator import setitem as setarrayitem
-from rpython.rlib.rgc import can_move, collect, add_memory_pressure
+from rpython.rlib.rgc import can_move, collect, enable, disable, isenabled, add_memory_pressure
def setinterior(toplevelcontainer, inneraddr, INNERTYPE, newvalue,
offsets=None):
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
@@ -450,6 +450,9 @@
# __________ GC operations __________
'gc__collect': LLOp(canmallocgc=True),
+ 'gc__enable': LLOp(),
+ 'gc__disable': LLOp(),
+ 'gc__isenabled': LLOp(),
'gc_free': LLOp(),
'gc_fetch_exception': LLOp(),
'gc_restore_exception': LLOp(),
More information about the pypy-commit
mailing list