001/*
002 *  Licensed to the Apache Software Foundation (ASF) under one or more
003 *  contributor license agreements.  See the NOTICE file distributed with
004 *  this work for additional information regarding copyright ownership.
005 *  The ASF licenses this file to You under the Apache License, Version 2.0
006 *  (the "License"); you may not use this file except in compliance with
007 *  the License.  You may obtain a copy of the License at
008 *
009 *     http://www.apache.org/licenses/LICENSE-2.0
010 *
011 *  Unless required by applicable law or agreed to in writing, software
012 *  distributed under the License is distributed on an "AS IS" BASIS,
013 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 *  See the License for the specific language governing permissions and
015 *  limitations under the License.
016 */
017
018package org.apache.commons.compress.harmony.unpack200.bytecode;
019
020import org.apache.commons.compress.harmony.unpack200.Segment;
021import org.apache.commons.compress.harmony.unpack200.SegmentConstantPool;
022
023/**
024 * This class keeps track of operands used. It provides API to let other classes get next elements, and also knows about
025 * which classes have been used recently in super, this and new references.
026 */
027public class OperandManager {
028
029    int[] bcCaseCount;
030    int[] bcCaseValue;
031    int[] bcByte;
032    int[] bcShort;
033    int[] bcLocal;
034    int[] bcLabel;
035    int[] bcIntRef;
036    int[] bcFloatRef;
037    int[] bcLongRef;
038    int[] bcDoubleRef;
039    int[] bcStringRef;
040    int[] bcClassRef;
041    int[] bcFieldRef;
042    int[] bcMethodRef;
043    int[] bcIMethodRef;
044    int[] bcThisField;
045    int[] bcSuperField;
046    int[] bcThisMethod;
047    int[] bcSuperMethod;
048    int[] bcInitRef;
049    int[] wideByteCodes;
050
051    int bcCaseCountIndex;
052    int bcCaseValueIndex;
053    int bcByteIndex;
054    int bcShortIndex;
055    int bcLocalIndex;
056    int bcLabelIndex;
057    int bcIntRefIndex;
058    int bcFloatRefIndex;
059    int bcLongRefIndex;
060    int bcDoubleRefIndex;
061    int bcStringRefIndex;
062    int bcClassRefIndex;
063    int bcFieldRefIndex;
064    int bcMethodRefIndex;
065    int bcIMethodRefIndex;
066    int bcThisFieldIndex;
067    int bcSuperFieldIndex;
068    int bcThisMethodIndex;
069    int bcSuperMethodIndex;
070    int bcInitRefIndex;
071    int wideByteCodeIndex;
072
073    Segment segment;
074
075    String currentClass;
076    String superClass;
077    String newClass;
078
079    public OperandManager(final int[] bcCaseCount, final int[] bcCaseValue, final int[] bcByte, final int[] bcShort,
080        final int[] bcLocal, final int[] bcLabel, final int[] bcIntRef, final int[] bcFloatRef, final int[] bcLongRef,
081        final int[] bcDoubleRef, final int[] bcStringRef, final int[] bcClassRef, final int[] bcFieldRef,
082        final int[] bcMethodRef, final int[] bcIMethodRef, final int[] bcThisField, final int[] bcSuperField,
083        final int[] bcThisMethod, final int[] bcSuperMethod, final int[] bcInitRef, final int[] wideByteCodes) {
084        this.bcCaseCount = bcCaseCount;
085        this.bcCaseValue = bcCaseValue;
086        this.bcByte = bcByte;
087        this.bcShort = bcShort;
088        this.bcLocal = bcLocal;
089        this.bcLabel = bcLabel;
090        this.bcIntRef = bcIntRef;
091        this.bcFloatRef = bcFloatRef;
092        this.bcLongRef = bcLongRef;
093        this.bcDoubleRef = bcDoubleRef;
094        this.bcStringRef = bcStringRef;
095        this.bcClassRef = bcClassRef;
096        this.bcFieldRef = bcFieldRef;
097        this.bcMethodRef = bcMethodRef;
098        this.bcIMethodRef = bcIMethodRef;
099
100        this.bcThisField = bcThisField;
101        this.bcSuperField = bcSuperField;
102        this.bcThisMethod = bcThisMethod;
103        this.bcSuperMethod = bcSuperMethod;
104        this.bcInitRef = bcInitRef;
105        this.wideByteCodes = wideByteCodes;
106    }
107
108    public String getCurrentClass() {
109        if (null == currentClass) {
110            throw new Error("Current class not set yet");
111        }
112        return currentClass;
113    }
114
115    public String getNewClass() {
116        if (null == newClass) {
117            throw new Error("New class not set yet");
118        }
119        return newClass;
120    }
121
122    public String getSuperClass() {
123        if (null == superClass) {
124            throw new Error("SuperClass not set yet");
125        }
126        return superClass;
127    }
128
129    public SegmentConstantPool globalConstantPool() {
130        return segment.getConstantPool();
131    }
132
133    public int nextByte() {
134        return bcByte[bcByteIndex++];
135    }
136
137    public int nextCaseCount() {
138        return bcCaseCount[bcCaseCountIndex++];
139    }
140
141    public int nextCaseValues() {
142        return bcCaseValue[bcCaseValueIndex++];
143    }
144
145    public int nextClassRef() {
146        return bcClassRef[bcClassRefIndex++];
147    }
148
149    public int nextDoubleRef() {
150        return bcDoubleRef[bcDoubleRefIndex++];
151    }
152
153    public int nextFieldRef() {
154        return bcFieldRef[bcFieldRefIndex++];
155    }
156
157    public int nextFloatRef() {
158        return bcFloatRef[bcFloatRefIndex++];
159    }
160
161    public int nextIMethodRef() {
162        return bcIMethodRef[bcIMethodRefIndex++];
163    }
164
165    public int nextInitRef() {
166        return bcInitRef[bcInitRefIndex++];
167    }
168
169    public int nextIntRef() {
170        return bcIntRef[bcIntRefIndex++];
171    }
172
173    public int nextLabel() {
174        return bcLabel[bcLabelIndex++];
175    }
176
177    public int nextLocal() {
178        return bcLocal[bcLocalIndex++];
179    }
180
181    public int nextLongRef() {
182        return bcLongRef[bcLongRefIndex++];
183    }
184
185    public int nextMethodRef() {
186        return bcMethodRef[bcMethodRefIndex++];
187    }
188
189    public int nextShort() {
190        return bcShort[bcShortIndex++];
191    }
192
193    public int nextStringRef() {
194        return bcStringRef[bcStringRefIndex++];
195    }
196
197    public int nextSuperFieldRef() {
198        return bcSuperField[bcSuperFieldIndex++];
199    }
200
201    public int nextSuperMethodRef() {
202        return bcSuperMethod[bcSuperMethodIndex++];
203    }
204
205    public int nextThisFieldRef() {
206        return bcThisField[bcThisFieldIndex++];
207    }
208
209    public int nextThisMethodRef() {
210        return bcThisMethod[bcThisMethodIndex++];
211    }
212
213    public int nextWideByteCode() {
214        return wideByteCodes[wideByteCodeIndex++];
215    }
216
217    public void setCurrentClass(final String string) {
218        currentClass = string;
219    }
220
221    public void setNewClass(final String string) {
222        newClass = string;
223    }
224
225    public void setSegment(final Segment segment) {
226        this.segment = segment;
227    }
228
229    public void setSuperClass(final String string) {
230        superClass = string;
231    }
232}