[pypy-svn] r47259 - in pypy/branch/kill-keepalives-again/pypy/rpython: . lltypesystem
arigo at codespeak.net
arigo at codespeak.net
Sun Oct 7 13:42:44 CEST 2007
Author: arigo
Date: Sun Oct 7 13:42:44 2007
New Revision: 47259
Modified:
pypy/branch/kill-keepalives-again/pypy/rpython/llinterp.py
pypy/branch/kill-keepalives-again/pypy/rpython/lltypesystem/llheap.py
Log:
Intermediate check-in: remove the 'gc' attribute of llinterp. Now
the heap is responsible for handling all gc-flavored operations in
a special way if it wants to. (rpython/memory needs fixing now)
Modified: pypy/branch/kill-keepalives-again/pypy/rpython/llinterp.py
==============================================================================
--- pypy/branch/kill-keepalives-again/pypy/rpython/llinterp.py (original)
+++ pypy/branch/kill-keepalives-again/pypy/rpython/llinterp.py Sun Oct 7 13:42:44 2007
@@ -49,16 +49,13 @@
self.heap = heap #module that provides malloc, etc for lltypes
self.exc_data_ptr = exc_data_ptr
self.active_frame = None
- # XXX hack: set gc to None because
- # prepare_graphs_and_create_gc might already use the llinterpreter!
- self.gc = None
self.tracer = None
self.malloc_check = malloc_check
self.frame_class = LLFrame
self.mallocs = {}
if hasattr(heap, "prepare_graphs_and_create_gc"):
flowgraphs = typer.annotator.translator.graphs
- self.gc = heap.prepare_graphs_and_create_gc(self, flowgraphs)
+ heap.prepare_graphs_and_create_gc(self, flowgraphs)
if tracing:
self.tracer = Tracer()
@@ -273,8 +270,7 @@
if nextblock is None:
self.llinterpreter.active_frame = self.f_back
for obj in self.alloca_objects:
- #XXX slighly unclean
- obj._setobj(None)
+ self.heap.free(obj, flavor='raw')
return args
finally:
if tracer:
@@ -548,15 +544,14 @@
def op_setfield(self, obj, fieldname, fieldvalue):
# obj should be pointer
FIELDTYPE = getattr(lltype.typeOf(obj).TO, fieldname)
- if FIELDTYPE != lltype.Void:
- gc = self.llinterpreter.gc
- if gc is None or not gc.needs_write_barrier(FIELDTYPE):
- setattr(obj, fieldname, fieldvalue)
- else:
- args = gc.get_arg_write_barrier(obj, fieldname, fieldvalue)
- write_barrier = gc.get_funcptr_write_barrier()
- result = self.op_direct_call(write_barrier, *args)
- op_bare_setfield = op_setfield
+ if FIELDTYPE is not lltype.Void:
+ self.heap.setfield(obj, fieldname, fieldvalue)
+
+ def op_bare_setfield(self, obj, fieldname, fieldvalue):
+ # obj should be pointer
+ FIELDTYPE = getattr(lltype.typeOf(obj).TO, fieldname)
+ if FIELDTYPE is not lltype.Void:
+ setattr(obj, fieldname, fieldvalue)
def op_getinteriorfield(self, obj, *offsets):
checkptr(obj)
@@ -569,7 +564,7 @@
assert not isinstance(ob, lltype._interior_ptr)
return ob
- def op_setinteriorfield(self, obj, *fieldnamesval):
+ def setinterior(self, heap, obj, *fieldnamesval):
prefields, finalfield, fieldvalue = (
fieldnamesval[:-2], fieldnamesval[-2], fieldnamesval[-1])
for o in prefields:
@@ -577,11 +572,19 @@
obj = getattr(obj, o)
else:
obj = obj[o]
+ T = obj._T
if isinstance(finalfield, str):
- setattr(obj, finalfield, fieldvalue)
+ if getattr(T, fieldname) is not lltype.Void:
+ heap.setfield(obj, finalfield, fieldvalue)
else:
- obj[finalfield] = fieldvalue
- op_bare_setinteriorfield = op_setinteriorfield
+ if T.OF is not lltype.Void:
+ heap.setarrayitem(obj, finalfield, fieldvalue)
+
+ def op_setinteriorfield(self, obj, *fieldnamesval):
+ self.setinterior(self.heap, obj, *fieldnamesval)
+
+ def op_bare_setinteriorfield(self, obj, *fieldnamesval):
+ self.setinterior(llheap, obj, *fieldnamesval)
def op_getarrayitem(self, array, index):
return array[index]
@@ -589,15 +592,14 @@
def op_setarrayitem(self, array, index, item):
# array should be a pointer
ITEMTYPE = lltype.typeOf(array).TO.OF
- if ITEMTYPE != lltype.Void:
- gc = self.llinterpreter.gc
- if gc is None or not gc.needs_write_barrier(ITEMTYPE):
- array[index] = item
- else:
- args = gc.get_arg_write_barrier(array, index, item)
- write_barrier = gc.get_funcptr_write_barrier()
- self.op_direct_call(write_barrier, *args)
- op_bare_setarrayitem = op_setarrayitem
+ if ITEMTYPE is not lltype.Void:
+ self.heap.setarrayitem(array, index, item)
+
+ def op_bare_setarrayitem(self, array, index, item):
+ # array should be a pointer
+ ITEMTYPE = lltype.typeOf(array).TO.OF
+ if ITEMTYPE is not lltype.Void:
+ array[index] = item
def perform_call(self, f, ARGS, args):
@@ -654,20 +656,10 @@
def op_malloc(self, obj, flags):
flavor = flags['flavor']
zero = flags.get('zero', False)
- if self.llinterpreter.gc is not None and flavor == 'gc':
- assert not zero
- args = self.llinterpreter.gc.get_arg_malloc(obj)
- malloc = self.llinterpreter.gc.get_funcptr_malloc()
- result = self.op_direct_call(malloc, *args)
- return self.llinterpreter.gc.adjust_result_malloc(result, obj)
- elif flavor == "stack":
- if isinstance(obj, lltype.Struct) and obj._arrayfld is None:
- result = self.heap.malloc(obj)
- self.alloca_objects.append(result)
- return result
- else:
- raise ValueError("cannot allocate variable-sized things on the stack")
-
+ if flavor == "stack":
+ result = self.heap.malloc(obj, zero=zero, flavor='raw')
+ self.alloca_objects.append(result)
+ return result
ptr = self.heap.malloc(obj, zero=zero, flavor=flavor)
if flavor == 'raw' and self.llinterpreter.malloc_check:
self.llinterpreter.remember_malloc(ptr, self)
@@ -683,12 +675,6 @@
def op_malloc_varsize(self, obj, flags, size):
flavor = flags['flavor']
zero = flags.get('zero', False)
- if self.llinterpreter.gc is not None and flavor == 'gc':
- assert not zero
- args = self.llinterpreter.gc.get_arg_malloc(obj, size)
- malloc = self.llinterpreter.gc.get_funcptr_malloc()
- result = self.op_direct_call(malloc, *args)
- return self.llinterpreter.gc.adjust_result_malloc(result, obj, size)
assert flavor in ('gc', 'raw')
try:
ptr = self.heap.malloc(obj, size, zero=zero, flavor=flavor)
@@ -742,8 +728,7 @@
op_cast_weakrefptr_to_ptr.need_result_type = True
def op_gc__collect(self):
- import gc
- gc.collect()
+ self.heap.collect()
def op_gc_free(self, addr):
# what can you do?
@@ -1030,7 +1015,7 @@
checkinst(inst)
assert isinstance(name, str)
FIELDTYPE = lltype.typeOf(inst)._field_type(name)
- if FIELDTYPE != lltype.Void:
+ if FIELDTYPE is not lltype.Void:
setattr(inst, name, value)
def op_oogetfield(self, inst, name):
Modified: pypy/branch/kill-keepalives-again/pypy/rpython/lltypesystem/llheap.py
==============================================================================
--- pypy/branch/kill-keepalives-again/pypy/rpython/lltypesystem/llheap.py (original)
+++ pypy/branch/kill-keepalives-again/pypy/rpython/lltypesystem/llheap.py Sun Oct 7 13:42:44 2007
@@ -4,3 +4,7 @@
from pypy.rpython.lltypesystem.llmemory import raw_malloc, raw_free
from pypy.rpython.lltypesystem.llmemory import raw_memclear, raw_memcopy
from pypy.rpython.lltypesystem.llmemory import raw_malloc_usage
+
+setfield = setattr
+from operator import setitem as setarrayitem
+from gc import collect
More information about the Pypy-commit
mailing list