[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