You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by qi...@apache.org on 2009/03/19 18:10:53 UTC
svn commit: r756095 [2/3] - in /harmony/enhanced/classlib/branches/java6:
depends/build/ depends/files/ depends/oss/ make/ make/freebsd.x86/
make/macosx.ppc32/ modules/archive/src/main/native/archive/shared/
modules/auth/ modules/auth/src/main/native/a...
Modified: harmony/enhanced/classlib/branches/java6/modules/luni/src/main/native/luni/windows/OSNetworkSystemWin32.c
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/luni/src/main/native/luni/windows/OSNetworkSystemWin32.c?rev=756095&r1=756094&r2=756095&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/luni/src/main/native/luni/windows/OSNetworkSystemWin32.c (original)
+++ harmony/enhanced/classlib/branches/java6/modules/luni/src/main/native/luni/windows/OSNetworkSystemWin32.c Thu Mar 19 17:10:51 2009
@@ -378,3 +378,47 @@
return (jint) nbytes;
}
+
+
+/**
+ * A helper method, call selectRead with a small timeout until read is ready or an error occurs.
+ *
+ * @param env pointer to the JNI library
+ * @param hysocketP socket pointer
+ * @param timeout timeout value
+ */
+
+I_32
+pollSelectRead (JNIEnv * env, jobject fileDescriptor, jint timeout,
+ BOOLEAN poll)
+{
+
+ I_32 result;
+ hysocket_t hysocketP;
+ PORT_ACCESS_FROM_ENV (env);
+
+ hysocketP = getJavaIoFileDescriptorContentsAsAPointer (env, fileDescriptor);
+ if (!hysock_socketIsValid (hysocketP))
+ {
+ throwJavaNetSocketException (env, HYPORT_ERROR_SOCKET_BADSOCKET);
+ return (jint) - 1;
+ }
+
+ if (0 == timeout)
+ {
+ result = hysock_select_read (hysocketP, 0, 0, FALSE);
+ }
+ else
+ {
+ result =
+ hysock_select_read (hysocketP, timeout / 1000,
+ (timeout % 1000) * 1000, FALSE);
+ }
+ if (HYPORT_ERROR_SOCKET_TIMEOUT == result)
+ throwJavaIoInterruptedIOException (env, result);
+ else if (0 > result)
+ throwJavaNetSocketException (env, result);
+
+ return result;
+}
+
Modified: harmony/enhanced/classlib/branches/java6/modules/luni/src/test/api/common/org/apache/harmony/luni/tests/java/lang/IntegerTest.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/luni/src/test/api/common/org/apache/harmony/luni/tests/java/lang/IntegerTest.java?rev=756095&r1=756094&r2=756095&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/luni/src/test/api/common/org/apache/harmony/luni/tests/java/lang/IntegerTest.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/luni/src/test/api/common/org/apache/harmony/luni/tests/java/lang/IntegerTest.java Thu Mar 19 17:10:51 2009
@@ -509,6 +509,15 @@
-Integer.MAX_VALUE));
assertEquals("Returned incorrect octal string", "-2147483648", Integer.toString(
Integer.MIN_VALUE));
+
+ // Test for HARMONY-6068
+ assertEquals("Returned incorrect octal String", "-1000", Integer.toString(-1000));
+ assertEquals("Returned incorrect octal String", "1000", Integer.toString(1000));
+ assertEquals("Returned incorrect octal String", "0", Integer.toString(0));
+ assertEquals("Returned incorrect octal String", "708", Integer.toString(708));
+ assertEquals("Returned incorrect octal String", "-100", Integer.toString(-100));
+ assertEquals("Returned incorrect octal String", "-1000000008", Integer.toString(-1000000008));
+ assertEquals("Returned incorrect octal String", "2000000008", Integer.toString(2000000008));
}
/**
Modified: harmony/enhanced/classlib/branches/java6/modules/luni/src/test/api/common/org/apache/harmony/luni/tests/java/net/SocketTest.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/luni/src/test/api/common/org/apache/harmony/luni/tests/java/net/SocketTest.java?rev=756095&r1=756094&r2=756095&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/luni/src/test/api/common/org/apache/harmony/luni/tests/java/net/SocketTest.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/luni/src/test/api/common/org/apache/harmony/luni/tests/java/net/SocketTest.java Thu Mar 19 17:10:51 2009
@@ -93,8 +93,8 @@
}
socket.setSoTimeout(5000);
- socket.accept();
-
+ Socket client = socket.accept();
+ client.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
Modified: harmony/enhanced/classlib/branches/java6/modules/luni/src/test/api/common/org/apache/harmony/luni/tests/java/net/URITest.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/luni/src/test/api/common/org/apache/harmony/luni/tests/java/net/URITest.java?rev=756095&r1=756094&r2=756095&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/luni/src/test/api/common/org/apache/harmony/luni/tests/java/net/URITest.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/luni/src/test/api/common/org/apache/harmony/luni/tests/java/net/URITest.java Thu Mar 19 17:10:51 2009
@@ -1612,6 +1612,17 @@
"file:///~/first"), b.relativize(a));
}
+ // Regression test for HARMONY-6075
+ public void test_relativize3() throws Exception {
+ URI uri = new URI("file", null, "/test/location", null);
+
+ URI base = new URI("file", null, "/test", null);
+
+ URI relative = base.relativize(uri);
+ assertEquals("location", relative.getSchemeSpecificPart());
+ assertNull(relative.getScheme());
+ }
+
/**
* @tests java.net.URI#relativize(java.net.URI)
*/
Modified: harmony/enhanced/classlib/branches/java6/modules/luni/src/test/api/common/org/apache/harmony/luni/tests/java/util/ArraysTest.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/luni/src/test/api/common/org/apache/harmony/luni/tests/java/util/ArraysTest.java?rev=756095&r1=756094&r2=756095&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/luni/src/test/api/common/org/apache/harmony/luni/tests/java/util/ArraysTest.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/luni/src/test/api/common/org/apache/harmony/luni/tests/java/util/ArraysTest.java Thu Mar 19 17:10:51 2009
@@ -1297,8 +1297,7 @@
/**
* @tests java.util.Arrays#sort(java.lang.Object[], java.util.Comparator)
*/
- @SuppressWarnings("unchecked")
- public void test_sort$Ljava_lang_ObjectLjava_util_Comparator() {
+ public void test_sort$Ljava_lang_ObjectLjava_util_Comparator() {
// Test for method void java.util.Arrays.sort(java.lang.Object [],
// java.util.Comparator)
ReversedIntegerComparator comp = new ReversedIntegerComparator();
@@ -1308,53 +1307,51 @@
comp
.compare(objectArray[counter],
objectArray[counter + 1]) <= 0);
-
- // Test the sort functionailty with an Integer array
- int[] original = { 190, 180, 170, 160, 150, 140, 120, 320, 110, 310,
- 100, 300, 290, 280, 270, 260, 250, 240, 230, 210, 200 };
- Integer[] sorted = { 100, 110, 120, 140, 150, 160, 170, 180, 190, 200,
- 210, 230, 240, 250, 260, 270, 280, 290, 300, 310, 320 };
-
- Integer[] elements = new Integer[original.length];
- for (int i=0; i < original.length; i++){
- elements[i] = new Integer(original[i]);
- }
-
- Comparator normalComparator = new Comparator(){
- public int compare(Object o1, Object o2) {
- Integer e1 = (Integer)o1;
- Integer e2 = (Integer)o2;
- if (e1 > e2){
- return 1;
- }else if(e1 < e2){
- return -1;
- }else{
- return 0;
- }
+ }
+
+ // Regression HARMONY-6076
+ public void test_sort$Ljava_lang_ObjectLjava_util_Comparator_stable() {
+ Element[] array = new Element[11];
+ array[0] = new Element(122);
+ array[1] = new Element(146);
+ array[2] = new Element(178);
+ array[3] = new Element(208);
+ array[4] = new Element(117);
+ array[5] = new Element(146);
+ array[6] = new Element(173);
+ array[7] = new Element(203);
+ array[8] = new Element(56);
+ array[9] = new Element(208);
+ array[10] = new Element(96);
+
+ Comparator<Element> comparator = new Comparator<Element>() {
+ public int compare(Element object1, Element object2) {
+ return object1.value - object2.value;
}
};
- Arrays.sort(elements, normalComparator);
- // After sorting, elements should be the same as sorted array.
- for(int i = 0; i < original.length; i++){
- assertEquals(sorted[i],elements[i]);
- }
- for (int i=0; i < original.length; i++){
- elements[i] = new Integer(original[i]);
- }
- Comparator comparator = new Comparator(){
- public int compare(Object o1, Object o2) {
- Integer e1 = (Integer)o1;
- Integer e2 = (Integer)o2;
- return e1 > e2 ? 1 : 0;
+ Arrays.sort(array, comparator);
+
+ for (int i = 1; i < array.length; i++) {
+ assertTrue(comparator.compare(array[i - 1], array[i]) <= 0);
+ if (comparator.compare(array[i - 1], array[i]) == 0) {
+ assertTrue(array[i - 1].index < array[i].index);
}
- };
- Arrays.sort(elements, comparator);
- // After sorting, elements should be the same as sorted array.
- for(int i = 0; i < original.length; i++){
- assertEquals(sorted[i],elements[i]);
}
- }
+ }
+
+ public static class Element {
+ public int value;
+
+ public int index;
+
+ private static int count = 0;
+
+ public Element(int value) {
+ this.value = value;
+ index = count++;
+ }
+ }
/**
* @tests java.util.Arrays#sort(short[])
Modified: harmony/enhanced/classlib/branches/java6/modules/misc/build.xml
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/misc/build.xml?rev=756095&r1=756094&r2=756095&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/misc/build.xml (original)
+++ harmony/enhanced/classlib/branches/java6/modules/misc/build.xml Thu Mar 19 17:10:51 2009
@@ -121,7 +121,8 @@
</jar>
</target>
- <target name="build-native" >
+ <target name="build-native" depends="build-native-all" />
+ <target name="build-native-all" >
<make dir="${hy.misc.src.main.native}/accessors/${hy.os.family}" />
<!-- Copy the built shared libs over to the jre/bin dir -->
Modified: harmony/enhanced/classlib/branches/java6/modules/nio/build.xml
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/nio/build.xml?rev=756095&r1=756094&r2=756095&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/nio/build.xml (original)
+++ harmony/enhanced/classlib/branches/java6/modules/nio/build.xml Thu Mar 19 17:10:51 2009
@@ -69,7 +69,8 @@
depends="build, compile-tests, prepare-exclude, run-tests" />
<!-- Build natives.-->
- <target name="build-native">
+ <target name="build-native" depends="build-native-all" />
+ <target name="build-native-all" >
<make dir="${hy.nio.src.main.native}/nio/${hy.os.family}" />
<!-- Copy the built shared libs over to the jre/bin dir -->
Modified: harmony/enhanced/classlib/branches/java6/modules/nio_char/build.xml
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/nio_char/build.xml?rev=756095&r1=756094&r2=756095&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/nio_char/build.xml (original)
+++ harmony/enhanced/classlib/branches/java6/modules/nio_char/build.xml Thu Mar 19 17:10:51 2009
@@ -44,7 +44,8 @@
<target name="build" depends="compile-java, copy-resources, build-jar" />
<!-- Build natives.-->
- <target name="build-native">
+ <target name="build-native" depends="build-native-all" />
+ <target name="build-native-all" >
<make dir="${hy.nio_char.src.main.native}/niochar/${hy.os.family}" />
Modified: harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/Archive.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/Archive.java?rev=756095&r1=756094&r2=756095&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/Archive.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/Archive.java Thu Mar 19 17:10:51 2009
@@ -43,6 +43,7 @@
private JarFile jarFile;
private long segmentLimit = 1000000;
private long currentSegmentSize;
+ private boolean stripDebug;
public Archive(JarInputStream inputStream, OutputStream outputStream,
boolean gzip) throws IOException {
@@ -63,6 +64,10 @@
segmentLimit = limit;
}
+ public void stripDebugAttributes() {
+ stripDebug = true;
+ }
+
public void pack() throws Pack200Exception, IOException {
List classes = new ArrayList();
List files = new ArrayList();
@@ -71,33 +76,33 @@
if (manifest != null) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
manifest.write(baos);
+ // TODO: Need to add this in some cases, but I'm not sure which at the moment
+// files.add(new File("META-INF", new byte[0], 0));
files.add(new File("META-INF/MANIFEST.MF", baos.toByteArray(), 0));
}
if (inputStream != null) {
- while (inputStream.available() > 0) {
- JarEntry jarEntry = inputStream.getNextJarEntry();
- if (jarEntry != null) {
- boolean added = addJarEntry(jarEntry,
- new BufferedInputStream(inputStream), classes,
- files);
- if (!added) { // not added because segment has reached
- // maximum size
- new Segment().pack(classes, files, outputStream);
+ JarEntry jarEntry = inputStream.getNextJarEntry();
+ while (jarEntry != null) {
+ boolean added = addJarEntry(jarEntry,
+ new BufferedInputStream(inputStream), classes,
+ files);
+ if (!added) { // not added because segment has reached
+ // maximum size
+ if(classes.size() > 0 || files.size() > 0) {
+ new Segment().pack(classes, files, outputStream, stripDebug);
classes = new ArrayList();
files = new ArrayList();
currentSegmentSize = 0;
- if (!addJarEntry(jarEntry, new BufferedInputStream(
- inputStream), classes, files)) {
- throw new Pack200Exception(
- "Segment limit is too small for the files you are trying to pack");
- }
- } else if (segmentLimit == 0) {
- // create a new segment for each class
- new Segment().pack(classes, files, outputStream);
- classes = new ArrayList();
- files = new ArrayList();
+ addJarEntry(jarEntry, new BufferedInputStream(inputStream), classes, files);
+ currentSegmentSize = 0; // ignore the size of the first entry for compatibility with the RI
}
+ } else if (segmentLimit == 0 && estimateSize(jarEntry) > 0) {
+ // create a new segment for each class unless size = 0
+ new Segment().pack(classes, files, outputStream, stripDebug);
+ classes = new ArrayList();
+ files = new ArrayList();
}
+ jarEntry = inputStream.getNextJarEntry();
}
} else {
Enumeration jarEntries = jarFile.entries();
@@ -107,24 +112,23 @@
jarFile.getInputStream(jarEntry)), classes, files);
if (!added) { // not added because segment has reached maximum
// size
- new Segment().pack(classes, files, outputStream);
+ new Segment().pack(classes, files, outputStream, stripDebug);
classes = new ArrayList();
files = new ArrayList();
currentSegmentSize = 0;
- if (!addJarEntry(jarEntry, new BufferedInputStream(jarFile
- .getInputStream(jarEntry)), classes, files)) {
- throw new Pack200Exception("Segment limit is too small");
- }
- } else if (segmentLimit == 0) {
- // create a new segment for each class
- new Segment().pack(classes, files, outputStream);
+ addJarEntry(jarEntry, new BufferedInputStream(jarFile
+ .getInputStream(jarEntry)), classes, files);
+ currentSegmentSize = 0; // ignore the size of the first entry for compatibility with the RI
+ } else if (segmentLimit == 0 && estimateSize(jarEntry) > 0) {
+ // create a new segment for each class unless size = 0
+ new Segment().pack(classes, files, outputStream, stripDebug);
classes = new ArrayList();
files = new ArrayList();
}
}
}
if(classes.size() > 0 || files.size() > 0) {
- new Segment().pack(classes, files, outputStream);
+ new Segment().pack(classes, files, outputStream, stripDebug);
}
outputStream.close();
}
@@ -134,17 +138,19 @@
String name = jarEntry.getName();
long size = jarEntry.getSize();
if (size > Integer.MAX_VALUE) {
- throw new RuntimeException("Large Class!");
+ throw new RuntimeException("Large Class!"); // TODO: Should probably allow this
+ } else if (size < 0) {
+ throw new RuntimeException("Error: size for " + name + " is " + size);
}
if(segmentLimit != -1 && segmentLimit != 0) {
// -1 is a special case where only one segment is created and
- // 0 is a special case where one segment is created for each file
- int packedSize = name.endsWith(".class") ? estimatePackedSize(size)
- : (int) size;
- if (packedSize + currentSegmentSize > segmentLimit) {
- return false;
+ // 0 is a special case where one segment is created for each file except for files in "META-INF"
+
+ long packedSize = estimateSize(jarEntry);
+ if (packedSize + currentSegmentSize > segmentLimit && currentSegmentSize > 0) {
+ return false; // don't add this JarEntry to the current segment
} else {
- currentSegmentSize += packedSize;
+ currentSegmentSize += packedSize; // do add this JarEntry
}
}
byte[] bytes = new byte[(int) size];
@@ -161,8 +167,18 @@
return true;
}
- private int estimatePackedSize(long size) {
- return (int) size; // TODO: try to match the RI as closely as possible
+ private long estimateSize(JarEntry jarEntry) {
+ // The heuristic used here is for compatibility with the RI and should not be changed
+ String name = jarEntry.getName();
+ if(name.startsWith("META-INF") || name.startsWith("/META-INF")) {
+ return 0;
+ } else {
+ long fileSize = jarEntry.getSize();
+ if(fileSize < 0) {
+ fileSize = 0;
+ }
+ return name.length() + fileSize + 5;
+ }
}
static class File {
@@ -188,6 +204,10 @@
public long getModtime() {
return modtime;
}
+
+ public String toString() {
+ return name;
+ }
}
}
Modified: harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/BcBands.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/BcBands.java?rev=756095&r1=756094&r2=756095&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/BcBands.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/BcBands.java Thu Mar 19 17:10:51 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/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/ClassBands.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/ClassBands.java?rev=756095&r1=756094&r2=756095&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/ClassBands.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/ClassBands.java Thu Mar 19 17:10:51 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;
@@ -184,7 +183,7 @@
public void currentClassReferencesInnerClass(CPClass inner) {
if(!(index >= class_this.length)) {
CPClass currentClass = class_this[index];
- if(currentClass != null && !currentClass.equals(inner) && !isInnerClassOf(currentClass, inner)) {
+ if(currentClass != null && !currentClass.equals(inner) && !isInnerClassOf(currentClass.toString(), inner)) {
Set referencedInnerClasses = (Set)classReferencesInnerClass.get(currentClass);
if(referencedInnerClasses == null) {
referencedInnerClasses = new HashSet();
@@ -195,15 +194,22 @@
}
}
- private boolean isInnerClassOf(CPClass possibleInner, CPClass possibleOuter) {
- String currentClassName = possibleInner.toString();
- if(possibleInner.isInnerClass()) {
- String superClassName = currentClassName.substring(0, currentClassName.lastIndexOf('$'));
- return superClassName.equals(possibleOuter.toString());
+ private boolean isInnerClassOf(String possibleInner, CPClass possibleOuter) {
+ if(isInnerClass(possibleInner)) {
+ String superClassName = possibleInner.substring(0, possibleInner.lastIndexOf('$'));
+ if(superClassName.equals(possibleOuter.toString())) {
+ return true;
+ } else { // do this recursively
+ return isInnerClassOf(superClassName, possibleOuter);
+ }
}
return false;
}
+ private boolean isInnerClass(String possibleInner) {
+ return possibleInner.indexOf('$') != -1;
+ }
+
public void addField(int flags, String name, String desc, String signature,
Object value) {
flags = flags & 0xFFFF;
@@ -235,19 +241,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[codeFlags.size()];
+ 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) {
@@ -271,11 +275,13 @@
codeMaxLocals.remove(i - removed);
codeMaxStack.remove(i - removed);
removed++;
+ } else if (!segment.getSegmentHeader().have_all_code_flags()) {
+ codeFlags.add(new Long(0));
}
}
// 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];
@@ -293,19 +299,19 @@
.hasNext();) {
CPClass inner = (CPClass) iterator2.next();
IcTuple icTuple = segment.getIcBands().getIcTuple(inner);
- if(icTuple != null) {
+ if(icTuple != null && ! icTuple.isAnonymous()) {
// should transmit an icLocal entry
icLocal.add(icTuple);
innerN++;
}
}
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();
@@ -326,39 +332,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 {
@@ -447,7 +453,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",
@@ -484,9 +490,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) {
@@ -500,12 +506,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",
@@ -526,13 +532,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",
@@ -544,9 +550,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",
@@ -558,7 +564,7 @@
cpEntryListToArray(codeLocalVariableTypeTableTypeRS),
Codec.UNSIGNED5));
out.write(encodeBandInt("code_LocalVariableTypeTable_slot",
- listToArray(codeLocalVariableTypeTableSlot), Codec.UNSIGNED5));
+ codeLocalVariableTypeTableSlot.toArray(), Codec.UNSIGNED5));
}
@@ -572,7 +578,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]));
}
@@ -590,6 +596,18 @@
}
}
+ public void endOfMethod() {
+ if(codeFlags.size() > 0) {
+ long latestCodeFlag = ((Long)codeFlags.get(codeFlags.size() - 1)).longValue();
+ int latestLocalVariableTableN = codeLocalVariableTableN.get(codeLocalVariableTableN.size() - 1);
+ if(latestCodeFlag == (1 << 2) && latestLocalVariableTableN == 0) {
+ codeLocalVariableTableN.remove(codeLocalVariableTableN.size() - 1);
+ codeFlags.remove(codeFlags.size() - 1);
+ codeFlags.add(new Integer(0));
+ }
+ }
+ }
+
protected static int countArgs(String descriptor) {
int bra = descriptor.indexOf('(');
int ket = descriptor.indexOf(')');
@@ -691,24 +709,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() {
- codeHandlerCount.add(ZERO);
- codeFlags.add(new Long((1 << 2))); // TODO: What if there's no debug information?
- codeLocalVariableTableN.add(new Integer(0));
+ public void addCode(boolean stripDebug) {
+ codeHandlerCount.add(0);
+ if(!stripDebug) {
+ codeFlags.add(new Long((1 << 2))); // TODO: What if there's no debug information?
+ 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);
@@ -720,13 +740,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
}
@@ -738,32 +757,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,
@@ -780,7 +796,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) {
@@ -788,13 +804,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) {
@@ -802,8 +818,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);
}
@@ -811,7 +827,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);
@@ -820,8 +836,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);
}
Modified: harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/IcBands.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/IcBands.java?rev=756095&r1=756094&r2=756095&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/IcBands.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/IcBands.java Thu Mar 19 17:10:51 2009
@@ -156,6 +156,12 @@
return C.compareTo(((IcTuple)arg0).C);
}
+ public boolean isAnonymous() {
+ String className = C.toString();
+ String innerName = className.substring(className.lastIndexOf('$') + 1);
+ return Character.isDigit(innerName.charAt(0));
+ }
+
}
public IcTuple getIcTuple(CPClass inner) {
Modified: harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/Segment.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/Segment.java?rev=756095&r1=756094&r2=756095&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/Segment.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/Segment.java Thu Mar 19 17:10:51 2009
@@ -43,11 +43,14 @@
private final SegmentFieldVisitor fieldVisitor = new SegmentFieldVisitor();
private final SegmentMethodVisitor methodVisitor = new SegmentMethodVisitor();
private Pack200ClassReader currentClassReader;
+ private boolean stripDebug;
- public void pack(List classes, List files, OutputStream out)
+ public void pack(List classes, List files, OutputStream out, boolean stripDebug)
throws IOException, Pack200Exception {
+ this.stripDebug = stripDebug;
segmentHeader = new SegmentHeader();
segmentHeader.setFile_count(files.size());
+ segmentHeader.setHave_all_code_flags(!stripDebug);
cpBands = new CpBands(this);
attributeDefinitionBands = new AttributeDefinitionBands(this);
icBands = new IcBands(segmentHeader, cpBands);
@@ -93,7 +96,9 @@
}
public void visitSource(String source, String debug) {
- classBands.addSourceFile(source);
+ if(!stripDebug) {
+ classBands.addSourceFile(source);
+ }
}
public void visitOuterClass(String owner, String name, String desc) {
@@ -150,7 +155,7 @@
}
public void visitCode() {
- classBands.addCode();
+ classBands.addCode(stripDebug);
}
public void visitFrame(int arg0, int arg1, Object[] arg2, int arg3,
@@ -164,13 +169,17 @@
}
public void visitLineNumber(int line, Label start) {
- classBands.addLineNumber(line, start);
+ if(!stripDebug) {
+ classBands.addLineNumber(line, start);
+ }
}
public void visitLocalVariable(String name, String desc,
String signature, Label start, Label end, int index) {
- classBands.addLocalVariable(name, desc, signature, start, end,
- index);
+ if(!stripDebug) {
+ classBands.addLocalVariable(name, desc, signature, start, end,
+ index);
+ }
}
public void visitMaxs(int maxStack, int maxLocals) {
@@ -189,6 +198,7 @@
}
public void visitEnd() {
+ classBands.endOfMethod();
bcBands.visitEnd();
}
@@ -422,8 +432,6 @@
}
public void visitEnd() {
- // TODO Auto-generated method stub
-
}
}
Modified: harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/SegmentHeader.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/SegmentHeader.java?rev=756095&r1=756094&r2=756095&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/SegmentHeader.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/SegmentHeader.java Thu Mar 19 17:10:51 2009
@@ -369,4 +369,8 @@
return have_file_options;
}
+ public boolean have_all_code_flags() {
+ return have_all_code_flags;
+ }
+
}
\ No newline at end of file
Modified: harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/unpack200/ClassBands.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/unpack200/ClassBands.java?rev=756095&r1=756094&r2=756095&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/unpack200/ClassBands.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/unpack200/ClassBands.java Thu Mar 19 17:10:51 2009
@@ -207,39 +207,6 @@
Codec.UNSIGNED5, signatureCount);
int signatureIndex = 0;
- int backwardsCallsUsed = parseFieldMetadataBands(in, fieldAttrCalls);
-
- // Parse non-predefined attribute bands
- int backwardsCallIndex = backwardsCallsUsed;
- int limit = options.hasFieldFlagsHi() ? 62 : 31;
- AttributeLayout[] otherLayouts = new AttributeLayout[limit + 1];
- int[] counts = new int[limit + 1];
- List[] otherAttributes = new List[limit + 1];
- for (int i = 0; i < limit; i++) {
- AttributeLayout layout = attrMap.getAttributeLayout(i,
- AttributeLayout.CONTEXT_FIELD);
- if (layout != null && !(layout.isDefaultLayout())) {
- otherLayouts[i] = layout;
- counts[i] = SegmentUtils.countMatches(fieldFlags, layout);
- }
- }
- for (int i = 0; i < counts.length; i++) {
- if (counts[i] > 0) {
- NewAttributeBands bands = attrMap
- .getAttributeBands(otherLayouts[i]);
- otherAttributes[i] = bands.parseAttributes(in, counts[i]);
- int numBackwardsCallables = otherLayouts[i]
- .numBackwardsCallables();
- if (numBackwardsCallables > 0) {
- int[] backwardsCalls = new int[numBackwardsCallables];
- System.arraycopy(fieldAttrCalls, backwardsCallIndex,
- backwardsCalls, 0, numBackwardsCallables);
- bands.setBackwardsCalls(backwardsCalls);
- backwardsCallIndex += numBackwardsCallables;
- }
- }
- }
-
AttributeLayout deprecatedLayout = attrMap.getAttributeLayout(
AttributeLayout.ATTRIBUTE_DEPRECATED,
AttributeLayout.CONTEXT_FIELD);
@@ -276,12 +243,56 @@
fieldAttributes[i][j].add(new SignatureAttribute(value));
signatureIndex++;
}
- // Non-predefined attributes
+ }
+ }
+
+ int backwardsCallsUsed = parseFieldMetadataBands(in, fieldAttrCalls);
+
+ // Parse non-predefined attribute bands
+ int backwardsCallIndex = backwardsCallsUsed;
+ int limit = options.hasFieldFlagsHi() ? 62 : 31;
+ AttributeLayout[] otherLayouts = new AttributeLayout[limit + 1];
+ int[] counts = new int[limit + 1];
+ List[] otherAttributes = new List[limit + 1];
+ for (int i = 0; i < limit; i++) {
+ AttributeLayout layout = attrMap.getAttributeLayout(i,
+ AttributeLayout.CONTEXT_FIELD);
+ if (layout != null && !(layout.isDefaultLayout())) {
+ otherLayouts[i] = layout;
+ counts[i] = SegmentUtils.countMatches(fieldFlags, layout);
+ }
+ }
+ for (int i = 0; i < counts.length; i++) {
+ if (counts[i] > 0) {
+ NewAttributeBands bands = attrMap
+ .getAttributeBands(otherLayouts[i]);
+ otherAttributes[i] = bands.parseAttributes(in, counts[i]);
+ int numBackwardsCallables = otherLayouts[i]
+ .numBackwardsCallables();
+ if (numBackwardsCallables > 0) {
+ int[] backwardsCalls = new int[numBackwardsCallables];
+ System.arraycopy(fieldAttrCalls, backwardsCallIndex,
+ backwardsCalls, 0, numBackwardsCallables);
+ bands.setBackwardsCalls(backwardsCalls);
+ backwardsCallIndex += numBackwardsCallables;
+ }
+ }
+ }
+
+ // Non-predefined attributes
+ for (int i = 0; i < classCount; i++) {
+ for (int j = 0; j < fieldFlags[i].length; j++) {
+ long flag = fieldFlags[i][j];
+ int othersAddedAtStart = 0;
for (int k = 0; k < otherLayouts.length; k++) {
if (otherLayouts[k] != null
&& otherLayouts[k].matches(flag)) {
// Add the next attribute
- fieldAttributes[i][j].add(otherAttributes[k].get(0));
+ if(otherLayouts[k].getIndex()<15) {
+ fieldAttributes[i][j].add(othersAddedAtStart++, otherAttributes[k].get(0));
+ } else {
+ fieldAttributes[i][j].add(otherAttributes[k].get(0));
+ }
otherAttributes[k].remove(0);
}
}
@@ -340,40 +351,6 @@
long[] methodSignatureRS = decodeBandLong("method_signature_RS", in,
Codec.UNSIGNED5, count1);
- // Parse method metadata bands
- int backwardsCallsUsed = parseMethodMetadataBands(in, methodAttrCalls);
-
- // Parse non-predefined attribute bands
- int backwardsCallIndex = backwardsCallsUsed;
- int limit = options.hasMethodFlagsHi() ? 62 : 31;
- AttributeLayout[] otherLayouts = new AttributeLayout[limit + 1];
- int[] counts = new int[limit + 1];
- List[] otherAttributes = new List[limit + 1];
- for (int i = 0; i < limit; i++) {
- AttributeLayout layout = attrMap.getAttributeLayout(i,
- AttributeLayout.CONTEXT_METHOD);
- if (layout != null && !(layout.isDefaultLayout())) {
- otherLayouts[i] = layout;
- counts[i] = SegmentUtils.countMatches(methodFlags, layout);
- }
- }
- for (int i = 0; i < counts.length; i++) {
- if (counts[i] > 0) {
- NewAttributeBands bands = attrMap
- .getAttributeBands(otherLayouts[i]);
- otherAttributes[i] = bands.parseAttributes(in, counts[i]);
- int numBackwardsCallables = otherLayouts[i]
- .numBackwardsCallables();
- if (numBackwardsCallables > 0) {
- int[] backwardsCalls = new int[numBackwardsCallables];
- System.arraycopy(methodAttrCalls, backwardsCallIndex,
- backwardsCalls, 0, numBackwardsCallables);
- bands.setBackwardsCalls(backwardsCalls);
- backwardsCallIndex += numBackwardsCallables;
- }
- }
- }
-
AttributeLayout deprecatedLayout = attrMap.getAttributeLayout(
AttributeLayout.ATTRIBUTE_DEPRECATED,
AttributeLayout.CONTEXT_METHOD);
@@ -384,16 +361,6 @@
for (int i = 0; i < methodAttributes.length; i++) {
for (int j = 0; j < methodAttributes[i].length; j++) {
long flag = methodFlags[i][j];
- // Non-predefined attributes
- for (int k = 0; k < otherLayouts.length; k++) {
- if (otherLayouts[k] != null
- && otherLayouts[k].matches(flag)
- && otherLayouts[k].getIndex() < 15) {
- // Add the next attribute
- methodAttributes[i][j].add(otherAttributes[k].get(0));
- otherAttributes[k].remove(0);
- }
- }
if (methodExceptionsLayout.matches(flag)) {
int n = numExceptions[methodExceptionsIndex];
int[] exceptions = methodExceptionsRS[methodExceptionsIndex];
@@ -425,13 +392,57 @@
if (deprecatedLayout.matches(flag)) {
methodAttributes[i][j].add(new DeprecatedAttribute());
}
- // Non-predefined attributes
+ }
+ }
+
+ // Parse method metadata bands
+ int backwardsCallsUsed = parseMethodMetadataBands(in, methodAttrCalls);
+
+ // Parse non-predefined attribute bands
+ int backwardsCallIndex = backwardsCallsUsed;
+ int limit = options.hasMethodFlagsHi() ? 62 : 31;
+ AttributeLayout[] otherLayouts = new AttributeLayout[limit + 1];
+ int[] counts = new int[limit + 1];
+ List[] otherAttributes = new List[limit + 1];
+ for (int i = 0; i < limit; i++) {
+ AttributeLayout layout = attrMap.getAttributeLayout(i,
+ AttributeLayout.CONTEXT_METHOD);
+ if (layout != null && !(layout.isDefaultLayout())) {
+ otherLayouts[i] = layout;
+ counts[i] = SegmentUtils.countMatches(methodFlags, layout);
+ }
+ }
+ for (int i = 0; i < counts.length; i++) {
+ if (counts[i] > 0) {
+ NewAttributeBands bands = attrMap
+ .getAttributeBands(otherLayouts[i]);
+ otherAttributes[i] = bands.parseAttributes(in, counts[i]);
+ int numBackwardsCallables = otherLayouts[i]
+ .numBackwardsCallables();
+ if (numBackwardsCallables > 0) {
+ int[] backwardsCalls = new int[numBackwardsCallables];
+ System.arraycopy(methodAttrCalls, backwardsCallIndex,
+ backwardsCalls, 0, numBackwardsCallables);
+ bands.setBackwardsCalls(backwardsCalls);
+ backwardsCallIndex += numBackwardsCallables;
+ }
+ }
+ }
+
+ // Non-predefined attributes
+ for (int i = 0; i < methodAttributes.length; i++) {
+ for (int j = 0; j < methodAttributes[i].length; j++) {
+ long flag = methodFlags[i][j];
+ int othersAddedAtStart = 0;
for (int k = 0; k < otherLayouts.length; k++) {
if (otherLayouts[k] != null
- && otherLayouts[k].matches(flag)
- && otherLayouts[k].getIndex() >= 15) {
+ && otherLayouts[k].matches(flag)) {
// Add the next attribute
- methodAttributes[i][j].add(otherAttributes[k].get(0));
+ if(otherLayouts[k].getIndex() < 15) {
+ methodAttributes[i][j].add(othersAddedAtStart++, otherAttributes[k].get(0));
+ } else {
+ methodAttributes[i][j].add(otherAttributes[k].get(0));
+ }
otherAttributes[k].remove(0);
}
}
Modified: harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/unpack200/IcTuple.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/unpack200/IcTuple.java?rev=756095&r1=756094&r2=756095&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/unpack200/IcTuple.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/unpack200/IcTuple.java Thu Mar 19 17:10:51 2009
@@ -271,7 +271,7 @@
public String toString() {
StringBuffer result = new StringBuffer();
- result.append(this.getClass().getName());
+ result.append("IcTuple ");
result.append('(');
result.append(simpleClassName());
result.append(" in ");
Modified: harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/unpack200/Segment.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/unpack200/Segment.java?rev=756095&r1=756094&r2=756095&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/unpack200/Segment.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/unpack200/Segment.java Thu Mar 19 17:10:51 2009
@@ -31,6 +31,7 @@
import java.util.TimeZone;
import java.util.jar.JarEntry;
import java.util.jar.JarOutputStream;
+import java.util.zip.CRC32;
import java.util.zip.GZIPInputStream;
import java.util.zip.ZipEntry;
@@ -528,7 +529,6 @@
long[] fileSize = fileBands.getFileSize();
byte[][] fileBits = fileBands.getFileBits();
- // out.setLevel(JarEntry.DEFLATED)
// now write the files out
int classNum = 0;
int numberOfFiles = header.getNumberOfFiles();
@@ -546,23 +546,32 @@
boolean deflate = fileDeflate[i];
JarEntry entry = new JarEntry(name);
- if (deflate)
+ if (deflate) {
entry.setMethod(ZipEntry.DEFLATED);
+ } else {
+ entry.setMethod(ZipEntry.STORED);
+ CRC32 crc = new CRC32();
+ if(fileIsClass[i]) {
+ crc.update(classFilesContents[classNum]);
+ entry.setSize(classFilesContents[classNum].length);
+ } else {
+ crc.update(fileBits[i]);
+ entry.setSize(fileSize[i]);
+ }
+ entry.setCrc(crc.getValue());
+ }
// On Windows at least, need to correct for timezone
entry.setTime(modtime - TimeZone.getDefault().getRawOffset());
out.putNextEntry(entry);
+ // write to output stream
if (fileIsClass[i]) {
- // write to dos
entry.setSize(classFilesContents[classNum].length);
out.write(classFilesContents[classNum]);
classNum++;
} else {
- long size = fileSize[i];
- entry.setSize(size);
-
- byte[] data = fileBits[i];
- out.write(data);
+ entry.setSize(fileSize[i]);
+ out.write(fileBits[i]);
}
}
}
Modified: harmony/enhanced/classlib/branches/java6/modules/pack200/src/test/java/org/apache/harmony/pack200/tests/ArchiveTest.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/pack200/src/test/java/org/apache/harmony/pack200/tests/ArchiveTest.java?rev=756095&r1=756094&r2=756095&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/pack200/src/test/java/org/apache/harmony/pack200/tests/ArchiveTest.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/pack200/src/test/java/org/apache/harmony/pack200/tests/ArchiveTest.java Thu Mar 19 17:10:51 2009
@@ -112,8 +112,11 @@
JarFile jarFile = new JarFile(file2);
file2.deleteOnExit();
- JarFile jarFile2 = new JarFile(new File(Archive.class.getResource(
- "/org/apache/harmony/pack200/tests/sqlUnpacked.jar").toURI()));
+ File compareFile = new File(Archive.class.getResource(
+ "/org/apache/harmony/pack200/tests/sqlUnpacked.jar").toURI());
+ JarFile jarFile2 = new JarFile(compareFile);
+
+ assertEquals(jarFile2.size(), jarFile.size());
compareFiles(jarFile, jarFile2);
}
@@ -141,6 +144,97 @@
compareFiles(jarFile, jarFile2);
}
+ public void testSegmentLimits() throws IOException, Pack200Exception {
+
+ in = new JarInputStream(
+ Archive.class
+ .getResourceAsStream("/org/apache/harmony/pack200/tests/hw.jar"));
+ file = File.createTempFile("helloworld", ".pack.gz");
+ out = new FileOutputStream(file);
+ Archive archive = new Archive(in, out, true);
+ archive.setSegmentLimit(0);
+ archive.pack();
+ in.close();
+ out.close();
+
+ in = new JarInputStream(
+ Archive.class
+ .getResourceAsStream("/org/apache/harmony/pack200/tests/hw.jar"));
+ file = File.createTempFile("helloworld", ".pack.gz");
+ out = new FileOutputStream(file);
+ archive = new Archive(in, out, true);
+ archive.setSegmentLimit(-1);
+ archive.pack();
+ in.close();
+ out.close();
+
+ in = new JarInputStream(
+ Archive.class
+ .getResourceAsStream("/org/apache/harmony/pack200/tests/hw.jar"));
+ file = File.createTempFile("helloworld", ".pack.gz");
+ out = new FileOutputStream(file);
+ archive = new Archive(in, out, true);
+ archive.setSegmentLimit(5000);
+ archive.pack();
+ in.close();
+ out.close();
+ }
+
+ public void testStripDebug() throws IOException, Pack200Exception, URISyntaxException {
+ in = new JarInputStream(Archive.class
+ .getResourceAsStream("/org/apache/harmony/pack200/tests/sqlUnpacked.jar"));
+ file = File.createTempFile("sql", ".pack");
+ out = new FileOutputStream(file);
+ Archive archive = new Archive(in, out, false);
+ archive.stripDebugAttributes();
+ archive.pack();
+ in.close();
+ out.close();
+
+ // now unpack
+ InputStream in2 = new FileInputStream(file);
+ File file2 = File.createTempFile("sqloutNoDebug", ".jar");
+ JarOutputStream out2 = new JarOutputStream(new FileOutputStream(file2));
+ org.apache.harmony.unpack200.Archive u2archive = new org.apache.harmony.unpack200.Archive(in2, out2);
+ u2archive.unpack();
+
+ File compareFile = new File(Archive.class.getResource(
+ "/org/apache/harmony/pack200/tests/sqlUnpackedNoDebug.jar").toURI());
+ JarFile jarFile = new JarFile(file2);
+ assertTrue(file2.length() < 250000);
+ file2.deleteOnExit();
+
+ JarFile jarFile2 = new JarFile(compareFile);
+
+ compareFiles(jarFile, jarFile2);
+ }
+
+ public void testAnnotations() throws IOException, Pack200Exception,
+ URISyntaxException {
+ in = new JarInputStream(
+ Archive.class
+ .getResourceAsStream("/org/apache/harmony/pack200/tests/annotationsUnpacked.jar"));
+ file = File.createTempFile("annotations", ".pack");
+ out = new FileOutputStream(file);
+ new Archive(in, out, false).pack();
+ in.close();
+ out.close();
+
+ // now unpack
+ InputStream in2 = new FileInputStream(file);
+ File file2 = File.createTempFile("annotationsout", ".jar");
+ JarOutputStream out2 = new JarOutputStream(new FileOutputStream(file2));
+ org.apache.harmony.unpack200.Archive archive = new org.apache.harmony.unpack200.Archive(
+ in2, out2);
+ archive.unpack();
+ JarFile jarFile = new JarFile(file2);
+ file2.deleteOnExit();
+ JarFile jarFile2 = new JarFile(new File(Archive.class.getResource(
+ "/org/apache/harmony/pack200/tests/annotationsUnpacked.jar").toURI()));
+
+ compareFiles(jarFile, jarFile2);
+ }
+
private void compareFiles(JarFile jarFile, JarFile jarFile2)
throws IOException {
Enumeration entries = jarFile.entries();
Modified: harmony/enhanced/classlib/branches/java6/modules/pack200/src/test/java/org/apache/harmony/unpack200/tests/ArchiveTest.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/pack200/src/test/java/org/apache/harmony/unpack200/tests/ArchiveTest.java?rev=756095&r1=756094&r2=756095&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/pack200/src/test/java/org/apache/harmony/unpack200/tests/ArchiveTest.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/pack200/src/test/java/org/apache/harmony/unpack200/tests/ArchiveTest.java Thu Mar 19 17:10:51 2009
@@ -71,8 +71,16 @@
JarFile jarFile = new JarFile(file);
file.deleteOnExit();
- JarFile jarFile2 = new JarFile(new File(Archive.class.getResource(
- "/org/apache/harmony/pack200/tests/sqlUnpacked.jar").toURI()));
+ File compareFile = new File(Archive.class.getResource(
+ "/org/apache/harmony/pack200/tests/sqlUnpacked.jar").toURI());
+
+ JarFile jarFile2 = new JarFile(compareFile);
+
+ long differenceInJarSizes = Math.abs(compareFile.length()
+ - file.length());
+
+ assertTrue("Expected jar files to be a similar size, difference was "
+ + differenceInJarSizes + " bytes", differenceInJarSizes < 100);
Enumeration entries = jarFile.entries();
Enumeration entries2 = jarFile2.entries();
Modified: harmony/enhanced/classlib/branches/java6/modules/prefs/build.xml
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/prefs/build.xml?rev=756095&r1=756094&r2=756095&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/prefs/build.xml (original)
+++ harmony/enhanced/classlib/branches/java6/modules/prefs/build.xml Thu Mar 19 17:10:51 2009
@@ -59,7 +59,8 @@
<!-- Build natives. Currently there are only windows natives for
prefs, so we check if we are on a windows platform -->
- <target name="build-native" if="is.windows">
+ <target name="build-native" depends="build-native-all" />
+ <target name="build-native-all" if="is.windows">
<make dir="${hy.prefs.src.main.native}/prefs/${hy.os.family}" />
<!-- Copy the built shared libs over to the jre/bin dir -->
Modified: harmony/enhanced/classlib/branches/java6/modules/print/build.xml
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/print/build.xml?rev=756095&r1=756094&r2=756095&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/print/build.xml (original)
+++ harmony/enhanced/classlib/branches/java6/modules/print/build.xml Thu Mar 19 17:10:51 2009
@@ -102,7 +102,8 @@
</javac>
</target>
- <target name="build-native" if="is.windows">
+ <target name="build-native" depends="build-native-all" />
+ <target name="build-native-all" if="is.windows">
<make dir="${hy.print.src.main.native}/print/${hy.os.family}" />
<!-- Copy the built shared libs over to the jre/bin dir -->
<copy todir="${hy.jdk}/jre/bin" overwrite="yes">