[pypy-svn] r56731 - pypy/branch/oo-jit/pypy/jit/codegen/cli
antocuni at codespeak.net
antocuni at codespeak.net
Wed Jul 23 11:27:45 CEST 2008
Author: antocuni
Date: Wed Jul 23 11:27:43 2008
New Revision: 56731
Modified:
pypy/branch/oo-jit/pypy/jit/codegen/cli/operation.py
pypy/branch/oo-jit/pypy/jit/codegen/cli/rgenop.py
Log:
sanitize the way labels and branches are handled:
- use better name to distinguish labels: "label" is used for Label()
instances; il_label and il_*_label are used for IL lables
(i.e. those created by il.DefineLabel())
- move the logic about branch&block creation to MethodGenerator
Modified: pypy/branch/oo-jit/pypy/jit/codegen/cli/operation.py
==============================================================================
--- pypy/branch/oo-jit/pypy/jit/codegen/cli/operation.py (original)
+++ pypy/branch/oo-jit/pypy/jit/codegen/cli/operation.py Wed Jul 23 11:27:43 2008
@@ -74,23 +74,23 @@
class MarkLabel(Operation):
- def __init__(self, meth, label):
+ def __init__(self, meth, il_label):
self.meth = meth
- self.label = label
+ self.il_label = il_label
def restype(self):
return None
def emit(self):
- self.meth.il.MarkLabel(self.label)
+ self.meth.il.MarkLabel(self.il_label)
class FollowLink(Operation):
- def __init__(self, meth, outputargs_gv, inputargs_gv, label):
+ def __init__(self, meth, outputargs_gv, inputargs_gv, il_label):
self.meth = meth
self.outputargs_gv = outputargs_gv
self.inputargs_gv = inputargs_gv
- self.label = label
+ self.il_label = il_label
def restype(self):
return None
@@ -99,16 +99,15 @@
for i in range(len(self.outputargs_gv)):
self.outputargs_gv[i].load(self.meth)
self.inputargs_gv[i].store(self.meth)
- self.meth.il.Emit(OpCodes.Br, self.label)
-
+ self.meth.il.Emit(OpCodes.Br, self.il_label)
class Branch(Operation):
- def __init__(self, meth, gv_cond, opcode, label):
+ def __init__(self, meth, gv_cond, opcode, il_label):
self.meth = meth
self.gv_cond = gv_cond
self.opcode = opcode
- self.label = label
+ self.il_label = il_label
def restype(self):
return None
@@ -116,7 +115,7 @@
def emit(self):
if self.gv_cond is not None:
self.gv_cond.load(self.meth)
- self.meth.il.Emit(self.opcode, self.label)
+ self.meth.il.Emit(self.opcode, self.il_label)
class Return(Operation):
@@ -129,11 +128,11 @@
def emit(self):
retvar = self.meth.retvar
- retlabel = self.meth.retlabel
+ il_retlabel = self.meth.il_retlabel
if self.gv_x is not None:
self.gv_x.load(self.meth)
self.meth.il.Emit(OpCodes.Stloc, retvar)
- self.meth.il.Emit(OpCodes.Br, retlabel)
+ self.meth.il.Emit(OpCodes.Br, il_retlabel)
class Call(Operation):
@@ -223,7 +222,7 @@
il.Emit(OpCodes.Ldloc, mbuilder.inputargs_var)
il.Emit(OpCodes.Callvirt, meth_execute)
il.Emit(OpCodes.Stloc, mbuilder.jumpto_var)
- il.Emit(OpCodes.Br, mbuilder.dispatch_jump_label)
+ il.Emit(OpCodes.Br, mbuilder.il_dispatch_jump_label)
class InputArgsManager:
Modified: pypy/branch/oo-jit/pypy/jit/codegen/cli/rgenop.py
==============================================================================
--- pypy/branch/oo-jit/pypy/jit/codegen/cli/rgenop.py (original)
+++ pypy/branch/oo-jit/pypy/jit/codegen/cli/rgenop.py Wed Jul 23 11:27:43 2008
@@ -233,9 +233,9 @@
class Label(GenLabel):
- def __init__(self, blockid, label, inputargs_gv):
+ def __init__(self, blockid, il_label, inputargs_gv):
self.blockid = blockid
- self.label = label
+ self.il_label = il_label
self.inputargs_gv = inputargs_gv
@@ -358,16 +358,26 @@
self.delegatetype = delegatetype
self.gv_entrypoint = FunctionConst(delegatetype)
self.genconsts = {}
- self.branches = [BranchBuilder(self, self.il.DefineLabel())]
+ self.branches = []
+ self.newbranch()
if restype is not None:
self.retvar = self.il.DeclareLocal(restype)
else:
self.retvar = None
- self.retlabel = self.il.DefineLabel()
+ self.il_retlabel = self.il.DefineLabel()
self.graphinfo = graphinfo
- def appendbranch(self, branchbuilder):
- self.branches.append(branchbuilder)
+ def newbranch(self):
+ branch = BranchBuilder(self, self.il.DefineLabel())
+ self.branches.append(branch)
+ return branch
+
+ def newblock(self, args_gv):
+ blocks = self.graphinfo.blocks
+ blockid = len(blocks)
+ result = Label(blockid, self.il.DefineLabel(), args_gv)
+ blocks.append((self, result))
+ return result
def emit_code(self):
# emit initialization code
@@ -381,7 +391,7 @@
self.emit_before_returnblock()
# render the return block for last, else the verifier could complain
- self.il.MarkLabel(self.retlabel)
+ self.il.MarkLabel(self.il_retlabel)
if self.retvar:
self.il.Emit(OpCodes.Ldloc, self.retvar)
self.il.Emit(OpCodes.Ret)
@@ -410,7 +420,7 @@
if self.graphinfo.has_flexswitches:
return
self.graphinfo.has_flexswitches = True
- self.dispatch_jump_label = self.il.DefineLabel()
+ self.il_dispatch_jump_label = self.il.DefineLabel()
self.inputargs_clitype = class2type(cInputArgs)
self.inputargs_var = self.il.DeclareLocal(self.inputargs_clitype)
self.jumpto_var = self.il.DeclareLocal(class2type(cInt32))
@@ -428,17 +438,17 @@
if not self.graphinfo.has_flexswitches:
return
# make sure we don't enter dispatch_jump by mistake
- self.il.Emit(OpCodes.Br, self.retlabel)
- self.il.MarkLabel(self.dispatch_jump_label)
+ self.il.Emit(OpCodes.Br, self.il_retlabel)
+ self.il.MarkLabel(self.il_dispatch_jump_label)
- labels = new_array(System.Reflection.Emit.Label,
+ il_labels = new_array(System.Reflection.Emit.Label,
len(self.graphinfo.blocks))
- for blockid, (builder, genlabel) in self.graphinfo.blocks:
+ for blockid, (builder, label) in self.graphinfo.blocks:
assert builder is self
- labels[blockid] = genlabel.label
+ il_labels[blockid] = label.il_label
self.il.Emit(OpCodes.Ldloc, self.jumpto_var)
- self.il.Emit(OpCodes.Switch, labels)
+ self.il.Emit(OpCodes.Switch, il_labels)
# XXX: handle blockids that are inside flexswitch cases
# default: Utils.throwInvalidBlockId(jumpto)
clitype = class2type(cUtils)
@@ -449,10 +459,10 @@
class BranchBuilder(GenBuilder):
- def __init__(self, meth, label):
+ def __init__(self, meth, il_label):
self.meth = meth
self.rgenop = meth.rgenop
- self.label = label
+ self.il_label = il_label
self.operations = []
self.is_open = False
self.genconsts = meth.genconsts
@@ -465,11 +475,11 @@
self.appendop(op)
self.is_open = False
- def finish_and_goto(self, outputargs_gv, target):
- inputargs_gv = target.inputargs_gv
+ def finish_and_goto(self, outputargs_gv, label):
+ inputargs_gv = label.inputargs_gv
assert len(inputargs_gv) == len(outputargs_gv)
op = ops.FollowLink(self.meth, outputargs_gv,
- inputargs_gv, target.label)
+ inputargs_gv, label.il_label)
self.appendop(op)
self.is_open = False
@@ -518,23 +528,14 @@
args_gv[i] = op.gv_res()
else:
seen[gv] = None
- label = self.meth.il.DefineLabel()
- self.appendop(ops.MarkLabel(self.meth, label))
- return self.create_label(label, args_gv)
-
- def create_label(self, label, args_gv):
- blocks = self.meth.graphinfo.blocks
- blockid = len(blocks)
- result = Label(blockid, label, args_gv)
- blocks.append((self.meth, result))
- return result
+ label = self.meth.newblock(args_gv)
+ self.appendop(ops.MarkLabel(self.meth, label.il_label))
+ return label
def _jump_if(self, gv_condition, opcode):
- label = self.meth.il.DefineLabel()
- op = ops.Branch(self.meth, gv_condition, opcode, label)
+ branch = self.meth.newbranch()
+ op = ops.Branch(self.meth, gv_condition, opcode, branch.il_label)
self.appendop(op)
- branch = BranchBuilder(self.meth, label)
- self.meth.appendbranch(branch)
return branch
def jump_if_false(self, gv_condition, args_for_jump_gv):
@@ -544,20 +545,19 @@
return self._jump_if(gv_condition, OpCodes.Brtrue)
def flexswitch(self, gv_exitswitch, args_gv):
- # XXX: this code is valid only for Meth
+ # XXX: this code is valid only for GraphGenerator
self.meth.setup_flexswitches()
flexswitch = IntFlexSwitch()
- flexswitch.xxxbuilder = BranchBuilder(self.meth, self.meth.il.DefineLabel())
+ flexswitch.xxxbuilder = self.meth.newbranch()
gv_flexswitch = flexswitch.gv_flexswitch
- lbl = self.meth.il.DefineLabel()
- default_label = self.create_label(lbl, args_gv)
- flexswitch.llflexswitch.set_default_blockid(default_label.blockid)
- op = ops.DoFlexSwitch(self.meth, gv_flexswitch, gv_exitswitch, args_gv)
+ default_branch = self.meth.newbranch()
+ label = default_branch.label
+ flexswitch.llflexswitch.set_default_blockid(label.blockid)
+ op = ops.DoFlexSwitch(self.meth, gv_flexswitch,
+ gv_exitswitch, args_gv)
self.appendop(op)
- default_builder = BranchBuilder(self.meth, default_label.label)
- self.meth.appendbranch(default_builder)
self.is_open = False
- return flexswitch, default_builder
+ return flexswitch, default_branch
def appendop(self, op):
self.operations.append(op)
@@ -568,7 +568,7 @@
def replayops(self):
assert not self.is_open
il = self.meth.il
- il.MarkLabel(self.label)
+ il.MarkLabel(self.il_label)
for op in self.operations:
op.emit()
More information about the Pypy-commit
mailing list