You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by sj...@apache.org on 2009/02/19 15:45:54 UTC
svn commit: r745887 - in
/harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200:
BcBands.java ClassBands.java IntList.java
Author: sjanuary
Date: Thu Feb 19 14:45:53 2009
New Revision: 745887
URL: http://svn.apache.org/viewvc?rev=745887&view=rev
Log:
Pack200 - performance improvement: use customised list instead of ArrayList for ints to reduce Integer-int conversions and reduce memory usage.
Added:
harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/IntList.java (with props)
Modified:
harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/BcBands.java
harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/ClassBands.java
Modified: harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/BcBands.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/BcBands.java?rev=745887&r1=745886&r2=745887&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/BcBands.java (original)
+++ harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/BcBands.java Thu Feb 19 14:45:53 2009
@@ -30,8 +30,6 @@
*/
public class BcBands extends BandSet {
- private static final Integer MULTIANEWARRAY = new Integer(197);
- private static final Integer ALOAD_0 = new Integer(42);
private final CpBands cpBands;
private final Segment segment;
@@ -40,12 +38,12 @@
this.segment = segment;
}
- private final List bcCodes = new ArrayList();
- private final List bcCaseCount = new ArrayList();
- private final List bcCaseValue = new ArrayList();
- private final List bcByte = new ArrayList();
- private final List bcShort = new ArrayList();
- private final List bcLocal = new ArrayList();
+ private final IntList bcCodes = new IntList();
+ private final IntList bcCaseCount = new IntList();
+ private final IntList bcCaseValue = new IntList();
+ private final IntList bcByte = new IntList();
+ private final IntList bcShort = new IntList();
+ private final IntList bcLocal = new IntList();
private final List bcLabel = new ArrayList();
private final List bcIntref = new ArrayList();
private final List bcFloatRef = new ArrayList();
@@ -64,18 +62,21 @@
private String currentClass;
private String superClass;
- private static final Integer WIDE = new Integer(196);
- private static final Integer INVOKEINTERFACE = new Integer(185);
- private static final Integer TABLESWITCH = new Integer(170);
- private static final Integer IINC = new Integer(132);
- private static final Integer LOOKUPSWITCH = new Integer(171);
- private static final Integer endMarker = new Integer(255);
- private final List bciRenumbering = new ArrayList();
+ private static final int MULTIANEWARRAY = 197;
+ private static final int ALOAD_0 = 42;
+ private static final int WIDE = 196;
+ private static final int INVOKEINTERFACE = 185;
+ private static final int TABLESWITCH = 170;
+ private static final int IINC = 132;
+ private static final int LOOKUPSWITCH = 171;
+ private static final int endMarker = 255;
+
+ private final IntList bciRenumbering = new IntList();
private final Map labelsToOffsets = new HashMap();
private int byteCodeOffset;
private int renumberedOffset;
- private final List bcLabelRelativeOffsets = new ArrayList();
+ private final IntList bcLabelRelativeOffsets = new IntList();
public void setCurrentClass(String name) {
currentClass = name;
@@ -91,14 +92,14 @@
}
public void pack(OutputStream out) throws IOException, Pack200Exception {
- out.write(encodeBandInt("bcCodes", listToArray(bcCodes), Codec.BYTE1));
- out.write(encodeBandInt("bcCaseCount", listToArray(bcCaseCount),
+ out.write(encodeBandInt("bcCodes", bcCodes.toArray(), Codec.BYTE1));
+ out.write(encodeBandInt("bcCaseCount", bcCaseCount.toArray(),
Codec.UNSIGNED5));
- out.write(encodeBandInt("bcCaseValue", listToArray(bcCaseValue),
+ out.write(encodeBandInt("bcCaseValue", bcCaseValue.toArray(),
Codec.DELTA5));
- out.write(encodeBandInt("bcByte", listToArray(bcByte), Codec.BYTE1));
- out.write(encodeBandInt("bcShort", listToArray(bcShort), Codec.DELTA5));
- out.write(encodeBandInt("bcLocal", listToArray(bcLocal),
+ out.write(encodeBandInt("bcByte", bcByte.toArray(), Codec.BYTE1));
+ out.write(encodeBandInt("bcShort", bcShort.toArray(), Codec.DELTA5));
+ out.write(encodeBandInt("bcLocal", bcLocal.toArray(),
Codec.UNSIGNED5));
out
.write(encodeBandInt("bcLabel", listToArray(bcLabel),
@@ -149,9 +150,9 @@
public void visitEnd() {
for (int i = 0; i < bciRenumbering.size(); i++) {
- if (bciRenumbering.get(i) == null) {
+ if (bciRenumbering.get(i) == -1) {
bciRenumbering.remove(i);
- bciRenumbering.add(i, new Integer(++renumberedOffset));
+ bciRenumbering.add(i, ++renumberedOffset);
}
}
if (renumberedOffset != 0) {
@@ -165,8 +166,8 @@
} else if (label instanceof Label) {
bcLabel.remove(i);
Integer offset = (Integer) labelsToOffsets.get(label);
- Integer relativeOffset = (Integer) bcLabelRelativeOffsets.get(i);
- bcLabel.add(i, new Integer(((Integer)bciRenumbering.get(offset.intValue())).intValue() - ((Integer)bciRenumbering.get(relativeOffset.intValue())).intValue()));
+ int relativeOffset = bcLabelRelativeOffsets.get(i);
+ bcLabel.add(i, new Integer(bciRenumbering.get(offset.intValue()) - bciRenumbering.get(relativeOffset)));
}
}
bcCodes.add(endMarker);
@@ -189,7 +190,7 @@
updateRenumbering();
boolean aload_0 = false;
if (bcCodes.size() > 0
- && ((Integer) bcCodes.get(bcCodes.size() - 1)).equals(ALOAD_0)) {
+ && (bcCodes.get(bcCodes.size() - 1)) == ALOAD_0) {
bcCodes.remove(bcCodes.size() - 1);
aload_0 = true;
}
@@ -213,18 +214,18 @@
bcFieldRef.add(cpField);
}
aload_0 = false;
- bcCodes.add(new Integer(opcode));
+ bcCodes.add(opcode);
}
private void updateRenumbering() {
if(bciRenumbering.isEmpty()) {
- bciRenumbering.add(new Integer(0));
+ bciRenumbering.add(0);
}
renumberedOffset ++;
for (int i = bciRenumbering.size(); i < byteCodeOffset; i++) {
- bciRenumbering.add(null);
+ bciRenumbering.add(-1);
}
- bciRenumbering.add(new Integer(renumberedOffset));
+ bciRenumbering.add(renumberedOffset);
}
public void visitIincInsn(int var, int increment) {
@@ -232,13 +233,13 @@
byteCodeOffset += 6;
bcCodes.add(WIDE);
bcCodes.add(IINC);
- bcLocal.add(new Integer(var));
- bcShort.add(new Integer(increment));
+ bcLocal.add(var);
+ bcShort.add(increment);
} else {
byteCodeOffset += 3;
bcCodes.add(IINC);
- bcLocal.add(new Integer(var));
- bcByte.add(new Integer(increment & 0xFF));
+ bcLocal.add(var);
+ bcByte.add(increment & 0xFF);
}
updateRenumbering();
}
@@ -248,7 +249,7 @@
throw new RuntimeException(
"Non-standard bytecode instructions not supported");
} else {
- bcCodes.add(new Integer(opcode));
+ bcCodes.add(opcode);
byteCodeOffset++;
updateRenumbering();
}
@@ -257,23 +258,23 @@
public void visitIntInsn(int opcode, int operand) {
switch (opcode) {
case 17: // sipush
- bcCodes.add(new Integer(opcode));
- bcShort.add(new Integer(operand));
+ bcCodes.add(opcode);
+ bcShort.add(operand);
byteCodeOffset += 3;
break;
case 16: // bipush
case 188: // newarray
- bcCodes.add(new Integer(opcode));
- bcByte.add(new Integer(operand & 0xFF));
+ bcCodes.add(opcode);
+ bcByte.add(operand & 0xFF);
byteCodeOffset += 2;
}
updateRenumbering();
}
public void visitJumpInsn(int opcode, Label label) {
- bcCodes.add(new Integer(opcode));
+ bcCodes.add(opcode);
bcLabel.add(label);
- bcLabelRelativeOffsets.add(new Integer(byteCodeOffset));
+ bcLabelRelativeOffsets.add(byteCodeOffset);
byteCodeOffset += 3;
updateRenumbering();
}
@@ -284,22 +285,22 @@
|| constant instanceof CPDouble) {
byteCodeOffset += 3;
if (constant instanceof CPInt) {
- bcCodes.add(new Integer(237)); // ildc_w
+ bcCodes.add(237); // ildc_w
bcIntref.add(constant);
} else if (constant instanceof CPFloat) {
- bcCodes.add(new Integer(238)); // fldc
+ bcCodes.add(238); // fldc
bcFloatRef.add(constant);
} else if (constant instanceof CPLong) {
- bcCodes.add(new Integer(20)); // lldc2_w
+ bcCodes.add(20); // lldc2_w
bcLongRef.add(constant);
} else if (constant instanceof CPDouble) {
- bcCodes.add(new Integer(239)); // dldc2_w
+ bcCodes.add(239); // dldc2_w
bcDoubleRef.add(constant);
} else if (constant instanceof CPString) {
- bcCodes.add(new Integer(19)); // aldc
+ bcCodes.add(19); // aldc
bcStringRef.add(constant);
} else if (constant instanceof CPClass) {
- bcCodes.add(new Integer(236)); // cldc
+ bcCodes.add(236); // cldc
bcClassRef.add(constant);
} else {
throw new RuntimeException("Constant should not be null");
@@ -307,16 +308,16 @@
} else {
byteCodeOffset += 2;
if (constant instanceof CPInt) {
- bcCodes.add(new Integer(234)); // ildc
+ bcCodes.add(234); // ildc
bcIntref.add(constant);
} else if (constant instanceof CPFloat) {
- bcCodes.add(new Integer(235)); // fldc
+ bcCodes.add(235); // fldc
bcFloatRef.add(constant);
} else if (constant instanceof CPString) {
- bcCodes.add(new Integer(18)); // aldc
+ bcCodes.add(18); // aldc
bcStringRef.add(constant);
} else if (constant instanceof CPClass) {
- bcCodes.add(new Integer(233)); // cldc
+ bcCodes.add(233); // cldc
bcClassRef.add(constant);
}
}
@@ -326,12 +327,12 @@
public void visitLookupSwitchInsn(Label dflt, int[] keys, Label[] labels) {
bcCodes.add(LOOKUPSWITCH);
bcLabel.add(dflt);
- bcLabelRelativeOffsets.add(new Integer(byteCodeOffset));
- bcCaseCount.add(new Integer(keys.length));
+ bcLabelRelativeOffsets.add(byteCodeOffset);
+ bcCaseCount.add(keys.length);
for (int i = 0; i < labels.length; i++) {
- bcCaseValue.add(new Integer(keys[i]));
+ bcCaseValue.add(keys[i]);
bcLabel.add(labels[i]);
- bcLabelRelativeOffsets.add(new Integer(byteCodeOffset));
+ bcLabelRelativeOffsets.add(byteCodeOffset);
}
int padding = (byteCodeOffset + 1) % 4 == 0 ? 0 : 4 - ((byteCodeOffset + 1) % 4);
byteCodeOffset += padding + 8 + 8 * keys.length;
@@ -348,8 +349,8 @@
case 184: // invokestatic
boolean aload_0 = false;
if (bcCodes.size() > 0
- && ((Integer) bcCodes.get(bcCodes.size() - 1))
- .equals(ALOAD_0)) {
+ && (bcCodes.get(bcCodes.size() - 1))
+ == (ALOAD_0)) {
bcCodes.remove(bcCodes.size() - 1);
aload_0 = true;
opcode += 7;
@@ -381,7 +382,7 @@
}
bcMethodRef.add(cpBands.getCPMethod(owner, name, desc));
}
- bcCodes.add(new Integer(opcode));
+ bcCodes.add(opcode);
break;
case 185: // invokeinterface
CPMethodOrField cpIMethod = cpBands.getCPIMethod(owner, name, desc);
@@ -396,20 +397,20 @@
updateRenumbering();
bcCodes.add(MULTIANEWARRAY);
bcClassRef.add(cpBands.getCPClass(desc));
- bcByte.add(new Integer(dimensions & 0xFF));
+ bcByte.add(dimensions & 0xFF);
}
public void visitTableSwitchInsn(int min, int max, Label dflt,
Label[] labels) {
bcCodes.add(TABLESWITCH);
bcLabel.add(dflt);
- bcLabelRelativeOffsets.add(new Integer(byteCodeOffset));
- bcCaseValue.add(new Integer(min));
+ bcLabelRelativeOffsets.add(byteCodeOffset);
+ bcCaseValue.add(min);
int count = labels.length;
- bcCaseCount.add(new Integer(count));
+ bcCaseCount.add(count);
for (int i = 0; i < count; i++) {
bcLabel.add(labels[i]);
- bcLabelRelativeOffsets.add(new Integer(byteCodeOffset));
+ bcLabelRelativeOffsets.add(byteCodeOffset);
}
int padding = (byteCodeOffset + 1) % 4 == 0 ? 0 : 4 - ((byteCodeOffset + 1) % 4);
byteCodeOffset+= (padding + 12 + 4 * labels.length);
@@ -420,7 +421,7 @@
// NEW, ANEWARRAY, CHECKCAST or INSTANCEOF
byteCodeOffset += 3;
updateRenumbering();
- bcCodes.add(new Integer(opcode));
+ bcCodes.add(opcode);
bcClassRef.add(cpBands.getCPClass(type));
}
@@ -429,35 +430,35 @@
if (var > Byte.MAX_VALUE) {
byteCodeOffset += 4;
bcCodes.add(WIDE);
- bcCodes.add(new Integer(opcode));
- bcLocal.add(new Integer(var));
+ bcCodes.add(opcode);
+ bcLocal.add(var);
} else {
if(var > 3 || opcode == 169 /* RET */) {
byteCodeOffset += 2;
- bcCodes.add(new Integer(opcode));
- bcLocal.add(new Integer(var));
+ bcCodes.add(opcode);
+ bcLocal.add(var);
} else {
byteCodeOffset +=1;
switch(opcode) {
case 21: // ILOAD
case 54: // ISTORE
- bcCodes.add(new Integer(opcode + 5 + var));
+ bcCodes.add(opcode + 5 + var);
break;
case 22: // LLOAD
case 55: // LSTORE
- bcCodes.add(new Integer(opcode + 8 + var));
+ bcCodes.add(opcode + 8 + var);
break;
case 23: // FLOAD
case 56: // FSTORE
- bcCodes.add(new Integer(opcode + 11 + var));
+ bcCodes.add(opcode + 11 + var);
break;
case 24: // DLOAD
case 57: // DSTORE
- bcCodes.add(new Integer(opcode + 14 + var));
+ bcCodes.add(opcode + 14 + var);
break;
case 25: // A_LOAD
case 58: // A_STORE
- bcCodes.add(new Integer(opcode + 17 + var));
+ bcCodes.add(opcode + 17 + var);
break;
}
}
Modified: harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/ClassBands.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/ClassBands.java?rev=745887&r1=745886&r2=745887&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/ClassBands.java (original)
+++ harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/ClassBands.java Thu Feb 19 14:45:53 2009
@@ -33,7 +33,6 @@
public class ClassBands extends BandSet {
- private static final Integer ZERO = new Integer(0);
private final SegmentHeader header;
private final CpBands cpBands;
private final AttributeDefinitionBands attrBands;
@@ -52,8 +51,8 @@
private final List classEnclosingMethodDesc = new ArrayList();
private final List classSignature = new ArrayList();
- private final List classFileVersionMinor = new ArrayList();
- private final List classFileVersionMajor = new ArrayList();
+ private final IntList classFileVersionMinor = new IntList();
+ private final IntList classFileVersionMajor = new IntList();
private final int[] class_field_count;
private final CPNameAndType[][] field_descr;
@@ -67,33 +66,33 @@
private final long[][] method_flags;
private int[] method_attr_calls;
private final List methodSignature = new ArrayList();
- private final List methodExceptionNumber = new ArrayList();
+ private final IntList methodExceptionNumber = new IntList();
private final List methodExceptionClasses = new ArrayList();
private int[] codeHeaders;
- private final List codeMaxStack = new ArrayList();
- private final List codeMaxLocals = new ArrayList();
- private final List codeHandlerCount = new ArrayList();
+ private final IntList codeMaxStack = new IntList();
+ private final IntList codeMaxLocals = new IntList();
+ private final IntList codeHandlerCount = new IntList();
private final List codeHandlerStartP = new ArrayList();
private final List codeHandlerEndPO = new ArrayList();
private final List codeHandlerCatchPO = new ArrayList();
private final List codeHandlerClass = new ArrayList();
private final List codeFlags = new ArrayList();
- private final List codeLineNumberTableN = new ArrayList();
+ private final IntList codeLineNumberTableN = new IntList();
private final List codeLineNumberTableBciP = new ArrayList();
- private final List codeLineNumberTableLine = new ArrayList();
- private final List codeLocalVariableTableN = new ArrayList();
+ private final IntList codeLineNumberTableLine = new IntList();
+ private final IntList codeLocalVariableTableN = new IntList();
private final List codeLocalVariableTableBciP = new ArrayList();
private final List codeLocalVariableTableSpanO = new ArrayList();
private final List codeLocalVariableTableNameRU = new ArrayList();
private final List codeLocalVariableTableTypeRS = new ArrayList();
- private final List codeLocalVariableTableSlot = new ArrayList();
- private final List codeLocalVariableTypeTableN = new ArrayList();
+ private final IntList codeLocalVariableTableSlot = new IntList();
+ private final IntList codeLocalVariableTypeTableN = new IntList();
private final List codeLocalVariableTypeTableBciP = new ArrayList();
private final List codeLocalVariableTypeTableSpanO = new ArrayList();
private final List codeLocalVariableTypeTableNameRU = new ArrayList();
private final List codeLocalVariableTypeTableTypeRS = new ArrayList();
- private final List codeLocalVariableTypeTableSlot = new ArrayList();
+ private final IntList codeLocalVariableTypeTableSlot = new IntList();
private final MetadataBandGroup class_RVA_bands;
private final MetadataBandGroup class_RIA_bands;
@@ -235,19 +234,17 @@
int major = major_versions[i];
if (major != defaultMajorVersion) {
class_flags[i] |= 1 << 24;
- classFileVersionMajor.add(new Integer(major));
- classFileVersionMinor.add(ZERO);
+ classFileVersionMajor.add(major);
+ classFileVersionMinor.add(0);
}
}
// Calculate code headers
codeHeaders = new int[codeHandlerCount.size()];
int removed = 0;
for (int i = 0; i < codeHeaders.length; i++) {
- int numHandlers = ((Integer) codeHandlerCount.get(i - removed))
- .intValue();
- int maxLocals = ((Integer) codeMaxLocals.get(i - removed))
- .intValue();
- int maxStack = ((Integer) codeMaxStack.get(i - removed)).intValue();
+ int numHandlers = codeHandlerCount.get(i - removed);
+ int maxLocals = codeMaxLocals.get(i - removed);
+ int maxStack = codeMaxStack.get(i - removed);
if (numHandlers == 0) {
int header = maxLocals * 12 + maxStack + 1;
if (header < 145 && maxStack < 12) {
@@ -277,7 +274,7 @@
}
// Compute any required IcLocals
- List innerClassesN = new ArrayList();
+ IntList innerClassesN = new IntList();
List icLocal = new ArrayList();
for (int i = 0; i < class_this.length; i++) {
CPClass cpClass = class_this[i];
@@ -302,12 +299,12 @@
}
}
if(innerN != 0) {
- innerClassesN.add(new Integer(innerN));
+ innerClassesN.add(innerN);
class_flags[i] |= (1 << 23);
}
}
}
- class_InnerClasses_N = listToArray(innerClassesN);
+ class_InnerClasses_N = innerClassesN.toArray();
class_InnerClasses_RC = new CPClass[icLocal.size()];
class_InnerClasses_F = new int[icLocal.size()];
classInnerClassesOuterRCN = new ArrayList();
@@ -328,39 +325,39 @@
}
}
// Calculate any backwards calls from metadata bands
- List classAttrCalls = new ArrayList();
- List fieldAttrCalls = new ArrayList();
- List methodAttrCalls = new ArrayList();
+ IntList classAttrCalls = new IntList();
+ IntList fieldAttrCalls = new IntList();
+ IntList methodAttrCalls = new IntList();
if(class_RVA_bands.hasContent()) {
- classAttrCalls.add(new Integer(class_RVA_bands.numBackwardsCalls()));
+ classAttrCalls.add(class_RVA_bands.numBackwardsCalls());
}
if(class_RIA_bands.hasContent()) {
- classAttrCalls.add(new Integer(class_RIA_bands.numBackwardsCalls()));
+ classAttrCalls.add(class_RIA_bands.numBackwardsCalls());
}
if(field_RVA_bands.hasContent()) {
- fieldAttrCalls.add(new Integer(field_RVA_bands.numBackwardsCalls()));
+ fieldAttrCalls.add(field_RVA_bands.numBackwardsCalls());
}
if(field_RIA_bands.hasContent()) {
- fieldAttrCalls.add(new Integer(field_RIA_bands.numBackwardsCalls()));
+ fieldAttrCalls.add(field_RIA_bands.numBackwardsCalls());
}
if(method_RVA_bands.hasContent()) {
- methodAttrCalls.add(new Integer(method_RVA_bands.numBackwardsCalls()));
+ methodAttrCalls.add(method_RVA_bands.numBackwardsCalls());
}
if(method_RIA_bands.hasContent()) {
- methodAttrCalls.add(new Integer(method_RIA_bands.numBackwardsCalls()));
+ methodAttrCalls.add(method_RIA_bands.numBackwardsCalls());
}
if(method_RVPA_bands.hasContent()) {
- methodAttrCalls.add(new Integer(method_RVPA_bands.numBackwardsCalls()));
+ methodAttrCalls.add(method_RVPA_bands.numBackwardsCalls());
}
if(method_RIPA_bands.hasContent()) {
- methodAttrCalls.add(new Integer(method_RIPA_bands.numBackwardsCalls()));
+ methodAttrCalls.add(method_RIPA_bands.numBackwardsCalls());
}
if(method_AD_bands.hasContent()) {
- methodAttrCalls.add(new Integer(method_AD_bands.numBackwardsCalls()));
+ methodAttrCalls.add(method_AD_bands.numBackwardsCalls());
}
- class_attr_calls = listToArray(classAttrCalls);
- field_attr_calls = listToArray(fieldAttrCalls);
- method_attr_calls = listToArray(methodAttrCalls);
+ class_attr_calls = classAttrCalls.toArray();
+ field_attr_calls = fieldAttrCalls.toArray();
+ method_attr_calls = methodAttrCalls.toArray();
}
public void pack(OutputStream out) throws IOException, Pack200Exception {
@@ -449,7 +446,7 @@
// *method_attr_indexes :UNSIGNED5 [SUM(*method_attr_count)]
out.write(encodeBandInt("method_attr_calls", method_attr_calls, Codec.UNSIGNED5));
out.write(encodeBandInt("methodExceptionNumber",
- listToArray(methodExceptionNumber), Codec.UNSIGNED5));
+ methodExceptionNumber.toArray(), Codec.UNSIGNED5));
out.write(encodeBandInt("methodExceptionClasses",
cpEntryListToArray(methodExceptionClasses), Codec.UNSIGNED5));
out.write(encodeBandInt("methodSignature",
@@ -486,9 +483,9 @@
out.write(encodeBandInt("class_InnerClasses_outer_RCN", cpEntryOrNullListToArray(classInnerClassesOuterRCN), Codec.UNSIGNED5));
out.write(encodeBandInt("class_InnerClasses_name_RUN", cpEntryOrNullListToArray(classInnerClassesNameRUN), Codec.UNSIGNED5));
out.write(encodeBandInt("classFileVersionMinor",
- listToArray(classFileVersionMinor), Codec.UNSIGNED5));
+ classFileVersionMinor.toArray(), Codec.UNSIGNED5));
out.write(encodeBandInt("classFileVersionMajor",
- listToArray(classFileVersionMajor), Codec.UNSIGNED5));
+ classFileVersionMajor.toArray(), Codec.UNSIGNED5));
}
private int[] getInts(CPClass[] cpClasses) {
@@ -502,12 +499,12 @@
private void writeCodeBands(OutputStream out) throws IOException,
Pack200Exception {
out.write(encodeBandInt("codeHeaders", codeHeaders, Codec.BYTE1));
- out.write(encodeBandInt("codeMaxStack", listToArray(codeMaxStack),
+ out.write(encodeBandInt("codeMaxStack", codeMaxStack.toArray(),
Codec.UNSIGNED5));
- out.write(encodeBandInt("codeMaxLocals", listToArray(codeMaxLocals),
+ out.write(encodeBandInt("codeMaxLocals", codeMaxLocals.toArray(),
Codec.UNSIGNED5));
out.write(encodeBandInt("codeHandlerCount",
- listToArray(codeHandlerCount), Codec.UNSIGNED5));
+ codeHandlerCount.toArray(), Codec.UNSIGNED5));
out.write(encodeBandInt("codeHandlerStartP",
listToArray(codeHandlerStartP), Codec.BCI5));
out.write(encodeBandInt("codeHandlerEndPO",
@@ -528,13 +525,13 @@
// *code_attr_indexes :UNSIGNED5 [SUM(*code_attr_count)]
// *code_attr_calls :UNSIGNED5 [...]
out.write(encodeBandInt("code_LineNumberTable_N",
- listToArray(codeLineNumberTableN), Codec.UNSIGNED5));
+ codeLineNumberTableN.toArray(), Codec.UNSIGNED5));
out.write(encodeBandInt("code_LineNumberTable_bci_P",
listToArray(codeLineNumberTableBciP), Codec.BCI5));
out.write(encodeBandInt("code_LineNumberTable_line",
- listToArray(codeLineNumberTableLine), Codec.UNSIGNED5));
+ codeLineNumberTableLine.toArray(), Codec.UNSIGNED5));
out.write(encodeBandInt("code_LocalVariableTable_N",
- listToArray(codeLocalVariableTableN), Codec.UNSIGNED5));
+ codeLocalVariableTableN.toArray(), Codec.UNSIGNED5));
out.write(encodeBandInt("code_LocalVariableTable_bci_P",
listToArray(codeLocalVariableTableBciP), Codec.BCI5));
out.write(encodeBandInt("code_LocalVariableTable_span_O",
@@ -546,9 +543,9 @@
cpEntryListToArray(codeLocalVariableTableTypeRS),
Codec.UNSIGNED5));
out.write(encodeBandInt("code_LocalVariableTable_slot",
- listToArray(codeLocalVariableTableSlot), Codec.UNSIGNED5));
+ codeLocalVariableTableSlot.toArray(), Codec.UNSIGNED5));
out.write(encodeBandInt("code_LocalVariableTypeTable_N",
- listToArray(codeLocalVariableTypeTableN), Codec.UNSIGNED5));
+ codeLocalVariableTypeTableN.toArray(), Codec.UNSIGNED5));
out.write(encodeBandInt("code_LocalVariableTypeTable_bci_P",
listToArray(codeLocalVariableTypeTableBciP), Codec.BCI5));
out.write(encodeBandInt("code_LocalVariableTypeTable_span_O",
@@ -560,7 +557,7 @@
cpEntryListToArray(codeLocalVariableTypeTableTypeRS),
Codec.UNSIGNED5));
out.write(encodeBandInt("code_LocalVariableTypeTable_slot",
- listToArray(codeLocalVariableTypeTableSlot), Codec.UNSIGNED5));
+ codeLocalVariableTypeTableSlot.toArray(), Codec.UNSIGNED5));
}
@@ -574,7 +571,7 @@
flags |= (1 << 19);
}
if (exceptions != null) {
- methodExceptionNumber.add(new Integer(exceptions.length));
+ methodExceptionNumber.add(exceptions.length);
for (int i = 0; i < exceptions.length; i++) {
methodExceptionClasses.add(cpBands.getCPClass(exceptions[i]));
}
@@ -595,7 +592,7 @@
public void endOfMethod() {
if(codeFlags.size() > 0) {
long latestCodeFlag = ((Long)codeFlags.get(codeFlags.size() - 1)).longValue();
- int latestLocalVariableTableN = ((Integer)codeLocalVariableTableN.get(codeLocalVariableTableN.size() - 1)).intValue();
+ int latestLocalVariableTableN = codeLocalVariableTableN.get(codeLocalVariableTableN.size() - 1);
if(latestCodeFlag == (1 << 2) && latestLocalVariableTableN == 0) {
codeLocalVariableTableN.remove(codeLocalVariableTableN.size() - 1);
codeFlags.remove(codeFlags.size() - 1);
@@ -705,26 +702,26 @@
.remove(tempMethodFlags.size() - 1);
Long newFlag = new Long(latestFlag.intValue() | (1 << 17));
tempMethodFlags.add(newFlag);
- codeMaxStack.add(new Integer(maxStack));
+ codeMaxStack.add(maxStack);
if ((newFlag.longValue() & (1 << 3)) == 0) { // not static
maxLocals--; // minus 'this' local
}
maxLocals -= numMethodArgs;
- codeMaxLocals.add(new Integer(maxLocals));
+ codeMaxLocals.add(maxLocals);
}
public void addCode(boolean stripDebug) {
- codeHandlerCount.add(ZERO);
+ codeHandlerCount.add(0);
if(!stripDebug) {
codeFlags.add(new Long((1 << 2))); // TODO: What if there's no debug information?
- codeLocalVariableTableN.add(new Integer(0));
+ codeLocalVariableTableN.add(0);
}
}
public void addHandler(Label start, Label end, Label handler, String type) {
- Integer handlers = (Integer) codeHandlerCount.remove(codeHandlerCount
+ int handlers = codeHandlerCount.remove(codeHandlerCount
.size() - 1);
- codeHandlerCount.add(new Integer(handlers.intValue() + 1));
+ codeHandlerCount.add(handlers + 1);
codeHandlerStartP.add(start);
codeHandlerEndPO.add(end);
codeHandlerCatchPO.add(handler);
@@ -736,13 +733,12 @@
if ((latestCodeFlag.intValue() & (1 << 1)) == 0) {
codeFlags.remove(codeFlags.size() - 1);
codeFlags.add(new Long(latestCodeFlag.intValue() | (1 << 1)));
- codeLineNumberTableN.add(new Integer(1));
+ codeLineNumberTableN.add(1);
} else {
- Integer numLines = (Integer) codeLineNumberTableN
- .remove(codeLineNumberTableN.size() - 1);
- codeLineNumberTableN.add(new Integer(numLines.intValue() + 1));
+ codeLineNumberTableN
+ .increment(codeLineNumberTableN.size() - 1);
}
- codeLineNumberTableLine.add(new Integer(line));
+ codeLineNumberTableLine.add(line);
codeLineNumberTableBciP.add(start);
// TODO: bci renumbering
}
@@ -754,32 +750,29 @@
if ((latestCodeFlag.intValue() & (1 << 3)) == 0) {
codeFlags.remove(codeFlags.size() - 1);
codeFlags.add(new Long(latestCodeFlag.intValue() | (1 << 3)));
- codeLocalVariableTypeTableN.add(new Integer(1));
+ codeLocalVariableTypeTableN.add(1);
} else {
- Integer numLocals = (Integer) codeLocalVariableTypeTableN
- .remove(codeLocalVariableTypeTableN.size() - 1);
- codeLocalVariableTypeTableN.add(new Integer(numLocals
- .intValue() + 1));
+ codeLocalVariableTypeTableN
+ .increment(codeLocalVariableTypeTableN.size() - 1);
}
codeLocalVariableTypeTableBciP.add(start);
codeLocalVariableTypeTableSpanO.add(end);
codeLocalVariableTypeTableNameRU.add(cpBands.getCPUtf8(name));
codeLocalVariableTypeTableTypeRS.add(cpBands
.getCPSignature(signature));
- codeLocalVariableTypeTableSlot.add(new Integer(indx));
+ codeLocalVariableTypeTableSlot.add(indx);
}
// LocalVariableTable attribute
- Integer numLocals = (Integer) codeLocalVariableTableN
- .remove(codeLocalVariableTableN.size() - 1);
- codeLocalVariableTableN.add(new Integer(numLocals.intValue() + 1));
+ codeLocalVariableTableN
+ .increment(codeLocalVariableTableN.size() - 1);
codeLocalVariableTableBciP.add(start);
codeLocalVariableTableSpanO.add(end);
codeLocalVariableTableNameRU.add(cpBands.getCPUtf8(name));
codeLocalVariableTableTypeRS.add(cpBands.getCPSignature(desc));
- codeLocalVariableTableSlot.add(new Integer(indx));
+ codeLocalVariableTableSlot.add(indx);
}
- public void doBciRenumbering(List bciRenumbering, Map labelsToOffsets) {
+ public void doBciRenumbering(IntList bciRenumbering, Map labelsToOffsets) {
renumberBci(codeLineNumberTableBciP, bciRenumbering, labelsToOffsets);
renumberBci(codeLocalVariableTableBciP, bciRenumbering, labelsToOffsets);
renumberOffsetBci(codeLocalVariableTableBciP,
@@ -796,7 +789,7 @@
bciRenumbering, labelsToOffsets);
}
- private void renumberBci(List list, List bciRenumbering, Map labelsToOffsets) {
+ private void renumberBci(List list, IntList bciRenumbering, Map labelsToOffsets) {
for (int i = list.size() - 1; i >= 0; i--) {
Object label = list.get(i);
if (label instanceof Integer) {
@@ -804,13 +797,13 @@
} else if (label instanceof Label) {
list.remove(i);
Integer bytecodeIndex = (Integer) labelsToOffsets.get(label);
- list.add(i, bciRenumbering.get(bytecodeIndex.intValue()));
+ list.add(i, new Integer(bciRenumbering.get(bytecodeIndex.intValue())));
}
}
}
private void renumberOffsetBci(List relative, List list,
- List bciRenumbering, Map labelsToOffsets) {
+ IntList bciRenumbering, Map labelsToOffsets) {
for (int i = list.size() - 1; i >= 0; i--) {
Object label = list.get(i);
if (label instanceof Integer) {
@@ -818,8 +811,8 @@
} else if (label instanceof Label) {
list.remove(i);
Integer bytecodeIndex = (Integer) labelsToOffsets.get(label);
- Integer renumberedOffset = new Integer(((Integer) bciRenumbering
- .get(bytecodeIndex.intValue())).intValue()
+ Integer renumberedOffset = new Integer(bciRenumbering
+ .get(bytecodeIndex.intValue())
- ((Integer) relative.get(i)).intValue());
list.add(i, renumberedOffset);
}
@@ -827,7 +820,7 @@
}
private void renumberDoubleOffsetBci(List relative, List firstOffset, List list,
- List bciRenumbering, Map labelsToOffsets) {
+ IntList bciRenumbering, Map labelsToOffsets) {
// TODO: There's probably a nicer way of doing this...
for (int i = list.size() - 1; i >= 0; i--) {
Object label = list.get(i);
@@ -836,8 +829,8 @@
} else if (label instanceof Label) {
list.remove(i);
Integer bytecodeIndex = (Integer) labelsToOffsets.get(label);
- Integer renumberedOffset = new Integer(((Integer) bciRenumbering
- .get(bytecodeIndex.intValue())).intValue()
+ Integer renumberedOffset = new Integer(bciRenumbering
+ .get(bytecodeIndex.intValue())
- ((Integer) relative.get(i)).intValue() - ((Integer) firstOffset.get(i)).intValue());
list.add(i, renumberedOffset);
}
Added: harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/IntList.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/IntList.java?rev=745887&view=auto
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/IntList.java (added)
+++ harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/IntList.java Thu Feb 19 14:45:53 2009
@@ -0,0 +1,253 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.harmony.pack200;
+
+import java.util.Arrays;
+
+/**
+ * IntList is based on java.util.ArrayList, but is written specifically for ints
+ * in order to reduce boxing and unboxing to Integers and reduce the memory
+ * required.
+ */
+public class IntList {
+
+ private int[] array;
+ private int firstIndex;
+ private int lastIndex;
+ private int modCount;
+
+ /**
+ * Constructs a new instance of IntList with capacity for ten elements.
+ */
+ public IntList() {
+ this(10);
+ }
+
+ /**
+ * Constructs a new instance of IntList with the specified capacity.
+ *
+ * @param capacity
+ * the initial capacity of this IntList
+ */
+ public IntList(int capacity) {
+ if (capacity < 0) {
+ throw new IllegalArgumentException();
+ }
+ firstIndex = lastIndex = 0;
+ array = new int[capacity];
+ }
+
+ /**
+ * Adds the specified object at the end of this IntList.
+ *
+ * @param object
+ * the object to add
+ * @return true
+ */
+ public boolean add(int object) {
+ if (lastIndex == array.length) {
+ growAtEnd(1);
+ }
+ array[lastIndex++] = object;
+ modCount++;
+ return true;
+ }
+
+ public void add(int location, int object) {
+ int size = lastIndex - firstIndex;
+ if (0 < location && location < size) {
+ if (firstIndex == 0 && lastIndex == array.length) {
+ growForInsert(location, 1);
+ } else if ((location < size / 2 && firstIndex > 0)
+ || lastIndex == array.length) {
+ System.arraycopy(array, firstIndex, array, --firstIndex,
+ location);
+ } else {
+ int index = location + firstIndex;
+ System.arraycopy(array, index, array, index + 1, size
+ - location);
+ lastIndex++;
+ }
+ array[location + firstIndex] = object;
+ } else if (location == 0) {
+ if (firstIndex == 0) {
+ growAtFront(1);
+ }
+ array[--firstIndex] = object;
+ } else if (location == size) {
+ if (lastIndex == array.length) {
+ growAtEnd(1);
+ }
+ array[lastIndex++] = object;
+ } else {
+ throw new IndexOutOfBoundsException();
+ }
+
+ modCount++;
+ }
+
+ public void clear() {
+ if (firstIndex != lastIndex) {
+ Arrays.fill(array, firstIndex, lastIndex, -1);
+ firstIndex = lastIndex = 0;
+ modCount++;
+ }
+ }
+
+ public int get(int location) {
+ if (0 <= location && location < (lastIndex - firstIndex)) {
+ return array[firstIndex + location];
+ }
+ throw new IndexOutOfBoundsException("" + location);
+ }
+
+ private void growAtEnd(int required) {
+ int size = lastIndex - firstIndex;
+ if (firstIndex >= required - (array.length - lastIndex)) {
+ int newLast = lastIndex - firstIndex;
+ if (size > 0) {
+ System.arraycopy(array, firstIndex, array, 0, size);
+ }
+ firstIndex = 0;
+ lastIndex = newLast;
+ } else {
+ int increment = size / 2;
+ if (required > increment) {
+ increment = required;
+ }
+ if (increment < 12) {
+ increment = 12;
+ }
+ int[] newArray = new int[size + increment];
+ if (size > 0) {
+ System.arraycopy(array, firstIndex, newArray, 0, size);
+ firstIndex = 0;
+ lastIndex = size;
+ }
+ array = newArray;
+ }
+ }
+
+ private void growAtFront(int required) {
+ int size = lastIndex - firstIndex;
+ if (array.length - lastIndex + firstIndex >= required) {
+ int newFirst = array.length - size;
+ if (size > 0) {
+ System.arraycopy(array, firstIndex, array, newFirst, size);
+ }
+ firstIndex = newFirst;
+ lastIndex = array.length;
+ } else {
+ int increment = size / 2;
+ if (required > increment) {
+ increment = required;
+ }
+ if (increment < 12) {
+ increment = 12;
+ }
+ int[] newArray = new int[size + increment];
+ if (size > 0) {
+ System.arraycopy(array, firstIndex, newArray, newArray.length
+ - size, size);
+ }
+ firstIndex = newArray.length - size;
+ lastIndex = newArray.length;
+ array = newArray;
+ }
+ }
+
+ private void growForInsert(int location, int required) {
+ int size = lastIndex - firstIndex;
+ int increment = size / 2;
+ if (required > increment) {
+ increment = required;
+ }
+ if (increment < 12) {
+ increment = 12;
+ }
+ int[] newArray = new int[size + increment];
+ int newFirst = increment - required;
+ // Copy elements after location to the new array skipping inserted
+ // elements
+ System.arraycopy(array, location + firstIndex, newArray, newFirst
+ + location + required, size - location);
+ // Copy elements before location to the new array from firstIndex
+ System.arraycopy(array, firstIndex, newArray, newFirst, location);
+ firstIndex = newFirst;
+ lastIndex = size + increment;
+
+ array = newArray;
+ }
+
+ public void increment(int location) {
+ if (0 <= location && location < (lastIndex - firstIndex)) {
+ array[firstIndex + location]++;
+ } else {
+ throw new IndexOutOfBoundsException("" + location);
+ }
+ }
+
+ public boolean isEmpty() {
+ return lastIndex == firstIndex;
+ }
+
+ public int remove(int location) {
+ int result;
+ int size = lastIndex - firstIndex;
+ if (0 <= location && location < size) {
+ if (location == size - 1) {
+ result = array[--lastIndex];
+ array[lastIndex] = 0;
+ } else if (location == 0) {
+ result = array[firstIndex];
+ array[firstIndex++] = 0;
+ } else {
+ int elementIndex = firstIndex + location;
+ result = array[elementIndex];
+ if (location < size / 2) {
+ System.arraycopy(array, firstIndex, array, firstIndex + 1,
+ location);
+ array[firstIndex++] = 0;
+ } else {
+ System.arraycopy(array, elementIndex + 1, array,
+ elementIndex, size - location - 1);
+ array[--lastIndex] = 0;
+ }
+ }
+ if (firstIndex == lastIndex) {
+ firstIndex = lastIndex = 0;
+ }
+ } else {
+ throw new IndexOutOfBoundsException();
+ }
+
+ modCount++;
+ return result;
+ }
+
+ public int size() {
+ return lastIndex - firstIndex;
+ }
+
+ public int[] toArray() {
+ int size = lastIndex - firstIndex;
+ int[] result = new int[size];
+ System.arraycopy(array, firstIndex, result, 0, size);
+ return result;
+ }
+
+}
Propchange: harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/IntList.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/IntList.java
------------------------------------------------------------------------------
svn:mime-type = text/plain