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