Skip to content

Control flow

exotic edited this page Feb 18, 2024 · 2 revisions

Control flow

If conditionals

ifeq | ifne

The ifeq instruction is used when comparing states (boolean). It check if the top of the stack (last element) is 0, if it is then it jumps to the specified label, if not flow continues on. Let's say you found this block of bytecode:

ldc 1
ifeq B

This would not jump due to the fact that the last stack element (1) is not 0 so the condition isn't satisfied.

The ifne instruction is simply the opposite meaning it would jump if it saw that the last stack element wasn't 0.

if_icmpeq | if_icmpne

The if_icmpeq simply checks two integer values for equality using of course the stack. Here's an example:

ldc 5
ldc 6
if_icmpeq B

In this case it wouldn't jump as 5 != 6.

The if_icmpne instruction is again simply the opposite meaning with the same bytecode it would jump this time because it checks for inequality opposed to the if_icmpeq instruction.

Lookupswitch

The lookupswitch instruction can be confusing so here's an explanation on how it works.

Let's take this lookupswitch using the JASM syntax:

lookupswitch
   .case 1 A
   .case 2 B
   .case 3 C
   .default D

Now a lookupswitch is very easy to understand if we imagine what a switch in Java would look like:

switch (expression) {
   case 1:
      // do something in case expression is equal to be 1
      break;
   case 2:
      // do something in case expression is equal to be 2
      break;
   default:
      break;
}

Now as we can see the switch statement depends on what the expression equals to, for example if the expression is 1 + 1 it would obviously equal to 2 meaning our case 2: code will be hit.

This works about the same in bytecode. The lookupswitch looks up the last stack element and depending on what it is, it jumps to a specific label, in our previous code we can see that if the last stack element happens to be 1 then we jump to the A label if it's 2 then we jump to the B label and if it's none then our default is triggered which jumps to D an example where default would be triggered is this:

bipush 2
lookupswitch
   .case 1 A
   .default B

And that's it now you know how different control flow instructions work in the JVM.

Clone this wiki locally