gnu.bytecode
Class SwitchState

java.lang.Object
  extended by gnu.bytecode.SwitchState

public class SwitchState
extends java.lang.Object

Maintains the state for generating a switch statement or expression.

Simple example

To translate:

 switch (exps) {
   case 1: exp1; break;
   case 2: exp2; break;
   default: expd;
 } 
you can do:
 compile[exps]
 SwitchState sw = code.startSwitch();
 sw.addCase(1, code);
 compile[exp1];
 sw.exitSwitch(code);
 sw.addCase(2, code);
 compile[exp2];
 sw.exitSwitch(code);
 sw.addDefault(code);
 compile[expd];
 sw.finish(code);
 


Constructor Summary
SwitchState(CodeAttr code)
           
 
Method Summary
 boolean addCase(int value, CodeAttr code)
          Add a new case.
 boolean addCaseGoto(int value, CodeAttr code, Label label)
          Optimization of addCase(value, code); emitGoto(label).
 void addDefault(CodeAttr code)
           
 void exitSwitch(CodeAttr code)
          Break/exit from this switch.
 void finish(CodeAttr code)
          Handle the end of the switch statement.
 int getMaxValue()
           
 int getNumCases()
           
 boolean insertCase(int value, Label label, CodeAttr code)
          Internal routine to add a new case.
 void switchValuePushed(CodeAttr code)
          Needs to be called after the switch value has been pushed.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

SwitchState

public SwitchState(CodeAttr code)
Method Detail

getMaxValue

public int getMaxValue()

getNumCases

public int getNumCases()

switchValuePushed

public void switchValuePushed(CodeAttr code)
Needs to be called after the switch value has been pushed. I.e. in execution order, just before the actual switch instruction. Called implicitly by CodeAttr.startSwitch().


addCase

public boolean addCase(int value,
                       CodeAttr code)
Add a new case.

Parameters:
value - the case value to match against at run-time
code - the CodeAttr of the Method we are generating code for
Returns:
true on success; false if value duplicates an existing value

addCaseGoto

public boolean addCaseGoto(int value,
                           CodeAttr code,
                           Label label)
Optimization of addCase(value, code); emitGoto(label).


addDefault

public void addDefault(CodeAttr code)

insertCase

public boolean insertCase(int value,
                          Label label,
                          CodeAttr code)
Internal routine to add a new case.

Parameters:
value - the case value to match against at run-time
label - the location to go to if the value matches
code - the CodeAttr of the Method we are generating code for
Returns:
true on success; false if value duplicates an existing value

exitSwitch

public void exitSwitch(CodeAttr code)
Break/exit from this switch. Doesn't allow exiting through a try - if you need that, use an ExitableBlock.


finish

public void finish(CodeAttr code)
Handle the end of the switch statement. Assume the case value is on the stack; go to the matching case label.