1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.compress.harmony.unpack200.bytecode.forms;
18
19 import org.apache.commons.compress.harmony.unpack200.bytecode.ByteCode;
20 import org.apache.commons.compress.harmony.unpack200.bytecode.CodeAttribute;
21
22 public abstract class SwitchForm extends VariableInstructionForm {
23
24 public SwitchForm(final int opcode, final String name) {
25 super(opcode, name);
26 }
27
28
29
30
31
32
33
34 @Override
35 public void fixUpByteCodeTargets(final ByteCode byteCode, final CodeAttribute codeAttribute) {
36
37 final int[] originalTargets = byteCode.getByteCodeTargets();
38 final int numberOfLabels = originalTargets.length;
39 final int[] replacementTargets = new int[numberOfLabels];
40
41 final int sourceIndex = byteCode.getByteCodeIndex();
42 final int sourceValue = codeAttribute.byteCodeOffsets.get(sourceIndex).intValue();
43 for (int index = 0; index < numberOfLabels; index++) {
44 final int absoluteInstructionTargetIndex = sourceIndex + originalTargets[index];
45 final int targetValue = codeAttribute.byteCodeOffsets.get(absoluteInstructionTargetIndex).intValue();
46 replacementTargets[index] = targetValue - sourceValue;
47 }
48 final int[] rewriteArray = byteCode.getRewrite();
49 for (int index = 0; index < numberOfLabels; index++) {
50 setRewrite4Bytes(replacementTargets[index], rewriteArray);
51 }
52 }
53
54 }