[pypy-svn] pypy default: Don't arbitrarily mutate the '.extraeffect' attribute; instead,
arigo
commits-noreply at bitbucket.org
Wed Jan 26 15:25:51 CET 2011
Author: Armin Rigo <arigo at tunes.org>
Branch:
Changeset: r41352:c8f8cbca9953
Date: 2011-01-26 15:25 +0100
http://bitbucket.org/pypy/pypy/changeset/c8f8cbca9953/
Log: Don't arbitrarily mutate the '.extraeffect' attribute; instead, pass
it as an optional argument to the function that constructs the
result.
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
@@ -188,7 +188,8 @@
FUNC.RESULT)
return (fnaddr, calldescr)
- def getcalldescr(self, op, oopspecindex=EffectInfo.OS_NONE):
+ def getcalldescr(self, op, oopspecindex=EffectInfo.OS_NONE,
+ extraeffect=None):
"""Return the calldescr that describes all calls done by 'op'.
This returns a calldescr that we can put in the corresponding
call operation in the calling jitcode. It gets an effectinfo
@@ -216,17 +217,18 @@
assert not NON_VOID_ARGS, ("arguments not supported for "
"loop-invariant function!")
# build the extraeffect
- if self.virtualizable_analyzer.analyze(op):
- extraeffect = EffectInfo.EF_FORCES_VIRTUAL_OR_VIRTUALIZABLE
- elif loopinvariant:
- extraeffect = EffectInfo.EF_LOOPINVARIANT
- elif pure:
- # XXX check what to do about exceptions (also MemoryError?)
- extraeffect = EffectInfo.EF_PURE
- elif self._canraise(op):
- extraeffect = EffectInfo.EF_CAN_RAISE
- else:
- extraeffect = EffectInfo.EF_CANNOT_RAISE
+ if extraeffect is None:
+ if self.virtualizable_analyzer.analyze(op):
+ extraeffect = EffectInfo.EF_FORCES_VIRTUAL_OR_VIRTUALIZABLE
+ elif loopinvariant:
+ extraeffect = EffectInfo.EF_LOOPINVARIANT
+ elif pure:
+ # XXX check what to do about exceptions (also MemoryError?)
+ extraeffect = EffectInfo.EF_PURE
+ elif self._canraise(op):
+ extraeffect = EffectInfo.EF_CAN_RAISE
+ else:
+ extraeffect = EffectInfo.EF_CANNOT_RAISE
#
effectinfo = effectinfo_from_writeanalyze(
self.readwrite_analyzer.analyze(op), self.cpu, extraeffect,
diff --git a/pypy/jit/codewriter/jtransform.py b/pypy/jit/codewriter/jtransform.py
--- a/pypy/jit/codewriter/jtransform.py
+++ b/pypy/jit/codewriter/jtransform.py
@@ -1107,9 +1107,10 @@
# Strings and Unicodes.
def _handle_oopspec_call(self, op, args, oopspecindex, extraeffect=None):
- calldescr = self.callcontrol.getcalldescr(op, oopspecindex)
- if extraeffect:
- calldescr.get_extra_info().extraeffect = extraeffect
+ calldescr = self.callcontrol.getcalldescr(op, oopspecindex,
+ extraeffect)
+ if extraeffect is not None:
+ assert calldescr.get_extra_info().extraeffect == extraeffect
if isinstance(op.args[0].value, str):
pass # for tests only
else:
diff --git a/pypy/jit/codewriter/test/test_jtransform.py b/pypy/jit/codewriter/test/test_jtransform.py
--- a/pypy/jit/codewriter/test/test_jtransform.py
+++ b/pypy/jit/codewriter/test/test_jtransform.py
@@ -90,7 +90,7 @@
self.callinfocollection = FakeCallInfoCollection()
def guess_call_kind(self, op):
return 'builtin'
- def getcalldescr(self, op, oopspecindex=None):
+ def getcalldescr(self, op, oopspecindex=None, extraeffect=None):
assert oopspecindex is not None # in this test
EI = effectinfo.EffectInfo
if oopspecindex != EI.OS_ARRAYCOPY:
diff --git a/pypy/jit/codewriter/test/test_list.py b/pypy/jit/codewriter/test/test_list.py
--- a/pypy/jit/codewriter/test/test_list.py
+++ b/pypy/jit/codewriter/test/test_list.py
@@ -37,7 +37,7 @@
class FakeCallControl:
class getcalldescr(AbstractDescr):
- def __init__(self, op, oopspecindex=0):
+ def __init__(self, op, oopspecindex=0, extraeffect=None):
self.op = op
self.oopspecindex = oopspecindex
def __repr__(self):
More information about the Pypy-commit
mailing list