[pypy-svn] r64111 - in pypy/branch/pyjitpl5-simplify/pypy/jit: backend backend/llgraph backend/minimal backend/test backend/x86 metainterp metainterp/test
antocuni at codespeak.net
antocuni at codespeak.net
Wed Apr 15 18:53:05 CEST 2009
Author: antocuni
Date: Wed Apr 15 18:53:04 2009
New Revision: 64111
Modified:
pypy/branch/pyjitpl5-simplify/pypy/jit/backend/llgraph/runner.py
pypy/branch/pyjitpl5-simplify/pypy/jit/backend/minimal/runner.py
pypy/branch/pyjitpl5-simplify/pypy/jit/backend/model.py
pypy/branch/pyjitpl5-simplify/pypy/jit/backend/test/runner.py
pypy/branch/pyjitpl5-simplify/pypy/jit/backend/x86/runner.py
pypy/branch/pyjitpl5-simplify/pypy/jit/metainterp/codewriter.py
pypy/branch/pyjitpl5-simplify/pypy/jit/metainterp/pyjitpl.py
pypy/branch/pyjitpl5-simplify/pypy/jit/metainterp/resoperation.py
pypy/branch/pyjitpl5-simplify/pypy/jit/metainterp/test/test_basic.py
pypy/branch/pyjitpl5-simplify/pypy/jit/metainterp/warmspot.py
Log:
the result of my travel to leysin:
- specialize oostring and oounicode based on the type of their first arg; as a
result, a bunch of tests now pass
- implement calls to static methods: test_residual_call now passes
- really use ootypesystem when calling meta_interp; a bunch of tests now fail
and are skipped
Modified: pypy/branch/pyjitpl5-simplify/pypy/jit/backend/llgraph/runner.py
==============================================================================
--- pypy/branch/pyjitpl5-simplify/pypy/jit/backend/llgraph/runner.py (original)
+++ pypy/branch/pyjitpl5-simplify/pypy/jit/backend/llgraph/runner.py Wed Apr 15 18:53:04 2009
@@ -228,12 +228,6 @@
token = history.getkind(A.OF)
return Descr(size, token[0])
- @staticmethod
- def calldescrof(ARGS, RESULT):
- token = history.getkind(RESULT)
- return Descr(0, token[0])
-
-
def cast_adr_to_int(self, adr):
return llimpl.cast_adr_to_int(self.memo_cast, adr)
@@ -244,6 +238,11 @@
class LLtypeCPU(BaseCPU):
+ @staticmethod
+ def calldescrof(FUNC, ARGS, RESULT):
+ token = history.getkind(RESULT)
+ return Descr(0, token[0])
+
# ---------- the backend-dependent operations ----------
def do_arraylen_gc(self, args, arraydescr):
@@ -389,9 +388,25 @@
class OOtypeCPU(BaseCPU):
@staticmethod
+ def calldescrof(FUNC, ARGS, RESULT):
+ return StaticMethDescr(FUNC, ARGS, RESULT)
+
+ @staticmethod
def methdescrof(METH, methname):
return MethDescr(METH, methname)
+ @staticmethod
+ def typedescrof(TYPE):
+ return TypeDescr(TYPE)
+
+ def do_call(self, args, descr):
+ assert isinstance(descr, StaticMethDescr)
+ funcbox = args[0]
+ argboxes = args[1:]
+ x = descr.callfunc(funcbox, argboxes)
+ # XXX: return None if RESULT is Void
+ return x
+
def do_oosend(self, args, descr=None):
assert isinstance(descr, MethDescr)
selfbox = args[0]
@@ -400,48 +415,73 @@
# XXX: return None if METH.RESULT is Void
return x
- def do_oostring(self, args, descr=None):
- obj = args[0].getint() # XXX what about other types?
+ def do_oostring_char(self, args, descr=None):
+ char = chr(args[0].getint())
base = args[1].getint()
- res = ootype.cast_to_object(ootype.oostring(obj, base))
+ res = ootype.cast_to_object(ootype.oostring(char, base))
return history.ConstObj(res)
- def do_oounicode(self, args, descr=None):
- obj = args[0].getint() # XXX what about other types?
+ def do_oounicode_unichar(self, args, descr=None):
+ unichar = unichr(args[0].getint())
base = args[1].getint()
- res = ootype.cast_to_object(ootype.oounicode(obj, base))
+ res = ootype.cast_to_object(ootype.oounicode(unichar, base))
return history.ConstObj(res)
+def make_getargs_boxres(ARGS, RESULT):
+ argsiter = unrolling_iterable(ARGS)
+ args_n = len(ARGS)
+ def getargs(argboxes):
+ funcargs = ()
+ assert len(argboxes) == args_n
+ i = 0
+ for ARG in argsiter:
+ box = argboxes[i]
+ i+=1
+ if isinstance(ARG, ootype.OOType):
+ arg = ootype.cast_from_object(ARG, box.getobj())
+ else:
+ arg = box.getint()
+ funcargs += (arg,)
+ return funcargs
+
+ def boxresult(result):
+ if isinstance(RESULT, ootype.OOType):
+ return history.BoxObj(ootype.cast_to_object(result))
+ else:
+ return history.BoxInt(lltype.cast_primitive(ootype.Signed, result))
+
+ return getargs, boxresult
+
+class StaticMethDescr(history.AbstractDescr):
+
+ def __init__(self, FUNC, ARGS, RESULT):
+ getargs, boxresult = make_getargs_boxres(ARGS, RESULT)
+ def callfunc(funcbox, argboxes):
+ funcobj = ootype.cast_from_object(FUNC, funcbox.getobj())
+ funcargs = getargs(argboxes)
+ res = funcobj(*funcargs)
+ return boxresult(res)
+ self.callfunc = callfunc
+
class MethDescr(history.AbstractDescr):
def __init__(self, METH, methname):
SELFTYPE = METH.SELFTYPE
- RESULT = METH.RESULT
- argsiter = unrolling_iterable(METH.ARGS)
- args_n = len(METH.ARGS)
+ getargs, boxresult = make_getargs_boxres(METH.ARGS, METH.RESULT)
def callmeth(selfbox, argboxes):
selfobj = ootype.cast_from_object(SELFTYPE, selfbox.getobj())
- methargs = ()
- assert len(argboxes) == args_n
- i = 0
- for ARG in argsiter:
- box = argboxes[i]
- i+=1
- if isinstance(ARG, ootype.OOType):
- arg = ootype.cast_from_object(ARG, box.getobj())
- else:
- arg = box.getint()
- methargs += (arg,)
meth = getattr(selfobj, methname)
- result = meth(*methargs)
- if isinstance(RESULT, ootype.OOType):
- return history.BoxObj(ootype.cast_to_object(result))
- else:
- return history.BoxInt(lltype.cast_primitive(ootype.Signed, result))
-
+ methargs = getargs(argboxes)
+ res = meth(*methargs)
+ return boxresult(res)
self.callmeth = callmeth
+class TypeDescr(history.AbstractDescr):
+
+ def __init__(self, TYPE):
+ self.TYPE = TYPE
+
# ____________________________________________________________
import pypy.jit.metainterp.executor
Modified: pypy/branch/pyjitpl5-simplify/pypy/jit/backend/minimal/runner.py
==============================================================================
--- pypy/branch/pyjitpl5-simplify/pypy/jit/backend/minimal/runner.py (original)
+++ pypy/branch/pyjitpl5-simplify/pypy/jit/backend/minimal/runner.py Wed Apr 15 18:53:04 2009
@@ -203,7 +203,7 @@
dict2['setarrayitem'])
@cached_method('_callcache')
- def calldescrof(self, ARGS, RESULT):
+ def calldescrof(self, FUNC, ARGS, RESULT):
dict2 = base_dict.copy()
args = []
for i, ARG in enumerate(ARGS):
Modified: pypy/branch/pyjitpl5-simplify/pypy/jit/backend/model.py
==============================================================================
--- pypy/branch/pyjitpl5-simplify/pypy/jit/backend/model.py (original)
+++ pypy/branch/pyjitpl5-simplify/pypy/jit/backend/model.py Wed Apr 15 18:53:04 2009
@@ -39,7 +39,15 @@
raise NotImplementedError
@staticmethod
- def calldescrof(ARGS, RESULT):
+ def calldescrof(FUNC, ARGS, RESULT):
+ raise NotImplementedError
+
+ @staticmethod
+ def methdescrof(METH, methname):
+ raise NotImplementedError
+
+ @staticmethod
+ def typedescrof(TYPE):
raise NotImplementedError
def cast_adr_to_int(self, adr):
@@ -122,8 +130,8 @@
def do_oosend(cpu, args, descr=None):
raise NotImplementedError
- def do_oostring(cpu, args, descr=None):
+ def do_oostring_char(cpu, args, descr=None):
raise NotImplementedError
- def do_oounicode(cpu, args, descr=None):
+ def do_oounicode_unichar(cpu, args, descr=None):
raise NotImplementedError
Modified: pypy/branch/pyjitpl5-simplify/pypy/jit/backend/test/runner.py
==============================================================================
--- pypy/branch/pyjitpl5-simplify/pypy/jit/backend/test/runner.py (original)
+++ pypy/branch/pyjitpl5-simplify/pypy/jit/backend/test/runner.py Wed Apr 15 18:53:04 2009
@@ -64,7 +64,7 @@
return chr(ord(c) + 1)
FPTR = lltype.Ptr(lltype.FuncType([lltype.Char], lltype.Char))
func_ptr = llhelper(FPTR, func)
- calldescr = cpu.calldescrof((lltype.Char,), lltype.Char)
+ calldescr = cpu.calldescrof(FPTR.TO, (lltype.Char,), lltype.Char)
x = cpu.do_call(
[BoxInt(cpu.cast_adr_to_int(llmemory.cast_ptr_to_adr(func_ptr))),
BoxInt(ord('A'))],
Modified: pypy/branch/pyjitpl5-simplify/pypy/jit/backend/x86/runner.py
==============================================================================
--- pypy/branch/pyjitpl5-simplify/pypy/jit/backend/x86/runner.py (original)
+++ pypy/branch/pyjitpl5-simplify/pypy/jit/backend/x86/runner.py Wed Apr 15 18:53:04 2009
@@ -607,7 +607,7 @@
counter += 1
return counter, basesize, ptr
- def calldescrof(self, argtypes, resulttype):
+ def calldescrof(self, functype, argtypes, resulttype):
if resulttype is lltype.Void:
size = 0
else:
Modified: pypy/branch/pyjitpl5-simplify/pypy/jit/metainterp/codewriter.py
==============================================================================
--- pypy/branch/pyjitpl5-simplify/pypy/jit/metainterp/codewriter.py (original)
+++ pypy/branch/pyjitpl5-simplify/pypy/jit/metainterp/codewriter.py Wed Apr 15 18:53:04 2009
@@ -135,7 +135,7 @@
return ()
# </hack>
NON_VOID_ARGS = [ARG for ARG in FUNC.ARGS if ARG is not lltype.Void]
- calldescr = self.cpu.calldescrof(tuple(NON_VOID_ARGS), FUNC.RESULT)
+ calldescr = self.cpu.calldescrof(FUNC, tuple(NON_VOID_ARGS), FUNC.RESULT)
return (cfnptr, calldescr)
def get_indirectcallset(self, graphs):
@@ -157,7 +157,7 @@
assert NON_VOID_ARGS == [T for T in ARGS if T is not lltype.Void]
assert RESULT == FUNC.RESULT
# ok
- calldescr = self.cpu.calldescrof(tuple(NON_VOID_ARGS), RESULT)
+ calldescr = self.cpu.calldescrof(FUNC, tuple(NON_VOID_ARGS), RESULT)
return calldescr, non_void_args
@@ -591,6 +591,11 @@
self.emit(self.var_position(op.args[2]))
self.register_var(op.result)
+## def serialize_op_new(self, op):
+## TYPE = op.args[0].value
+## self.emit('new', self.get_position(self.cpu.typedescrof(TYPE)))
+## self.register_var(op.result)
+
def serialize_op_zero_gc_pointers_inside(self, op):
pass # XXX assume Boehm for now
@@ -964,6 +969,13 @@
self.emit(self.get_position(virtualizabledesc))
self.emit(self.get_position(guard_field))
+ def serialize_op_oostring(self, op):
+ T = op.args[0].concretetype
+ opname = '%s_%s' % (op.opname, T._name.lower())
+ return self.default_serialize_op(op, opname)
+
+ serialize_op_oounicode = serialize_op_oostring
+
# ----------
def register_var(self, arg, verbose=True):
Modified: pypy/branch/pyjitpl5-simplify/pypy/jit/metainterp/pyjitpl.py
==============================================================================
--- pypy/branch/pyjitpl5-simplify/pypy/jit/metainterp/pyjitpl.py (original)
+++ pypy/branch/pyjitpl5-simplify/pypy/jit/metainterp/pyjitpl.py Wed Apr 15 18:53:04 2009
@@ -537,12 +537,12 @@
self.execute(rop.OOSEND_PURE, boxes, descr=methdescr)
@arguments("box", "box")
- def opimpl_oostring(self, obj, base):
- self.execute(rop.OOSTRING, [obj, base])
+ def opimpl_oostring_char(self, obj, base):
+ self.execute(rop.OOSTRING_CHAR, [obj, base])
@arguments("box", "box")
- def opimpl_oounicode(self, obj, base):
- self.execute(rop.OOUNICODE, [obj, base])
+ def opimpl_oounicode_unichar(self, obj, base):
+ self.execute(rop.OOUNICODE_UNICHAR, [obj, base])
@arguments("orgpc", "box", returns="box")
def opimpl_guard_value(self, pc, box):
Modified: pypy/branch/pyjitpl5-simplify/pypy/jit/metainterp/resoperation.py
==============================================================================
--- pypy/branch/pyjitpl5-simplify/pypy/jit/metainterp/resoperation.py (original)
+++ pypy/branch/pyjitpl5-simplify/pypy/jit/metainterp/resoperation.py Wed Apr 15 18:53:04 2009
@@ -159,8 +159,8 @@
UNICODEGETITEM = 84
#
# ootype operations
- OOSTRING = 85
- OOUNICODE = 86
+ OOSTRING_CHAR = 85
+ OOUNICODE_UNICHAR = 86
OOSEND_PURE = 87
#
_ALWAYS_PURE_LAST = 87 # ----- end of always_pure operations -----
Modified: pypy/branch/pyjitpl5-simplify/pypy/jit/metainterp/test/test_basic.py
==============================================================================
--- pypy/branch/pyjitpl5-simplify/pypy/jit/metainterp/test/test_basic.py (original)
+++ pypy/branch/pyjitpl5-simplify/pypy/jit/metainterp/test/test_basic.py Wed Apr 15 18:53:04 2009
@@ -50,6 +50,7 @@
def meta_interp(self, *args, **kwds):
kwds['CPUClass'] = self.CPUClass
+ kwds['type_system'] = self.type_system
return ll_meta_interp(*args, **kwds)
def interp_operations(self, f, args, policy=None, **kwds):
@@ -175,15 +176,12 @@
return "?"
res = self.interp_operations(f, [1])
assert res == ord("d") # XXX should be "d"
- if self.type_system != 'ootype':
- # this test fails on ootype, see test_chr2str
- res = self.interp_operations(f, [6])
- assert res == 6
+ res = self.interp_operations(f, [6])
+ assert res == 6
res = self.interp_operations(f, [42])
assert res == ord("?")
def test_chr2str(self):
- # the problem is that we call oostring(6) instead of oostring('\x06')
def f(n):
s = chr(n)
return s[0]
@@ -516,15 +514,18 @@
def skip(self):
py.test.skip('in-progress')
- test_chr2str = skip
- test_unicode = skip # for the same reason as test_chr2str
- test_residual_call = skip
test_format = skip
test_getfield = skip
test_getfield_immutable = skip
test_oops_on_nongc = skip
test_instantiate_classes = skip
+ test_loop = skip
+ test_we_are_jitted = skip
+ test_r_uint = skip
+ test_mod_ovf = skip
+ test_bridge_from_interpreter = skip
+
test_constant_across_mp = skip
test_stopatxpolicy = skip
test_print = skip
Modified: pypy/branch/pyjitpl5-simplify/pypy/jit/metainterp/warmspot.py
==============================================================================
--- pypy/branch/pyjitpl5-simplify/pypy/jit/metainterp/warmspot.py (original)
+++ pypy/branch/pyjitpl5-simplify/pypy/jit/metainterp/warmspot.py Wed Apr 15 18:53:04 2009
@@ -34,8 +34,10 @@
warmrunnerdesc.finish()
translator.warmrunnerdesc = warmrunnerdesc # for later debugging
-def ll_meta_interp(function, args, backendopt=False, **kwds):
- interp, graph = get_interpreter(function, args, backendopt=backendopt,
+def ll_meta_interp(function, args, backendopt=False, type_system='lltype', **kwds):
+ interp, graph = get_interpreter(function, args,
+ backendopt=backendopt,
+ type_system=type_system,
inline_threshold=0)
clear_tcache()
return jittify_and_run(interp, graph, args, **kwds)
More information about the Pypy-commit
mailing list