def analyze(self, func, sig, func_to_analyze=None, backendopt=False): if func_to_analyze is None: func_to_analyze = func t = TranslationContext() t.buildannotator().build_types(func, sig) t.buildrtyper(type_system=self.type_system).specialize() if backendopt: backend_optimizations(t) if option.view: t.view() a = FinalizerAnalyzer(t) fgraph = graphof(t, func_to_analyze) result = a.analyze_light_finalizer(fgraph) return result
def test_various_ops(): from pypy.objspace.flow.model import SpaceOperation, Constant X = lltype.Ptr(lltype.GcStruct('X')) Z = lltype.Ptr(lltype.Struct('Z')) S = lltype.GcStruct('S', ('x', lltype.Signed), ('y', X), ('z', Z)) v1 = varoftype(lltype.Bool) v2 = varoftype(lltype.Signed) f = FinalizerAnalyzer(None) r = f.analyze(SpaceOperation('cast_int_to_bool', [v2], v1)) assert not r v1 = varoftype(lltype.Ptr(S)) v2 = varoftype(lltype.Signed) v3 = varoftype(X) v4 = varoftype(Z) assert not f.analyze(SpaceOperation('bare_setfield', [v1, Constant('x'), v2], None)) assert f.analyze(SpaceOperation('bare_setfield', [v1, Constant('y'), v3], None)) assert not f.analyze(SpaceOperation('bare_setfield', [v1, Constant('z'), v4], None))
def make_finalizer_funcptr_for_type(self, TYPE): from pypy.rpython.memory.gctransform.support import get_rtti, \ type_contains_pyobjs rtti = get_rtti(TYPE) if rtti is not None and hasattr(rtti._obj, 'destructor_funcptr'): destrptr = rtti._obj.destructor_funcptr DESTR_ARG = lltype.typeOf(destrptr).TO.ARGS[0] destrgraph = destrptr._obj.graph else: return None, False assert not type_contains_pyobjs(TYPE), "not implemented" t = self.llinterp.typer.annotator.translator light = not FinalizerAnalyzer(t).analyze_light_finalizer(destrgraph) def ll_finalizer(addr, dummy): assert dummy == llmemory.NULL try: v = llmemory.cast_adr_to_ptr(addr, DESTR_ARG) self.llinterp.eval_graph(destrgraph, [v], recursive=True) except llinterp.LLException: raise RuntimeError( "a finalizer raised an exception, shouldn't happen") return llmemory.NULL return llhelper(gctypelayout.GCData.FINALIZER_OR_CT, ll_finalizer), light
def test_various_ops(): from pypy.objspace.flow.model import SpaceOperation, Constant X = lltype.Ptr(lltype.GcStruct('X')) Z = lltype.Ptr(lltype.Struct('Z')) S = lltype.GcStruct('S', ('x', lltype.Signed), ('y', X), ('z', Z)) v1 = varoftype(lltype.Bool) v2 = varoftype(lltype.Signed) f = FinalizerAnalyzer(None) r = f.analyze(SpaceOperation('cast_int_to_bool', [v2], v1)) assert not r v1 = varoftype(lltype.Ptr(S)) v2 = varoftype(lltype.Signed) v3 = varoftype(X) v4 = varoftype(Z) assert not f.analyze( SpaceOperation('bare_setfield', [v1, Constant('x'), v2], None)) assert f.analyze( SpaceOperation('bare_setfield', [v1, Constant('y'), v3], None)) assert not f.analyze( SpaceOperation('bare_setfield', [v1, Constant('z'), v4], None))