Author: Maciej Fijalkowski <fij...@gmail.com> Branch: kill-someobject Changeset: r57845:4766f06dd382 Date: 2012-10-07 19:55 +0200 http://bitbucket.org/pypy/pypy/changeset/4766f06dd382/
Log: merge diff --git a/pypy/jit/codewriter/call.py b/pypy/jit/codewriter/call.py --- a/pypy/jit/codewriter/call.py +++ b/pypy/jit/codewriter/call.py @@ -180,11 +180,8 @@ """ fnptr = self.rtyper.type_system.getcallable(graph) FUNC = get_functype(lltype.typeOf(fnptr)) - assert lltype.Ptr(lltype.PyObject) not in FUNC.ARGS - if self.rtyper.type_system.name == 'ootypesystem': - XXX - else: - fnaddr = llmemory.cast_ptr_to_adr(fnptr) + assert self.rtyper.type_system.name == "lltypesystem" + fnaddr = llmemory.cast_ptr_to_adr(fnptr) NON_VOID_ARGS = [ARG for ARG in FUNC.ARGS if ARG is not lltype.Void] calldescr = self.cpu.calldescrof(FUNC, tuple(NON_VOID_ARGS), FUNC.RESULT, EffectInfo.MOST_GENERAL) diff --git a/pypy/rlib/jit.py b/pypy/rlib/jit.py --- a/pypy/rlib/jit.py +++ b/pypy/rlib/jit.py @@ -430,7 +430,6 @@ 'enable_opts': 'all', } unroll_parameters = unrolling_iterable(PARAMETERS.items()) -DEFAULT = object() # ____________________________________________________________ @@ -552,7 +551,7 @@ def _set_param(driver, name, value): # special-cased by ExtRegistryEntry # (internal, must receive a constant 'name') - # if value is DEFAULT, sets the default value. + # if value is None, sets the default value. assert name in PARAMETERS @specialize.arg(0, 1) @@ -564,7 +563,7 @@ @specialize.arg(0, 1) def set_param_to_default(driver, name): """Reset one of the tunable JIT parameters to its default value.""" - _set_param(driver, name, DEFAULT) + _set_param(driver, name, None) def set_user_param(driver, text): """Set the tunable JIT parameters from a user-supplied string @@ -641,11 +640,7 @@ self.bookkeeper._jit_annotation_cache[driver] = cache for key, s_value in kwds_s.items(): s_previous = cache.get(key, annmodel.s_ImpossibleValue) - s_value = annmodel.unionof(s_previous, s_value) - if annmodel.isdegenerated(s_value): - raise JitHintError("mixing incompatible types in argument %s" - " of jit_merge_point/can_enter_jit" % - key[2:]) + s_value = annmodel.unionof(s_previous, s_value) # where="mixing incompatible types in argument %s of jit_merge_point/can_enter_jit" % key[2:] cache[key] = s_value # add the attribute _dont_reach_me_in_del_ (see pypy.rpython.rclass) @@ -775,7 +770,7 @@ def compute_result_annotation(self, s_driver, s_name, s_value): from pypy.annotation import model as annmodel assert s_name.is_constant() - if not self.bookkeeper.immutablevalue(DEFAULT).contains(s_value): + if annmodel.s_None.contains(s_value): if s_name.const == 'enable_opts': assert annmodel.SomeString(can_be_None=True).contains(s_value) else: @@ -795,7 +790,7 @@ else: repr = lltype.Signed if (isinstance(hop.args_v[2], Constant) and - hop.args_v[2].value is DEFAULT): + hop.args_v[2].value is None): value = PARAMETERS[name] v_value = hop.inputconst(repr, value) else: diff --git a/pypy/rpython/lltypesystem/test/test_lltype.py b/pypy/rpython/lltypesystem/test/test_lltype.py --- a/pypy/rpython/lltypesystem/test/test_lltype.py +++ b/pypy/rpython/lltypesystem/test/test_lltype.py @@ -718,10 +718,6 @@ gc.collect() repr(s) -def test_pyobject(): - p = pyobjectptr({42: 84}) - assert typeOf(p) == Ptr(PyObject) - def test_name_clash(): import re fn = lltype.__file__ diff --git a/pypy/rpython/memory/gctransform/support.py b/pypy/rpython/memory/gctransform/support.py --- a/pypy/rpython/memory/gctransform/support.py +++ b/pypy/rpython/memory/gctransform/support.py @@ -3,17 +3,6 @@ from pypy.annotation import model as annmodel import os -def var_ispyobj(var): - if hasattr(var, 'concretetype'): - if isinstance(var.concretetype, lltype.Ptr): - return var.concretetype.TO._gckind == 'cpy' - else: - return False - else: - # assume PyObjPtr - return True - -PyObjPtr = lltype.Ptr(lltype.PyObject) def find_gc_ptrs_in_type(TYPE): if isinstance(TYPE, lltype.Array): @@ -33,20 +22,6 @@ else: return [] -def type_contains_pyobjs(TYPE): - if isinstance(TYPE, lltype.Array): - return type_contains_pyobjs(TYPE.OF) - elif isinstance(TYPE, lltype.Struct): - result = [] - for name in TYPE._names: - if type_contains_pyobjs(TYPE._flds[name]): - return True - return False - elif isinstance(TYPE, lltype.Ptr) and TYPE.TO._gckind == 'cpy': - return True - else: - return False - def get_rtti(TYPE): if isinstance(TYPE, lltype.RttiStruct): try: diff --git a/pypy/rpython/memory/gctransform/transform.py b/pypy/rpython/memory/gctransform/transform.py --- a/pypy/rpython/memory/gctransform/transform.py +++ b/pypy/rpython/memory/gctransform/transform.py @@ -1,4 +1,3 @@ -import py from pypy.rpython.lltypesystem import lltype, llmemory from pypy.objspace.flow.model import SpaceOperation, Variable, Constant, \ c_last_exception, checkgraph @@ -7,24 +6,18 @@ from pypy.translator.unsimplify import starts_with_empty_block from pypy.translator.backendopt.support import var_needsgc from pypy.translator.backendopt import inline -from pypy.translator.backendopt import graphanalyze from pypy.translator.backendopt.canraise import RaiseAnalyzer from pypy.translator.backendopt.ssa import DataFlowFamilyBuilder from pypy.translator.backendopt.constfold import constant_fold_graph from pypy.annotation import model as annmodel from pypy.rpython import rmodel -from pypy.rpython.memory import gc -from pypy.rpython.memory.gctransform.support import var_ispyobj from pypy.rpython.annlowlevel import MixLevelHelperAnnotator from pypy.rpython.rtyper import LowLevelOpList from pypy.rpython.rbuiltin import gen_cast from pypy.rlib.rarithmetic import ovfcheck -import sys -import os from pypy.rpython.lltypesystem.lloperation import llop -from pypy.translator.simplify import join_blocks, cleanup_graph +from pypy.translator.simplify import cleanup_graph -PyObjPtr = lltype.Ptr(lltype.PyObject) class GcHighLevelOp(object): def __init__(self, gct, op, index, llops): @@ -55,17 +48,9 @@ if var_needsgc(v_result): gct.livevars.append(v_result) - if var_ispyobj(v_result): - if opname in ('getfield', 'getarrayitem', 'same_as', - 'cast_pointer', 'getsubstruct', - 'getinteriorfield'): - # XXX more operations? - gct.push_alive(v_result, self.llops) - elif opname not in ('direct_call', 'indirect_call'): + if opname not in ('direct_call', 'indirect_call'): gct.push_alive(v_result, self.llops) - - def rename(self, newopname): self.llops.append( SpaceOperation(newopname, self.spaceop.args, self.spaceop.result)) @@ -85,8 +70,8 @@ def cast_result(self, var): v_result = self.spaceop.result - resulttype = getattr(v_result, 'concretetype', PyObjPtr) - curtype = getattr(var, 'concretetype', PyObjPtr) + resulttype = v_result.concretetype + curtype = var.concretetype if curtype == resulttype: self.genop('same_as', [var], resultvar=v_result) else: @@ -120,11 +105,8 @@ self.minimalgctransformer = None def get_lltype_of_exception_value(self): - if self.translator is not None: - exceptiondata = self.translator.rtyper.getexceptiondata() - return exceptiondata.lltype_of_exception_value - else: - return lltype.Ptr(lltype.PyObject) + exceptiondata = self.translator.rtyper.getexceptiondata() + return exceptiondata.lltype_of_exception_value def need_minimal_transform(self, graph): self.seen_graphs[graph] = True @@ -329,28 +311,11 @@ hop.rename('bare_' + opname) self.pop_alive(v_old, hop.llops) - def push_alive(self, var, llops): - if var_ispyobj(var): - self.push_alive_pyobj(var, llops) - else: - self.push_alive_nopyobj(var, llops) + self.push_alive_nopyobj(var, llops) def pop_alive(self, var, llops): - if var_ispyobj(var): - self.pop_alive_pyobj(var, llops) - else: - self.pop_alive_nopyobj(var, llops) - - def push_alive_pyobj(self, var, llops): - if hasattr(var, 'concretetype') and var.concretetype != PyObjPtr: - var = gen_cast(llops, PyObjPtr, var) - llops.genop("gc_push_alive_pyobj", [var]) - - def pop_alive_pyobj(self, var, llops): - if hasattr(var, 'concretetype') and var.concretetype != PyObjPtr: - var = gen_cast(llops, PyObjPtr, var) - llops.genop("gc_pop_alive_pyobj", [var]) + self.pop_alive_nopyobj(var, llops) def push_alive_nopyobj(self, var, llops): pass @@ -359,7 +324,7 @@ pass def var_needs_set_transform(self, var): - return var_ispyobj(var) + return False def default(self, hop): hop.llops.append(hop.spaceop) diff --git a/pypy/rpython/memory/gcwrapper.py b/pypy/rpython/memory/gcwrapper.py --- a/pypy/rpython/memory/gcwrapper.py +++ b/pypy/rpython/memory/gcwrapper.py @@ -5,6 +5,7 @@ from pypy.rpython.memory import gctypelayout from pypy.objspace.flow.model import Constant + class GCManagedHeap(object): def __init__(self, llinterp, flowgraphs, gc_class, GC_PARAMS={}): @@ -152,9 +153,6 @@ else: return True - def pyobjectptr(self, klass): - raise NotImplementedError(klass) - # ____________________________________________________________ class LLInterpRootWalker: @@ -193,8 +191,7 @@ super(DirectRunLayoutBuilder, self).__init__(GCClass, lltype2vtable) def make_finalizer_funcptr_for_type(self, TYPE): - from pypy.rpython.memory.gctransform.support import get_rtti, \ - type_contains_pyobjs + from pypy.rpython.memory.gctransform.support import get_rtti rtti = get_rtti(TYPE) if rtti is not None and hasattr(rtti._obj, 'destructor_funcptr'): destrptr = rtti._obj.destructor_funcptr @@ -203,7 +200,6 @@ 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): @@ -218,8 +214,7 @@ return llhelper(gctypelayout.GCData.FINALIZER_OR_CT, ll_finalizer), light def make_custom_trace_funcptr_for_type(self, TYPE): - from pypy.rpython.memory.gctransform.support import get_rtti, \ - type_contains_pyobjs + from pypy.rpython.memory.gctransform.support import get_rtti rtti = get_rtti(TYPE) if rtti is not None and hasattr(rtti._obj, 'custom_trace_funcptr'): return rtti._obj.custom_trace_funcptr diff --git a/pypy/rpython/memory/lltypelayout.py b/pypy/rpython/memory/lltypelayout.py --- a/pypy/rpython/memory/lltypelayout.py +++ b/pypy/rpython/memory/lltypelayout.py @@ -47,8 +47,6 @@ return "i" elif isinstance(TYPE, lltype.FuncType): return "i" - elif isinstance(TYPE, lltype.PyObjectType): - return "i" else: assert 0, "type %s not yet implemented" % (TYPE, ) @@ -71,8 +69,6 @@ return get_fixed_size(lltype.Unsigned) elif isinstance(TYPE, lltype.FuncType): return get_fixed_size(lltype.Unsigned) - elif isinstance(TYPE, lltype.PyObjectType): - return get_fixed_size(lltype.Unsigned) assert 0, "not yet implemented" def get_variable_size(TYPE): @@ -89,8 +85,6 @@ return 0 elif isinstance(TYPE, lltype.FuncType): return 0 - elif isinstance(TYPE, lltype.PyObjectType): - return 0 elif isinstance(TYPE, lltype.Ptr): return 0 else: diff --git a/pypy/rpython/ootypesystem/rdict.py b/pypy/rpython/ootypesystem/rdict.py --- a/pypy/rpython/ootypesystem/rdict.py +++ b/pypy/rpython/ootypesystem/rdict.py @@ -7,6 +7,8 @@ from pypy.rpython.ootypesystem import ootype from pypy.rlib import objectmodel from pypy.rpython import rmodel, llinterp +# This is needed by other things, don't remove! +from pypy.rpython.rdict import rtype_newdict class DictRepr(AbstractDictRepr): diff --git a/pypy/rpython/rdict.py b/pypy/rpython/rdict.py --- a/pypy/rpython/rdict.py +++ b/pypy/rpython/rdict.py @@ -1,10 +1,5 @@ -from pypy.tool.pairtype import pairtype from pypy.annotation import model as annmodel -from pypy.objspace.flow.model import Constant from pypy.rpython.lltypesystem import lltype -from pypy.rlib.rarithmetic import r_uint -from pypy.rlib.objectmodel import hlinvoke -from pypy.rlib import objectmodel from pypy.rpython import rmodel @@ -58,9 +53,6 @@ def rtype_newdict(hop): hop.inputargs() # no arguments expected r_dict = hop.r_result - if r_dict == robject.pyobj_repr: # special case: SomeObject: SomeObject dicts! - cdict = hop.inputconst(robject.pyobj_repr, dict) - return hop.genop('simple_call', [cdict], resulttype = robject.pyobj_repr) cDICT = hop.inputconst(lltype.Void, r_dict.DICT) v_result = hop.gendirectcall(hop.rtyper.type_system.rdict.ll_newdict, cDICT) return v_result diff --git a/pypy/rpython/test/test_robject.py b/pypy/rpython/test/test_robject.py deleted file mode 100644 --- a/pypy/rpython/test/test_robject.py +++ /dev/null @@ -1,59 +0,0 @@ -from pypy.rpython.lltypesystem.lltype import * -from pypy.rpython.test.test_llinterp import interpret - - -def test_simple(): - def fn(obj): - return obj + 1 - _1L = pyobjectptr(1L) - res = interpret(fn, [_1L], someobjects=True) - assert res._obj.value == 2L - -def test_obj_obj_dict(): - def f(i, c): - d = {} - d[1] = 'a' - d['a'] = i - d['ab'] = c - d[i] = c - return len(d) - res = interpret(f, [2, 'c'], someobjects=True) - assert res == 4 - res = interpret(f, [3, 'c'], someobjects=True) - assert res == 4 - -def test_obj_list(): - def f(i, c): - lis = [1, 2, 3, 4] - lis[i] = c - lis.append(i) - return len(lis) - res = interpret(f, [2, 'c'], someobjects=True) - assert res == 5 - res = interpret(f, [3, 'c'], someobjects=True) - assert res == 5 - -def test_obj_iter(): - def f(flag): - if flag: - x = (1, 2) - else: - x = '34' - lst = [u for u in x] - return lst[flag] - res = interpret(f, [1], someobjects=True) - assert res._obj.value == 2 - res = interpret(f, [0], someobjects=True) - assert res._obj.value == '3' - -def test_listofobj_iter(): - def f(look): - lst = ['*', 2, 5] - for u in lst: - if u == look: - return True - return False - res = interpret(f, [1], someobjects=True) - assert res is False - res = interpret(f, [2], someobjects=True) - assert res is True diff --git a/pypy/rpython/typesystem.py b/pypy/rpython/typesystem.py --- a/pypy/rpython/typesystem.py +++ b/pypy/rpython/typesystem.py @@ -119,7 +119,7 @@ return hop.genop('ptr_nonzero', vlist, resulttype=lltype.Bool) def getconcretetype(self, v): - return getattr(v, 'concretetype', lltype.Ptr(lltype.PyObject)) + return v.concretetype def null_callable(self, T): return lltype.nullptr(T.TO) diff --git a/pypy/translator/c/funcgen.py b/pypy/translator/c/funcgen.py --- a/pypy/translator/c/funcgen.py +++ b/pypy/translator/c/funcgen.py @@ -53,7 +53,7 @@ self.collect_var_and_types() for v in self.vars: - T = getattr(v, 'concretetype', PyObjPtr) + T = v.concretetype # obscure: skip forward references and hope for the best # (needed for delayed function pointers) if isinstance(T, Ptr) and T.TO.__class__ == ForwardReference: @@ -121,7 +121,7 @@ db = self.db lltypes = identity_dict() for v in self.vars: - T = getattr(v, 'concretetype', PyObjPtr) + T = v.concretetype typename = db.gettype(T) lltypes[v] = T, typename self.illtypes = lltypes @@ -221,12 +221,6 @@ if len(block.exits) == 0: assert len(block.inputargs) == 1 # regular return block - if self.exception_policy == "CPython": - assert self.lltypemap(self.graph.getreturnvar()) == PyObjPtr - yield 'if (RPyExceptionOccurred()) {' - yield '\tRPyConvertExceptionToCPython();' - yield '\treturn NULL;' - yield '}' retval = self.expr(block.inputargs[0]) if self.exception_policy != "exc_helper": yield 'RPY_DEBUG_RETURN();' @@ -241,20 +235,12 @@ assert block.exitswitch != c_last_exception # block ending in a switch on a value TYPE = self.lltypemap(block.exitswitch) - if TYPE in (Bool, PyObjPtr): + if TYPE == Bool: expr = self.expr(block.exitswitch) for link in block.exits[:0:-1]: assert link.exitcase in (False, True) - if TYPE == Bool: - if not link.exitcase: - expr = '!' + expr - elif TYPE == PyObjPtr: - yield 'assert(%s == Py_True || %s == Py_False);' % ( - expr, expr) - if link.exitcase: - expr = '%s == Py_True' % expr - else: - expr = '%s == Py_False' % expr + if not link.exitcase: + expr = '!' + expr yield 'if (%s) {' % expr for op in self.gen_link(link): yield '\t' + op diff --git a/pypy/translator/c/genc.py b/pypy/translator/c/genc.py --- a/pypy/translator/c/genc.py +++ b/pypy/translator/c/genc.py @@ -276,44 +276,6 @@ extrafiles.append(fn) return extrafiles -class ModuleWithCleanup(object): - def __init__(self, mod): - self.__dict__['mod'] = mod - - def __getattr__(self, name): - mod = self.__dict__['mod'] - obj = getattr(mod, name) - parentself = self - if callable(obj) and getattr(obj, '__module__', None) == mod.__name__: - # The module must be kept alive with the function. - # This wrapper avoids creating a cycle. - class Wrapper: - def __init__(self, obj): - self.myself = parentself - self.func = obj - def __call__(self, *args, **kwargs): - return self.func(*args, **kwargs) - obj = Wrapper(obj) - return obj - - def __setattr__(self, name, val): - mod = self.__dict__['mod'] - setattr(mod, name, val) - - def __del__(self): - import sys - if sys.platform == "win32": - from _ctypes import FreeLibrary as dlclose - else: - from _ctypes import dlclose - # XXX fish fish fish - mod = self.__dict__['mod'] - dlclose(mod._lib._handle) - try: - del sys.modules[mod.__name__] - except KeyError: - pass - class CStandaloneBuilder(CBuilder): standalone = True diff --git a/pypy/translator/c/test/test_genc.py b/pypy/translator/c/test/test_genc.py --- a/pypy/translator/c/test/test_genc.py +++ b/pypy/translator/c/test/test_genc.py @@ -1,23 +1,18 @@ -import autopath, sys, os, py +import sys + +import py + from pypy.rpython.lltypesystem.lltype import * from pypy.annotation import model as annmodel from pypy.translator.translator import TranslationContext -from pypy.translator.c.database import LowLevelDatabase from pypy.translator.c import genc -from pypy.translator.c.gc import NoneGcPolicy -from pypy.objspace.flow.model import Constant, Variable, SpaceOperation -from pypy.objspace.flow.model import Block, Link, FunctionGraph -from pypy.tool.udir import udir -from pypy.translator.gensupp import uniquemodulename -from pypy.translator.backendopt.all import backend_optimizations from pypy.translator.interactive import Translation from pypy.rlib.entrypoint import entrypoint from pypy.tool.nullpath import NullPyPathLocal + def compile(fn, argtypes, view=False, gcpolicy="ref", backendopt=True, annotatorpolicy=None): - if argtypes is not None and "__pypy__" in sys.builtin_module_names: - py.test.skip("requires building cpython extension modules") t = Translation(fn, argtypes, gc=gcpolicy, backend="c", policy=annotatorpolicy) if not backendopt: @@ -49,19 +44,11 @@ def test_simple(): def f(x): return x*2 - t = TranslationContext() - t.buildannotator().build_types(f, [int]) - t.buildrtyper().specialize() - t.config.translation.countmallocs = True - builder = genc.CExtModuleBuilder(t, f, config=t.config) - builder.generate_source() - builder.compile() - f1 = builder.get_entry_point() + f1 = compile(f, [int]) assert f1(5) == 10 assert f1(-123) == -246 - assert builder.get_malloc_counters()() == (0, 0) py.test.raises(Exception, f1, "world") # check that it's really typed diff --git a/pypy/translator/interactive.py b/pypy/translator/interactive.py --- a/pypy/translator/interactive.py +++ b/pypy/translator/interactive.py @@ -1,9 +1,7 @@ -import optparse - -import autopath from pypy.translator.translator import TranslationContext from pypy.translator import driver + DEFAULTS = { 'translation.backend': None, 'translation.type_system': None, @@ -44,7 +42,7 @@ self.ensure_setup() elif kind == 'post': pass - + def ensure_setup(self, argtypes=None, policy=None, standalone=False): if not self.driver_setup: if standalone: @@ -74,7 +72,8 @@ kwds.pop('policy', None) kwds.pop('standalone', None) gc = kwds.pop('gc', None) - if gc: self.config.translation.gc = gc + if gc: + self.config.translation.gc = gc self.config.translation.set(**kwds) def ensure_opt(self, name, value=None, fallback=None): @@ -88,13 +87,13 @@ if val is not None: return val raise Exception( - "the %r option should have been specified at this point" %name) + "the %r option should have been specified at this point" % name) def ensure_type_system(self, type_system=None): if self.config.translation.backend is not None: return self.ensure_opt('type_system') return self.ensure_opt('type_system', type_system, 'lltype') - + def ensure_backend(self, backend=None): backend = self.ensure_opt('backend', backend) self.ensure_type_system() @@ -121,20 +120,20 @@ def rtype(self, argtypes=None, **kwds): self.update_options(argtypes, kwds) ts = self.ensure_type_system() - return getattr(self.driver, 'rtype_'+ts)() + return getattr(self.driver, 'rtype_' + ts)() def backendopt(self, argtypes=None, **kwds): self.update_options(argtypes, kwds) ts = self.ensure_type_system('lltype') - return getattr(self.driver, 'backendopt_'+ts)() - + return getattr(self.driver, 'backendopt_' + ts)() + # backend depedent def source(self, argtypes=None, **kwds): self.update_options(argtypes, kwds) backend = self.ensure_backend() - getattr(self.driver, 'source_'+backend)() - + getattr(self.driver, 'source_' + backend)() + def source_c(self, argtypes=None, **kwds): self.update_options(argtypes, kwds) self.ensure_backend('c') @@ -148,15 +147,15 @@ def compile(self, argtypes=None, **kwds): self.update_options(argtypes, kwds) backend = self.ensure_backend() - getattr(self.driver, 'compile_'+backend)() + getattr(self.driver, 'compile_' + backend)() return self.driver.c_entryp - + def compile_c(self, argtypes=None, **kwds): self.update_options(argtypes, kwds) self.ensure_backend('c') self.driver.compile_c() return self.driver.c_entryp - + def compile_cli(self, argtypes=None, **kwds): self.update_options(argtypes, kwds) self.ensure_backend('cli') diff --git a/pypy/translator/llsupport/test/test_wrapper.py b/pypy/translator/llsupport/test/test_wrapper.py deleted file mode 100644 --- a/pypy/translator/llsupport/test/test_wrapper.py +++ /dev/null @@ -1,60 +0,0 @@ -import py -from pypy import conftest -from pypy.translator.translator import TranslationContext -from pypy.translator.llsupport.wrapper import new_wrapper -from pypy.rpython.rmodel import PyObjPtr -from pypy.rpython.llinterp import LLInterpreter -from pypy.rpython.lltypesystem import lltype - - -class TestMakeWrapper: - - def getgraph(self, func, argtypes=None): - from pypy.config.pypyoption import get_pypy_config - config = get_pypy_config(translating=True) - config.translation.gc = "ref" - config.translation.simplifying = True - t = TranslationContext(config=config) - if argtypes is None: - argtypes = [] - a = t.buildannotator() - a.build_types(func, argtypes) - a.simplify() - t.buildrtyper().specialize() - wrapperptr = new_wrapper(func, t) - wrappergraph = wrapperptr._obj.graph - F = lltype.typeOf(wrapperptr).TO - assert F.ARGS == (PyObjPtr,) * len(wrappergraph.getargs()) - assert F.RESULT == PyObjPtr - - for inputarg in wrappergraph.getargs(): - assert inputarg.concretetype == PyObjPtr - assert wrappergraph.getreturnvar().concretetype == PyObjPtr - return t.graphs[0], wrappergraph, t - - def interpret(self, t, graph, *args): - interp = LLInterpreter(t.rtyper) - result = interp.eval_graph(graph, [lltype.pyobjectptr(arg) - for arg in args]) - return result._obj.value - - def test_simple(self): - def f(x): - return x * 3 - graph, wrappergraph, t = self.getgraph(f, [int]) - res = self.interpret(t, wrappergraph, 3) - assert res == 9 - - def test_manyargs(self): - def f(x, y, z): - return x * y + z - graph, wrappergraph, t = self.getgraph(f, [int, int, int]) - res = self.interpret(t, wrappergraph, 3, 4, 5) - assert res == 3 * 4 + 5 - - def test_returnnone(self): - def f(): - pass - graph, wrappergraph, t = self.getgraph(f) - res = self.interpret(t, wrappergraph) - assert res is None diff --git a/pypy/translator/llsupport/wrapper.py b/pypy/translator/llsupport/wrapper.py deleted file mode 100644 --- a/pypy/translator/llsupport/wrapper.py +++ /dev/null @@ -1,78 +0,0 @@ -from pypy.objspace.flow.model import Variable -from pypy.objspace.flow.model import Block, Link, FunctionGraph, checkgraph -from pypy.rpython.lltypesystem.lltype import \ - Ptr, PyObject, typeOf, Signed, FuncType, functionptr, nullptr, Void -from pypy.rpython.rtyper import LowLevelOpList -from pypy.rpython.rmodel import inputconst, PyObjPtr -from pypy.rpython.robject import pyobj_repr - -from pypy.rpython.typesystem import getfunctionptr - - - -def new_wrapper(func, translator, newname=None): - # The basic idea is to produce a flow graph from scratch, using the - # help of the rtyper for the conversion of the arguments after they - # have been decoded. - - bk = translator.annotator.bookkeeper - graph = bk.getdesc(func).getuniquegraph() - - f = getfunctionptr(graph) - FUNCTYPE = typeOf(f).TO - - newops = LowLevelOpList(translator.rtyper) - - varguments = [] - for var in graph.startblock.inputargs: - v = Variable(var) - v.concretetype = PyObjPtr - varguments.append(v) - - wrapper_inputargs = varguments[:] - # use the rtyper to produce the conversions - inputargs = f._obj.graph.getargs() - for i in range(len(varguments)): - if FUNCTYPE.ARGS[i] != PyObjPtr: - rtyper = translator.rtyper - r_arg = rtyper.bindingrepr(inputargs[i]) - # give the rtyper a chance to know which function we are wrapping - rtyper.set_wrapper_context(func) - varguments[i] = newops.convertvar(varguments[i], - r_from = pyobj_repr, - r_to = r_arg) - rtyper.set_wrapper_context(None) - - vlist = [inputconst(typeOf(f), f)] + varguments - vresult = newops.genop('direct_call', vlist, resulttype=FUNCTYPE.RESULT) - - if FUNCTYPE.RESULT != PyObjPtr: - # convert "result" back to a PyObject - rtyper = translator.rtyper - assert rtyper is not None, ( - "needs the rtyper to perform function result conversions") - r_result = rtyper.bindingrepr(f._obj.graph.getreturnvar()) - vresult = newops.convertvar(vresult, - r_from = r_result, - r_to = pyobj_repr) - - # "return result" - block = Block(wrapper_inputargs) - wgraph = FunctionGraph('pyfn_' + (newname or func.func_name), block) - translator.update_call_graph(wgraph, graph, object()) - translator.graphs.append(wgraph) - block.operations[:] = newops - block.closeblock(Link([vresult], wgraph.returnblock)) - wgraph.getreturnvar().concretetype = PyObjPtr - checkgraph(wgraph) - - # the above convertvar()s may have created and annotated new helpers - # that need to be specialized now - translator.rtyper.specialize_more_blocks() - - return functionptr(FuncType([PyObjPtr] * len(wrapper_inputargs), - PyObjPtr), - wgraph.name, - graph = wgraph, - exception_policy = "CPython") - _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit