[pypy-commit] pypy kill-someobject: merge
fijal
noreply at buildbot.pypy.org
Sun Oct 7 19:56:31 CEST 2012
Author: Maciej Fijalkowski <fijall at 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")
-
More information about the pypy-commit
mailing list