Author: Maciej Fijalkowski <[email protected]>
Branch:
Changeset: r44206:c937e03e6d79
Date: 2011-05-16 14:59 +0200
http://bitbucket.org/pypy/pypy/changeset/c937e03e6d79/
Log: Put two quasiimmut fields on executioncontext. Should speed up some
things slightly.
diff --git a/pypy/interpreter/executioncontext.py
b/pypy/interpreter/executioncontext.py
--- a/pypy/interpreter/executioncontext.py
+++ b/pypy/interpreter/executioncontext.py
@@ -24,6 +24,8 @@
# XXX [fijal] but they're not. is_being_profiled is guarded a bit all
# over the place as well as w_tracefunc
+ _immutable_fields_ = ['profilefunc?', 'w_tracefunc?']
+
def __init__(self, space):
self.space = space
self.topframeref = jit.vref_None
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
@@ -219,11 +219,10 @@
assert not NON_VOID_ARGS, ("arguments not supported for "
"loop-invariant function!")
# build the extraeffect
+ can_invalidate = self.quasiimmut_analyzer.analyze(op)
if extraeffect is None:
if self.virtualizable_analyzer.analyze(op):
extraeffect = EffectInfo.EF_FORCES_VIRTUAL_OR_VIRTUALIZABLE
- elif self.quasiimmut_analyzer.analyze(op):
- extraeffect = EffectInfo.EF_CAN_INVALIDATE
elif loopinvariant:
extraeffect = EffectInfo.EF_LOOPINVARIANT
elif pure:
@@ -236,12 +235,14 @@
#
effectinfo = effectinfo_from_writeanalyze(
self.readwrite_analyzer.analyze(op), self.cpu, extraeffect,
- oopspecindex)
+ oopspecindex, can_invalidate)
#
if pure or loopinvariant:
assert effectinfo is not None
assert extraeffect != EffectInfo.EF_FORCES_VIRTUAL_OR_VIRTUALIZABLE
- assert extraeffect != EffectInfo.EF_CAN_INVALIDATE
+ # XXX this should also say assert not can_invalidate, but
+ # it can't because our analyzer is not good enough for now
+ # (and getexecutioncontext() can't really invalidate)
#
return self.cpu.calldescrof(FUNC, tuple(NON_VOID_ARGS), RESULT,
effectinfo)
diff --git a/pypy/jit/codewriter/effectinfo.py
b/pypy/jit/codewriter/effectinfo.py
--- a/pypy/jit/codewriter/effectinfo.py
+++ b/pypy/jit/codewriter/effectinfo.py
@@ -13,7 +13,6 @@
EF_LOOPINVARIANT = 1 #special: call it only once per loop
EF_CANNOT_RAISE = 2 #a function which cannot raise
EF_CAN_RAISE = 3 #normal function (can raise)
- EF_CAN_INVALIDATE = 4 #can force all GUARD_NOT_INVALIDATED
EF_FORCES_VIRTUAL_OR_VIRTUALIZABLE = 5 #can raise and force virtualizables
# the 'oopspecindex' field is one of the following values:
@@ -79,7 +78,8 @@
def __new__(cls, readonly_descrs_fields,
write_descrs_fields, write_descrs_arrays,
extraeffect=EF_CAN_RAISE,
- oopspecindex=OS_NONE):
+ oopspecindex=OS_NONE,
+ can_invalidate=False):
key = (frozenset(readonly_descrs_fields),
frozenset(write_descrs_fields),
frozenset(write_descrs_arrays),
@@ -97,19 +97,21 @@
result.write_descrs_fields = write_descrs_fields
result.write_descrs_arrays = write_descrs_arrays
result.extraeffect = extraeffect
+ result.can_invalidate = can_invalidate
result.oopspecindex = oopspecindex
cls._cache[key] = result
return result
def check_can_invalidate(self):
- return self.extraeffect >= self.EF_CAN_INVALIDATE
+ return self.can_invalidate
def check_forces_virtual_or_virtualizable(self):
return self.extraeffect >= self.EF_FORCES_VIRTUAL_OR_VIRTUALIZABLE
def effectinfo_from_writeanalyze(effects, cpu,
extraeffect=EffectInfo.EF_CAN_RAISE,
- oopspecindex=EffectInfo.OS_NONE):
+ oopspecindex=EffectInfo.OS_NONE,
+ can_invalidate=False):
from pypy.translator.backendopt.writeanalyze import top_set
if effects is top_set:
return None
@@ -147,7 +149,8 @@
write_descrs_fields,
write_descrs_arrays,
extraeffect,
- oopspecindex)
+ oopspecindex,
+ can_invalidate)
def consider_struct(TYPE, fieldname):
if fieldType(TYPE, fieldname) is lltype.Void:
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit