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 java.util.Arrays;
20
21 import org.apache.commons.compress.harmony.unpack200.bytecode.ByteCode;
22 import org.apache.commons.compress.harmony.unpack200.bytecode.OperandManager;
23
24 public class LookupSwitchForm extends SwitchForm {
25
26 public LookupSwitchForm(final int opcode, final String name) {
27 super(opcode, name);
28 }
29
30 @Override
31 public void setByteCodeOperands(final ByteCode byteCode, final OperandManager operandManager, final int codeLength) {
32 final int caseCount = operandManager.nextCaseCount();
33 final int defaultPc = operandManager.nextLabel();
34 final int[] caseValues = new int[caseCount];
35 Arrays.setAll(caseValues, i -> operandManager.nextCaseValues());
36 final int[] casePcs = new int[caseCount];
37 Arrays.setAll(casePcs, i -> operandManager.nextLabel());
38
39 final int[] labelsArray = new int[caseCount + 1];
40 labelsArray[0] = defaultPc;
41 System.arraycopy(casePcs, 0, labelsArray, 1, caseCount + 1 - 1);
42 byteCode.setByteCodeTargets(labelsArray);
43
44
45
46
47
48
49
50
51
52
53
54
55
56 final int padLength = 3 - codeLength % 4;
57 final int rewriteSize = 1 + padLength + 4
58 + 4
59 + 4 * caseValues.length + 4 * casePcs.length;
60
61 final int[] newRewrite = new int[rewriteSize];
62 int rewriteIndex = 0;
63
64
65
66 newRewrite[rewriteIndex++] = byteCode.getOpcode();
67
68
69 for (int index = 0; index < padLength; index++) {
70 newRewrite[rewriteIndex++] = 0;
71 }
72
73
74
75 newRewrite[rewriteIndex++] = -1;
76 newRewrite[rewriteIndex++] = -1;
77 newRewrite[rewriteIndex++] = -1;
78 newRewrite[rewriteIndex++] = -1;
79
80
81 final int npairsIndex = rewriteIndex;
82 setRewrite4Bytes(caseValues.length, npairsIndex, newRewrite);
83 rewriteIndex += 4;
84
85
86
87
88 for (final int caseValue : caseValues) {
89
90 setRewrite4Bytes(caseValue, rewriteIndex, newRewrite);
91 rewriteIndex += 4;
92
93 newRewrite[rewriteIndex++] = -1;
94 newRewrite[rewriteIndex++] = -1;
95 newRewrite[rewriteIndex++] = -1;
96 newRewrite[rewriteIndex++] = -1;
97 }
98 byteCode.setRewrite(newRewrite);
99 }
100 }