[pypy-svn] r51852 - pypy/branch/jit-refactoring/pypy/jit/rainbow
cfbolz at codespeak.net
cfbolz at codespeak.net
Mon Feb 25 14:58:01 CET 2008
Author: cfbolz
Date: Mon Feb 25 14:57:59 2008
New Revision: 51852
Modified:
pypy/branch/jit-refactoring/pypy/jit/rainbow/codewriter.py
Log:
more cleanups
Modified: pypy/branch/jit-refactoring/pypy/jit/rainbow/codewriter.py
==============================================================================
--- pypy/branch/jit-refactoring/pypy/jit/rainbow/codewriter.py (original)
+++ pypy/branch/jit-refactoring/pypy/jit/rainbow/codewriter.py Mon Feb 25 14:57:59 2008
@@ -606,109 +606,117 @@
def serialize_op_direct_call(self, op):
kind, withexc = self.guess_call_kind(op)
+ handler = getattr(self, "handle_%s_call" % (kind, ))
print op, kind, withexc
- if kind == "oopspec":
- from pypy.jit.timeshifter.oop import Index
- fnobj = op.args[0].value._obj
- oopspecdescindex = self.oopspecdesc_position(fnobj, withexc)
- oopspecdesc = self.oopspecdescs[oopspecdescindex]
- opargs = op.args[1:]
- args_v = []
- args = []
- for obj in oopspecdesc.argtuple:
- if isinstance(obj, Index):
- v = opargs[obj.n]
- else:
- v = flowmodel.Constant(obj, lltype.typeOf(obj))
- args_v.append(v)
- args.append(self.serialize_oparg("red", v))
-
- ll_handler = oopspecdesc.ll_handler
- couldfold = oopspecdesc.couldfold
- missing_args = ((ll_handler.func_code.co_argcount - 3) -
- len(oopspecdesc.argtuple))
- assert missing_args >= 0
- if missing_args > 0:
- assert (ll_handler.func_defaults[-missing_args:] ==
- (None,) * missing_args)
-
- if oopspecdesc.is_method:
- hs_self = self.hannotator.binding(
- opargs[oopspecdesc.argtuple[0].n])
- deepfrozen = hs_self.deepfrozen
+ return handler(op, withexc)
+
+ def handle_oopspec_call(self, op, withexc):
+ from pypy.jit.timeshifter.oop import Index
+ fnobj = op.args[0].value._obj
+ oopspecdescindex = self.oopspecdesc_position(fnobj, withexc)
+ oopspecdesc = self.oopspecdescs[oopspecdescindex]
+ opargs = op.args[1:]
+ args_v = []
+ args = []
+ for obj in oopspecdesc.argtuple:
+ if isinstance(obj, Index):
+ v = opargs[obj.n]
else:
- deepfrozen = False
+ v = flowmodel.Constant(obj, lltype.typeOf(obj))
+ args_v.append(v)
+ args.append(self.serialize_oparg("red", v))
+
+ ll_handler = oopspecdesc.ll_handler
+ couldfold = oopspecdesc.couldfold
+ missing_args = ((ll_handler.func_code.co_argcount - 3) -
+ len(oopspecdesc.argtuple))
+ assert missing_args >= 0
+ if missing_args > 0:
+ assert (ll_handler.func_defaults[-missing_args:] ==
+ (None,) * missing_args)
+
+ if oopspecdesc.is_method:
+ hs_self = self.hannotator.binding(
+ opargs[oopspecdesc.argtuple[0].n])
+ deepfrozen = hs_self.deepfrozen
+ else:
+ deepfrozen = False
+
+ self.emit("red_oopspec_call_%s" % (len(args), ))
+ self.emit(oopspecdescindex)
+ self.emit(deepfrozen)
+ self.emit(*args)
+ self.register_redvar(op.result)
- self.emit("red_oopspec_call_%s" % (len(args), ))
- self.emit(oopspecdescindex)
- self.emit(deepfrozen)
- self.emit(*args)
- self.register_redvar(op.result)
- return
- elif kind == "green":
- voidargs = [const.value for const in op.args[1:]
- if const.concretetype == lltype.Void]
- fnptr = op.args[0]
- pos = self.calldesc_position(lltype.typeOf(fnptr.value), *voidargs)
- func = self.serialize_oparg("green", fnptr)
- emitted_args = []
- for v in op.args[1:]:
- if v.concretetype != lltype.Void:
- emitted_args.append(self.serialize_oparg("green", v))
- self.emit("green_direct_call")
- self.emit(func, pos)
- self.emit(len(emitted_args))
- self.emit(*emitted_args)
- self.register_greenvar(op.result)
- return
- elif kind == "residual":
- fnptr = op.args[0]
- pos = self.calldesc_position(lltype.typeOf(fnptr.value))
- func = self.serialize_oparg("red", fnptr)
- emitted_args = []
- for v in op.args[1:]:
- emitted_args.append(self.serialize_oparg("red", v))
- self.emit("red_residual_direct_call")
- self.emit(func, pos, withexc, len(emitted_args), *emitted_args)
+ def handle_green_call(self, op, withexc):
+ voidargs = [const.value for const in op.args[1:]
+ if const.concretetype == lltype.Void]
+ fnptr = op.args[0]
+ pos = self.calldesc_position(lltype.typeOf(fnptr.value), *voidargs)
+ func = self.serialize_oparg("green", fnptr)
+ emitted_args = []
+ for v in op.args[1:]:
+ if v.concretetype != lltype.Void:
+ emitted_args.append(self.serialize_oparg("green", v))
+ self.emit("green_direct_call")
+ self.emit(func, pos)
+ self.emit(len(emitted_args))
+ self.emit(*emitted_args)
+ self.register_greenvar(op.result)
+
+ def handle_residual_call(self, op, withexc):
+ fnptr = op.args[0]
+ pos = self.calldesc_position(lltype.typeOf(fnptr.value))
+ func = self.serialize_oparg("red", fnptr)
+ emitted_args = []
+ for v in op.args[1:]:
+ emitted_args.append(self.serialize_oparg("red", v))
+ self.emit("red_residual_direct_call")
+ self.emit(func, pos, withexc, len(emitted_args), *emitted_args)
+ self.register_redvar(op.result)
+ pos = self.register_redvar(("residual_flags_red", op.args[0]))
+ self.emit("promote")
+ self.emit(pos)
+ self.emit(self.promotiondesc_position(lltype.Signed))
+ self.register_greenvar(("residual_flags_green", op.args[0]), check=False)
+ self.emit("residual_fetch", True, pos)
+
+ def handle_rpyexc_raise_call(self, op, withexc):
+ emitted_args = []
+ for v in op.args[1:]:
+ emitted_args.append(self.serialize_oparg("red", v))
+ self.emit("setexception", *emitted_args)
+
+ def handle_red_call(self, op, withexc, kind="red"):
+ targets = dict(self.graphs_from(op))
+ assert len(targets) == 1
+ targetgraph, = targets.values()
+ graphindex = self.graph_position(targetgraph)
+ args = targetgraph.getargs()
+ emitted_args = self.args_of_call(op.args[1:], args)
+ self.emit("red_direct_call")
+ self.emit(*emitted_args)
+ self.emit(graphindex)
+ if kind == "red":
self.register_redvar(op.result)
- pos = self.register_redvar(("residual_flags_red", op.args[0]))
- self.emit("promote")
- self.emit(pos)
- self.emit(self.promotiondesc_position(lltype.Signed))
- self.register_greenvar(("residual_flags_green", op.args[0]), check=False)
- self.emit("residual_fetch", True, pos)
- return
- elif kind == "rpyexc_raise":
- emitted_args = []
- for v in op.args[1:]:
- emitted_args.append(self.serialize_oparg("red", v))
- self.emit("setexception", *emitted_args)
- return
+ self.emit("red_after_direct_call")
+
+ def handle_gray_call(self, op, withexc):
+ return self.handle_red_call(op, withexc, "gray")
+
+ def handle_yellow_call(self, op, withexc):
targets = dict(self.graphs_from(op))
assert len(targets) == 1
targetgraph, = targets.values()
- if kind == "red" or kind == "gray":
- graphindex = self.graph_position(targetgraph)
- args = targetgraph.getargs()
- emitted_args = self.args_of_call(op.args[1:], args)
- self.emit("red_direct_call")
- self.emit(*emitted_args)
- self.emit(graphindex)
- if kind == "red":
- self.register_redvar(op.result)
- self.emit("red_after_direct_call")
- elif kind == "yellow":
- graphindex = self.graph_position(targetgraph)
- args = targetgraph.getargs()
- emitted_args = self.args_of_call(op.args[1:], args)
- self.emit("yellow_direct_call")
- self.emit(*emitted_args)
- self.emit(graphindex)
- self.emit("yellow_after_direct_call")
- self.emit("yellow_retrieve_result")
- self.register_greenvar(op.result)
- else:
- XXX
+ graphindex = self.graph_position(targetgraph)
+ args = targetgraph.getargs()
+ emitted_args = self.args_of_call(op.args[1:], args)
+ self.emit("yellow_direct_call")
+ self.emit(*emitted_args)
+ self.emit(graphindex)
+ self.emit("yellow_after_direct_call")
+ self.emit("yellow_retrieve_result")
+ self.register_greenvar(op.result)
def serialize_op_indirect_call(self, op):
XXX
More information about the Pypy-commit
mailing list