You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by to...@apache.org on 2008/01/08 11:55:41 UTC
svn commit: r609928 [3/5] - in /harmony/enhanced/classlib/branches/java6: ./
make/ modules/awt/src/main/java/unix/org/apache/harmony/awt/gl/linux/
modules/awt/src/main/java/windows/org/apache/harmony/awt/gl/windows/
modules/awt/src/main/native/gl/share...
Modified: harmony/enhanced/classlib/branches/java6/modules/luni/src/main/java/org/apache/harmony/luni/platform/OSNetworkSystem.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/luni/src/main/java/org/apache/harmony/luni/platform/OSNetworkSystem.java?rev=609928&r1=609927&r2=609928&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/luni/src/main/java/org/apache/harmony/luni/platform/OSNetworkSystem.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/luni/src/main/java/org/apache/harmony/luni/platform/OSNetworkSystem.java Tue Jan 8 02:55:24 2008
@@ -275,42 +275,74 @@
timeout);
}
- /*
- *
- * @param
- * readChannels all channels interested in read and accept
- * @param
- * writeChannels all channels interested in write and connect
+ /**
+ * Select the given file descriptors for read and write operations.
+ *
+ * The file descriptors passed in as readFDs will be selected for read-ready
+ * operations, and those in the writeFDs will be selected for write-ready
+ * operations. A file descriptor can appear in either or both array, and
+ * must not be <code>null</code>. If the file descriptor is closed during
+ * the select the behavior depends upon the underlying OS.
+ *
+ * Upon return the result is a single array of length
+ * <code>readFDs.length</code> + <code>writeFDs.length</code> laid out
+ * as the result of the select operation on the corresponding file
+ * descriptors.
+ *
+ * @param readChannels
+ * all channels interested in read and accept
+ * @param writeChannels
+ * all channels interested in write and connect
* @param timeout
- * timeout in millis @return a set of channels that are ready for operation
- * @throws
- * SocketException @return int array, each int approve one of the * channel if OK
- */
-
- public int[] select(FileDescriptor[] readFDs,
- FileDescriptor[] writeFDs, long timeout)
- throws SocketException {
- int countRead = readFDs.length;
- int countWrite = writeFDs.length;
- int result = 0;
+ * timeout in millis
+ * @returns int array, each element describes the corresponding state of the
+ * descriptor in the read and write arrays.
+ * @throws SocketException
+ */
+ public int[] select(FileDescriptor[] readFDs, FileDescriptor[] writeFDs,
+ long timeout) throws SocketException {
+ int countRead = readFDs.length;
+ int countWrite = writeFDs.length;
+ int result = 0;
if (0 == countRead + countWrite) {
return (new int[0]);
}
- int[] flags = new int[countRead + countWrite];
+ int[] flags = new int[countRead + countWrite];
+
+ assert validateFDs(readFDs, writeFDs) : "Invalid file descriptor arrays";
// handle timeout in native
- result = selectImpl(readFDs, writeFDs, countRead, countWrite, flags,
- timeout);
+ result = selectImpl(readFDs, writeFDs, countRead, countWrite, flags,
+ timeout);
- if (0 <= result) {
- return flags;
- }
- if (ERRORCODE_SOCKET_TIMEOUT == result) {
- return new int[0];
- }
- throw new SocketException();
+ if (0 <= result) {
+ return flags;
+ }
+ if (ERRORCODE_SOCKET_TIMEOUT == result) {
+ return new int[0];
+ }
+ throw new SocketException();
+ }
- }
+ /*
+ * Used to check if the file descriptor arrays are valid before passing them
+ * into the select native call.
+ */
+ private boolean validateFDs(FileDescriptor[] readFDs,
+ FileDescriptor[] writeFDs) {
+ for (FileDescriptor fd : readFDs) {
+ // Also checks fd not null
+ if (!fd.valid()) {
+ return false;
+ }
+ }
+ for (FileDescriptor fd : writeFDs) {
+ if (!fd.valid()) {
+ return false;
+ }
+ }
+ return true;
+ }
public InetAddress getSocketLocalAddress(FileDescriptor aFD,
boolean preferIPv6Addresses) {
Modified: harmony/enhanced/classlib/branches/java6/modules/luni/src/main/native/include/unix/jclprots.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/luni/src/main/native/include/unix/jclprots.h?rev=609928&r1=609927&r2=609928&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/luni/src/main/native/include/unix/jclprots.h (original)
+++ harmony/enhanced/classlib/branches/java6/modules/luni/src/main/native/include/unix/jclprots.h Tue Jan 8 02:55:24 2008
@@ -228,7 +228,6 @@
/* NativesCommonFileDescriptor*/
void JNICALL Java_java_io_FileDescriptor_oneTimeInitialization PROTOTYPE((JNIEnv * env, jclass fdClazz));
void JNICALL Java_java_io_FileDescriptor_sync PROTOTYPE((JNIEnv * env, jobject recv));
-jboolean JNICALL Java_java_io_FileDescriptor_valid PROTOTYPE((JNIEnv * env, jobject recv));
/* NativesCommonProcess*/
jint JNICALL Java_org_apache_harmony_luni_internal_process_ProcessInputStream_availableImpl PROTOTYPE((JNIEnv * env, jobject recv));
Modified: harmony/enhanced/classlib/branches/java6/modules/luni/src/main/native/include/windows/jclprots.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/luni/src/main/native/include/windows/jclprots.h?rev=609928&r1=609927&r2=609928&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/luni/src/main/native/include/windows/jclprots.h (original)
+++ harmony/enhanced/classlib/branches/java6/modules/luni/src/main/native/include/windows/jclprots.h Tue Jan 8 02:55:24 2008
@@ -405,8 +405,6 @@
PROTOTYPE ((JNIEnv * env, jclass fdClazz));
JNIEXPORT void JNICALL Java_java_io_FileDescriptor_sync
PROTOTYPE ((JNIEnv * env, jobject recv));
- JNIEXPORT jboolean JNICALL Java_java_io_FileDescriptor_valid
- PROTOTYPE ((JNIEnv * env, jobject recv));
/* NativesCommonProcess*/
JNIEXPORT jint JNICALL Java_org_apache_harmony_luni_internal_process_ProcessInputStream_availableImpl
Modified: harmony/enhanced/classlib/branches/java6/modules/luni/src/main/native/luni/shared/filedesc.c
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/luni/src/main/native/luni/shared/filedesc.c?rev=609928&r1=609927&r2=609928&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/luni/src/main/native/luni/shared/filedesc.c (original)
+++ harmony/enhanced/classlib/branches/java6/modules/luni/src/main/native/luni/shared/filedesc.c Tue Jan 8 02:55:24 2008
@@ -20,17 +20,6 @@
#include "exceptions.h"
#include "harmonyglob.h"
-JNIEXPORT jboolean JNICALL
-Java_java_io_FileDescriptor_valid (JNIEnv * env, jobject recv)
-{
- /**
- * Currently only answer false if the descriptor is -1. Possibly there
- * could be an OS check to see if the handle has been invalidated
- */
- void *descriptor = getJavaIoFileDescriptorContentsAsAPointer (env, recv);
- return (IDATA) descriptor != -1;
-}
-
JNIEXPORT void JNICALL
Java_java_io_FileDescriptor_syncImpl (JNIEnv * env, jobject recv)
{
Modified: harmony/enhanced/classlib/branches/java6/modules/luni/src/main/native/luni/shared/luniglob.c
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/luni/src/main/native/luni/shared/luniglob.c?rev=609928&r1=609927&r2=609928&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/luni/src/main/native/luni/shared/luniglob.c (original)
+++ harmony/enhanced/classlib/branches/java6/modules/luni/src/main/native/luni/shared/luniglob.c Tue Jan 8 02:55:24 2008
@@ -346,10 +346,6 @@
returnCode = JNI_ERR;
goto cleanup;
}
- if (!bootstrapClassPath) {
- /* no such property yet */
- bootstrapClassPath = "";
- }
qsort(props, number, sizeof(key_value_pair), props_compare);
@@ -362,11 +358,13 @@
if (tokensScanned == 1)
{
char *oldPath = bootstrapClassPath;
- bootstrapClassPath = str_concat (PORTLIB,
- bootstrapClassPath, cpSeparator,
- bootDirectory, props[i].value, NULL);
- if (i != 0)
- {
+ if ((!oldPath) || (strlen(bootstrapClassPath) == 0)) {
+ bootstrapClassPath = str_concat (PORTLIB,
+ bootDirectory, props[i].value, NULL);
+ } else {
+ bootstrapClassPath = str_concat (PORTLIB,
+ bootstrapClassPath, cpSeparator,
+ bootDirectory, props[i].value, NULL);
hymem_free_memory (oldPath);
}
Modified: harmony/enhanced/classlib/branches/java6/modules/luni/src/main/native/luni/shared/nethelp.c
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/luni/src/main/native/luni/shared/nethelp.c?rev=609928&r1=609927&r2=609928&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/luni/src/main/native/luni/shared/nethelp.c (original)
+++ harmony/enhanced/classlib/branches/java6/modules/luni/src/main/native/luni/shared/nethelp.c Tue Jan 8 02:55:24 2008
@@ -307,27 +307,27 @@
char *errorMessage = netLookupErrorString (env, errorNumber);
jstring errorMessageString = (*env)->NewStringUTF (env,errorMessage);
if (HYPORT_ERROR_SOCKET_WOULDBLOCK == errorNumber){
- errorCodeExClass = (*env)->FindClass (env, "org/apache/harmony/luni/util/ErrorCodeException");
- if (!errorCodeExClass){
- return;
- }
- errorCodeExConstructor = (*env)->GetMethodID(env,errorCodeExClass,"<init>","(I)V");
- if (!errorCodeExConstructor){
- return;
- }
- errorCodeEx = (*env)->NewObject(env, errorCodeExClass,errorCodeExConstructor,errorNumber);
- socketExClass = (*env)->FindClass (env, "java/net/SocketException");
- if (!socketExClass) {
- return;
- }
- socketExConstructor = (*env)->GetMethodID(env,socketExClass,"<init>","(Ljava/lang/String;)V");
- if (!socketExConstructor) {
- return;
- }
- socketEx = (*env)->NewObject(env, socketExClass, socketExConstructor, errorMessageString);
- socketExCauseMethod = (*env)->GetMethodID(env,socketExClass,"initCause","(Ljava/lang/Throwable;)Ljava/lang/Throwable;");
- (*env)->CallObjectMethod(env,socketEx,socketExCauseMethod,errorCodeEx);
- (*env)->Throw(env,socketEx);
+ errorCodeExClass = (*env)->FindClass (env, "org/apache/harmony/luni/util/ErrorCodeException");
+ if (!errorCodeExClass){
+ return;
+ }
+ errorCodeExConstructor = (*env)->GetMethodID(env,errorCodeExClass,"<init>","(I)V");
+ if (!errorCodeExConstructor){
+ return;
+ }
+ errorCodeEx = (*env)->NewObject(env, errorCodeExClass,errorCodeExConstructor,errorNumber);
+ socketExClass = (*env)->FindClass (env, "java/net/SocketException");
+ if (!socketExClass) {
+ return;
+ }
+ socketExConstructor = (*env)->GetMethodID(env,socketExClass,"<init>","(Ljava/lang/String;)V");
+ if (!socketExConstructor) {
+ return;
+ }
+ socketEx = (*env)->NewObject(env, socketExClass, socketExConstructor, errorMessageString);
+ socketExCauseMethod = (*env)->GetMethodID(env,socketExClass,"initCause","(Ljava/lang/Throwable;)Ljava/lang/Throwable;");
+ (*env)->CallObjectMethod(env,socketEx,socketExCauseMethod,errorCodeEx);
+ (*env)->Throw(env,socketEx);
}
throwNewExceptionByName(env, "java/net/SocketException", errorMessage);
}
Modified: harmony/enhanced/classlib/branches/java6/modules/luni/src/main/native/luni/unix/OSNetworkSystemLinux.c
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/luni/src/main/native/luni/unix/OSNetworkSystemLinux.c?rev=609928&r1=609927&r2=609928&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/luni/src/main/native/luni/unix/OSNetworkSystemLinux.c (original)
+++ harmony/enhanced/classlib/branches/java6/modules/luni/src/main/native/luni/unix/OSNetworkSystemLinux.c Tue Jan 8 02:55:24 2008
@@ -267,7 +267,8 @@
hysocketP = getJavaIoFileDescriptorContentsAsAPointer (env, gotFD);
(*env)->DeleteLocalRef(env, gotFD);
- my_pollfds[val].fd = hysocketP->sock;
+ /* hysocketP is -1 if the socket is closed */
+ my_pollfds[val].fd = hysocketP == -1 ? -1 : hysocketP->sock;
my_pollfds[val].events = POLLIN | POLLPRI;
my_pollfds[val].revents = 0;
}
@@ -277,7 +278,8 @@
hysocketP = getJavaIoFileDescriptorContentsAsAPointer (env, gotFD);
(*env)->DeleteLocalRef(env, gotFD);
- my_pollfds[countReadC + val].fd = hysocketP->sock;
+ /* hysocketP is -1 if the socket is closed */
+ my_pollfds[countReadC + val].fd = hysocketP == -1 ? -1 : hysocketP->sock;
my_pollfds[countReadC + val].events = POLLOUT;
my_pollfds[countReadC + val].revents = 0;
}
Modified: harmony/enhanced/classlib/branches/java6/modules/luni/src/main/native/luni/windows/makefile
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/luni/src/main/native/luni/windows/makefile?rev=609928&r1=609927&r2=609928&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/luni/src/main/native/luni/windows/makefile (original)
+++ harmony/enhanced/classlib/branches/java6/modules/luni/src/main/native/luni/windows/makefile Tue Jan 8 02:55:24 2008
@@ -53,6 +53,6 @@
$(LIBPATH)hyfdlibm$(HY_LINKLIB_SUFFIX) $(LIBPATH)vmi$(HY_LINKLIB_SUFFIX)
DLLBASE=0x13200000
-COMMENT=/comment:"LUNI component native code. (c) Copyright 1991, 2005 The Apache Software Foundation or its licensors, as applicable."
+COMMENT=/comment:"LUNI component native code. (c) Copyright 1991, 2007 The Apache Software Foundation or its licensors, as applicable."
!include <$(HY_HDK)\build\make\rules.mak>
Modified: harmony/enhanced/classlib/branches/java6/modules/luni/src/test/api/common/tests/api/java/io/DataInputStreamTest.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/luni/src/test/api/common/tests/api/java/io/DataInputStreamTest.java?rev=609928&r1=609927&r2=609928&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/luni/src/test/api/common/tests/api/java/io/DataInputStreamTest.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/luni/src/test/api/common/tests/api/java/io/DataInputStreamTest.java Tue Jan 8 02:55:24 2008
@@ -18,6 +18,7 @@
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
+import java.io.DataInput;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.EOFException;
@@ -540,6 +541,67 @@
assertTrue("Incorrect string read", dis.readUTF().equals(unihw));
}
+ static class TestDataInputStream implements DataInput {
+ public boolean readBoolean() throws IOException {
+ return false;
+ }
+
+ public byte readByte() throws IOException {
+ return (byte) 0;
+ }
+
+ public char readChar() throws IOException {
+ return (char) 0;
+ }
+
+ public double readDouble() throws IOException {
+ return 0.0;
+ }
+
+ public float readFloat() throws IOException {
+ return (float) 0.0;
+ }
+
+ public void readFully(byte[] buffer) throws IOException {
+ }
+
+ public void readFully(byte[] buffer, int offset, int count)
+ throws IOException {
+ }
+
+ public int readInt() throws IOException {
+ return 0;
+ }
+
+ public String readLine() throws IOException {
+ return null;
+ }
+
+ public long readLong() throws IOException {
+ return (long) 0;
+ }
+
+ public short readShort() throws IOException {
+ return (short) 0;
+ }
+
+ public int readUnsignedByte() throws IOException {
+ return 0;
+ }
+
+ public int readUnsignedShort() throws IOException {
+ return 0;
+ }
+
+ public String readUTF() throws IOException {
+ return DataInputStream.readUTF(this);
+ }
+
+ public int skipBytes(int count) throws IOException {
+ return 0;
+ }
+ }
+
/**
* @tests java.io.DataInputStream#readUTF(java.io.DataInput)
*/
@@ -553,6 +615,9 @@
dis.available() == unihw.length() + 2);
assertTrue("Incorrect string read", DataInputStream.readUTF(dis)
.equals(unihw));
+
+ // Regression test for HARMONY-5336
+ new TestDataInputStream().readUTF();
}
/**
Modified: harmony/enhanced/classlib/branches/java6/modules/luni/src/test/api/common/tests/api/java/io/FileOutputStreamTest.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/luni/src/test/api/common/tests/api/java/io/FileOutputStreamTest.java?rev=609928&r1=609927&r2=609928&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/luni/src/test/api/common/tests/api/java/io/FileOutputStreamTest.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/luni/src/test/api/common/tests/api/java/io/FileOutputStreamTest.java Tue Jan 8 02:55:24 2008
@@ -229,7 +229,7 @@
tmpfile.deleteOnExit();
FileOutputStream fos = new FileOutputStream(tmpfile);
byte[] b = new byte[10];
- for (int i = 10; i < b.length; i++) {
+ for (int i = 0; i < b.length; i++) {
b[i] = (byte) i;
}
fos.write(b);
Modified: harmony/enhanced/classlib/branches/java6/modules/luni/src/test/api/common/tests/api/java/io/ObjectInputStreamTest.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/luni/src/test/api/common/tests/api/java/io/ObjectInputStreamTest.java?rev=609928&r1=609927&r2=609928&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/luni/src/test/api/common/tests/api/java/io/ObjectInputStreamTest.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/luni/src/test/api/common/tests/api/java/io/ObjectInputStreamTest.java Tue Jan 8 02:55:24 2008
@@ -20,6 +20,7 @@
import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
+import java.io.Externalizable;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
@@ -27,8 +28,10 @@
import java.io.InputStream;
import java.io.InvalidObjectException;
import java.io.NotActiveException;
+import java.io.ObjectInput;
import java.io.ObjectInputStream;
import java.io.ObjectInputValidation;
+import java.io.ObjectOutput;
import java.io.ObjectOutputStream;
import java.io.ObjectStreamClass;
import java.io.OutputStream;
@@ -1034,6 +1037,57 @@
testArray = (TestArray) oin.readObject();
Integer[] integers = new Integer[] { 10, 20 };
assertTrue(java.util.Arrays.equals(integers, testArray.array));
+ }
+
+ public static class TestExtObject implements Externalizable {
+ public void writeExternal(ObjectOutput out) throws IOException {
+ out.writeInt(10);
+ }
+
+ public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+ in.readInt();
+ }
+ }
+
+ static class TestObjectOutputStream extends ObjectOutputStream {
+ private ObjectStreamClass[] objs;
+ private int pos = 0;
+
+ public TestObjectOutputStream(OutputStream out, ObjectStreamClass[] objs) throws IOException {
+ super(out);
+ this.objs = objs;
+ }
+
+ protected void writeClassDescriptor(ObjectStreamClass osc) throws IOException {
+ objs[pos++] = osc; }
+ }
+
+ static class TestObjectInputStream extends ObjectInputStream {
+ private ObjectStreamClass[] objs;
+ private int pos = 0;
+
+ public TestObjectInputStream(InputStream in, ObjectStreamClass[] objs) throws IOException {
+ super(in);
+ this.objs = objs;
+ }
+
+ protected ObjectStreamClass readClassDescriptor() throws IOException, ClassNotFoundException {
+ return (ObjectStreamClass) objs[pos++];
+ }
+ }
+
+ // Regression test for HARMONY-4996
+ public void test_readObject_replacedClassDescriptor() throws Exception {
+ ObjectStreamClass[] objs = new ObjectStreamClass[1000];
+ PipedOutputStream pout = new PipedOutputStream();
+ PipedInputStream pin = new PipedInputStream(pout);
+ ObjectOutputStream oout = new TestObjectOutputStream(pout, objs);
+ oout.writeObject(new TestExtObject());
+ oout.writeObject("test");
+ oout.close();
+ ObjectInputStream oin = new TestObjectInputStream(pin, objs);
+ oin.readObject();
+ oin.readObject();
}
/**
Modified: harmony/enhanced/classlib/branches/java6/modules/luni/src/test/api/windows/org/apache/harmony/luni/tests/java/io/WinFileTest.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/luni/src/test/api/windows/org/apache/harmony/luni/tests/java/io/WinFileTest.java?rev=609928&r1=609927&r2=609928&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/luni/src/test/api/windows/org/apache/harmony/luni/tests/java/io/WinFileTest.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/luni/src/test/api/windows/org/apache/harmony/luni/tests/java/io/WinFileTest.java Tue Jan 8 02:55:24 2008
@@ -120,19 +120,16 @@
f = new File(folder, FILENAME);
assertEquals("Invalid file name", FILENAME, f.getName());
- if (f.exists()) {
- byte tmp[] = new byte[256];
- String wasRed;
- int n;
+ assertTrue("File does not exist", f.exists());
+ byte tmp[] = new byte[256];
+ String wasRed;
+ int n;
- fis = new FileInputStream(f);
- n = fis.read(tmp);
- fis.close();
- wasRed = new String(tmp, 0, n, CNTNT_CHARSET);
- assertEquals("Invalid content was red", CONTENT, wasRed);
- } else {
- fail("File does not exist");
- }
+ fis = new FileInputStream(f);
+ n = fis.read(tmp);
+ fis.close();
+ wasRed = new String(tmp, 0, n, CNTNT_CHARSET);
+ assertEquals("Invalid content was red", CONTENT, wasRed);
}
Modified: harmony/enhanced/classlib/branches/java6/modules/nio/src/main/java/common/org/apache/harmony/nio/internal/SelectorImpl.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/nio/src/main/java/common/org/apache/harmony/nio/internal/SelectorImpl.java?rev=609928&r1=609927&r2=609928&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/nio/src/main/java/common/org/apache/harmony/nio/internal/SelectorImpl.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/nio/src/main/java/common/org/apache/harmony/nio/internal/SelectorImpl.java Tue Jan 8 02:55:24 2008
@@ -359,8 +359,14 @@
*/
void modKey(SelectionKey sk) {
// TODO: update indexes rather than recreate the key
- delKey(sk);
- addKey(sk);
+ synchronized (this) {
+ synchronized (keysSet) {
+ synchronized (selectedKeys) {
+ delKey(sk);
+ addKey(sk);
+ }
+ }
+ }
}
/**
@@ -578,6 +584,9 @@
return unaddableSelectedKeys;
}
+ /*
+ * Assumes calling thread holds locks on 'this', 'keysSet', and 'selectedKeys'.
+ */
private void doCancel() {
Set<SelectionKey> cancelledKeys = cancelledKeys();
synchronized (cancelledKeys) {
Modified: harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/AttrDefinitionBands.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/AttrDefinitionBands.java?rev=609928&r1=609927&r2=609928&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/AttrDefinitionBands.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/AttrDefinitionBands.java Tue Jan 8 02:55:24 2008
@@ -18,7 +18,6 @@
import java.io.IOException;
import java.io.InputStream;
-import java.io.OutputStream;
/**
*
@@ -41,14 +40,6 @@
}
/* (non-Javadoc)
- * @see org.apache.harmony.pack200.BandSet#pack(java.io.OutputStream)
- */
- public void pack(OutputStream outputStream) {
- // TODO Auto-generated method stub
-
- }
-
- /* (non-Javadoc)
* @see org.apache.harmony.pack200.BandSet#unpack(java.io.InputStream)
*/
public void unpack(InputStream in) throws IOException,
@@ -73,9 +64,11 @@
if(index == -1) {
index = overflowIndex++;
}
- attributeDefinitionMap.add(new AttributeLayout(
+ AttributeLayout layout = new AttributeLayout(
attributeDefinitionName[i], context,
- attributeDefinitionLayout[i], index));
+ attributeDefinitionLayout[i], index, false);
+ NewAttributeBands newBands = new NewAttributeBands(segment, layout);
+ attributeDefinitionMap.add(layout, newBands);
}
attributeDefinitionMap.checkMap();
}
Modified: harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/AttributeLayout.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/AttributeLayout.java?rev=609928&r1=609927&r2=609928&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/AttributeLayout.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/AttributeLayout.java Tue Jan 8 02:55:24 2008
@@ -98,28 +98,46 @@
private long mask;
private String name;
+ private boolean isDefault;
+ private int backwardsCallCount;
+
+ /**
+ * Construct a default AttributeLayout
+ * (equivalent to <code>new AttributeLayout(name, context, layout, index, true);</code>)
+ * @param name
+ * @param context
+ * @param layout
+ * @param index
+ * @throws Pack200Exception
+ */
public AttributeLayout(String name, int context, String layout, int index)
throws Pack200Exception {
- super();
+ this(name, context, layout, index, true);
+ }
+
+ public AttributeLayout(String name, int context, String layout, int index,
+ boolean isDefault) throws Pack200Exception {
+ super();
this.index = index;
this.context = context;
- if (index >= 0) {
- this.mask = 1L << index;
- } else {
- this.mask = 0;
- }
+ if (index >= 0) {
+ this.mask = 1L << index;
+ } else {
+ this.mask = 0;
+ }
if (context != CONTEXT_CLASS && context != CONTEXT_CODE
&& context != CONTEXT_FIELD && context != CONTEXT_METHOD)
throw new Pack200Exception("Attribute context out of range: "
+ context);
- if (layout == null) // || layout.length() == 0)
- throw new Pack200Exception("Cannot have a null layout");
+ if (layout == null) // || layout.length() == 0)
+ throw new Pack200Exception("Cannot have a null layout");
if (name == null || name.length() == 0)
- throw new Pack200Exception("Cannot have an unnamed layout");
+ throw new Pack200Exception("Cannot have an unnamed layout");
this.name = name;
- this.layout = layout;
- }
+ this.layout = layout;
+ this.isDefault = isDefault;
+ }
public boolean equals(Object obj) {
@@ -243,18 +261,19 @@
public int numBackwardsCallables() {
if(layout == "*") {
- return 1; // TODO: complicated attributes (shouldn't be *'s at all...)
- }
- int num = 0;
- String[] split = layout.split("\\(");
- if(split.length > 0) {
- for (int i = 1; i < split.length; i++) {
- if(split[i].startsWith("-") || split[i].startsWith("0")) {
- num++;
- }
- }
+ return 1;
+ } else {
+ return backwardsCallCount;
}
- return num;
+ }
+
+
+ public boolean isDefaultLayout() {
+ return isDefault;
+ }
+
+ public void setBackwardsCallCount(int backwardsCallCount) {
+ this.backwardsCallCount = backwardsCallCount;
}
}
Modified: harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/AttributeLayoutMap.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/AttributeLayoutMap.java?rev=609928&r1=609927&r2=609928&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/AttributeLayoutMap.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/AttributeLayoutMap.java Tue Jan 8 02:55:24 2008
@@ -198,6 +198,8 @@
// the value of their context constants (AttributeLayout.CONTEXT_CLASS etc.)
private final Map[] layouts = new Map[] {classLayouts, fieldLayouts, methodLayouts, codeLayouts};
+ private final Map layoutsToBands = new HashMap();
+
public AttributeLayoutMap() throws Pack200Exception {
AttributeLayout[] defaultAttributeLayouts = getDefaultAttributeLayouts();
for (int i = 0; i < defaultAttributeLayouts.length; i++) {
@@ -208,6 +210,13 @@
public void add(AttributeLayout layout) {
layouts[layout.getContext()].put(new Integer(layout.getIndex()), layout);
}
+
+
+
+ public void add(AttributeLayout layout, NewAttributeBands newBands) {
+ add(layout);
+ layoutsToBands.put(layout, newBands);
+ }
public AttributeLayout getAttributeLayout(String name, int context)
throws Pack200Exception {
@@ -257,6 +266,10 @@
}
}
}
+ }
+
+ public NewAttributeBands getAttributeBands(AttributeLayout layout) {
+ return (NewAttributeBands) layoutsToBands.get(layout);
}
}
Modified: harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/BandSet.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/BandSet.java?rev=609928&r1=609927&r2=609928&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/BandSet.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/BandSet.java Tue Jan 8 02:55:24 2008
@@ -19,20 +19,24 @@
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
-import java.io.OutputStream;
+import org.apache.harmony.pack200.bytecode.CPClass;
import org.apache.harmony.pack200.bytecode.CPDouble;
+import org.apache.harmony.pack200.bytecode.CPFieldRef;
import org.apache.harmony.pack200.bytecode.CPFloat;
import org.apache.harmony.pack200.bytecode.CPInteger;
+import org.apache.harmony.pack200.bytecode.CPInterfaceMethodRef;
import org.apache.harmony.pack200.bytecode.CPLong;
+import org.apache.harmony.pack200.bytecode.CPMethodRef;
+import org.apache.harmony.pack200.bytecode.CPNameAndType;
+import org.apache.harmony.pack200.bytecode.CPString;
import org.apache.harmony.pack200.bytecode.CPUTF8;
+import org.apache.harmony.pack200.bytecode.ClassConstantPool;
public abstract class BandSet {
public abstract void unpack(InputStream inputStream) throws IOException, Pack200Exception;
- public abstract void pack(OutputStream outputStream);
-
protected Segment segment;
protected SegmentHeader header;
@@ -451,7 +455,7 @@
if (index < 0 || index >= reference.length)
throw new Pack200Exception(
"Something has gone wrong during parsing references, index = " + index + ", array size = " + reference.length);
- result[i1] = new CPUTF8(reference[index]);
+ result[i1] = new CPUTF8(reference[index], ClassConstantPool.DOMAIN_UNDEFINED);
}
return result;
}
@@ -472,7 +476,7 @@
if (index < 0 || index >= reference.length)
throw new Pack200Exception(
"Something has gone wrong during parsing references, index = " + index + ", array size = " + reference.length);
- result1[i1] = new CPUTF8(reference[index]);
+ result1[i1] = new CPUTF8(reference[index], ClassConstantPool.DOMAIN_UNDEFINED);
}
CPUTF8[] refs = result1;
int pos = 0;
@@ -481,6 +485,107 @@
result[i] = new CPUTF8[num];
System.arraycopy(refs, pos, result[i], 0, num);
pos += num;
+ }
+ return result;
+ }
+
+ public CPString[] parseCPStringReferences(String name, InputStream in, BHSDCodec codec, int count) throws IOException, Pack200Exception {
+ String[] reference = segment.getCpBands().getCpString();
+ int[] indices = decodeBandInt(name, in, codec, count, reference.length - 1);
+ CPString[] result = new CPString[indices.length];
+ for (int i1 = 0; i1 < count; i1++) {
+ int index = indices[i1];
+ if (index < 0 || index >= reference.length)
+ throw new Pack200Exception(
+ "Something has gone wrong during parsing references, index = " + index + ", array size = " + reference.length);
+ result[i1] = new CPString(reference[index]);
+ }
+ return result;
+ }
+
+ public CPInterfaceMethodRef[] parseCPInterfaceMethodRefReferences(String name, InputStream in, BHSDCodec codec, int count) throws IOException, Pack200Exception {
+ String[] reference = segment.getCpBands().getCpIMethodClass();
+ String[] descriptors = segment.getCpBands().getCpIMethodDescriptor();
+ int[] indices = decodeBandInt(name, in, codec, count, reference.length - 1);
+ CPInterfaceMethodRef[] result = new CPInterfaceMethodRef[indices.length];
+ for (int i1 = 0; i1 < count; i1++) {
+ int index = indices[i1];
+ if (index < 0 || index >= reference.length)
+ throw new Pack200Exception(
+ "Something has gone wrong during parsing references, index = " + index + ", array size = " + reference.length);
+ result[i1] = new CPInterfaceMethodRef(reference[index], descriptors[index]);
+ }
+ return result;
+ }
+
+ public CPMethodRef[] parseCPMethodRefReferences(String name, InputStream in, BHSDCodec codec, int count) throws IOException, Pack200Exception {
+ String[] reference = segment.getCpBands().getCpMethodClass();
+ String[] descriptors = segment.getCpBands().getCpMethodDescriptor();
+ int[] indices = decodeBandInt(name, in, codec, count, reference.length - 1);
+ CPMethodRef[] result = new CPMethodRef[indices.length];
+ for (int i1 = 0; i1 < count; i1++) {
+ int index = indices[i1];
+ if (index < 0 || index >= reference.length)
+ throw new Pack200Exception(
+ "Something has gone wrong during parsing references, index = " + index + ", array size = " + reference.length);
+ result[i1] = new CPMethodRef(reference[index], descriptors[index]);
+ }
+ return result;
+ }
+
+ public CPFieldRef[] parseCPFieldRefReferences(String name, InputStream in, BHSDCodec codec, int count) throws IOException, Pack200Exception {
+ String[] reference = segment.getCpBands().getCpFieldClass();
+ String[] descriptors = segment.getCpBands().getCpFieldDescriptor();
+ int[] indices = decodeBandInt(name, in, codec, count, reference.length - 1);
+ CPFieldRef[] result = new CPFieldRef[indices.length];
+ for (int i1 = 0; i1 < count; i1++) {
+ int index = indices[i1];
+ if (index < 0 || index >= reference.length)
+ throw new Pack200Exception(
+ "Something has gone wrong during parsing references, index = " + index + ", array size = " + reference.length);
+ result[i1] = new CPFieldRef(reference[index], descriptors[index]);
+ }
+ return result;
+ }
+
+ public CPNameAndType[] parseCPDescriptorReferences(String name, InputStream in, BHSDCodec codec, int count) throws IOException, Pack200Exception {
+ String[] reference = segment.getCpBands().getCpDescriptor();
+ int[] indices = decodeBandInt(name, in, codec, count, reference.length - 1);
+ CPNameAndType[] result = new CPNameAndType[indices.length];
+ for (int i1 = 0; i1 < count; i1++) {
+ int index = indices[i1];
+ if (index < 0 || index >= reference.length)
+ throw new Pack200Exception(
+ "Something has gone wrong during parsing references, index = " + index + ", array size = " + reference.length);
+ result[i1] = new CPNameAndType(reference[index]);
+ }
+ return result;
+ }
+
+ public CPUTF8[] parseCPSignatureReferences(String name, InputStream in, BHSDCodec codec, int count) throws IOException, Pack200Exception {
+ String[] reference = segment.getCpBands().getCpSignature();
+ int[] indices = decodeBandInt(name, in, codec, count, reference.length - 1);
+ CPUTF8[] result = new CPUTF8[indices.length];
+ for (int i1 = 0; i1 < count; i1++) {
+ int index = indices[i1];
+ if (index < 0 || index >= reference.length)
+ throw new Pack200Exception(
+ "Something has gone wrong during parsing references, index = " + index + ", array size = " + reference.length);
+ result[i1] = new CPUTF8(reference[index], ClassConstantPool.DOMAIN_UNDEFINED);
+ }
+ return result;
+ }
+
+ public CPClass[] parseCPClassReferences(String name, InputStream in, BHSDCodec codec, int count) throws IOException, Pack200Exception {
+ String[] reference = segment.getCpBands().getCpClass();
+ int[] indices = decodeBandInt(name, in, codec, count, reference.length - 1);
+ CPClass[] result = new CPClass[indices.length];
+ for (int i1 = 0; i1 < count; i1++) {
+ int index = indices[i1];
+ if (index < 0 || index >= reference.length)
+ throw new Pack200Exception(
+ "Something has gone wrong during parsing references, index = " + index + ", array size = " + reference.length);
+ result[i1] = new CPClass(reference[index]);
}
return result;
}
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=609928&r1=609927&r2=609928&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 Tue Jan 8 02:55:24 2008
@@ -19,14 +19,13 @@
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
-import java.io.OutputStream;
import java.util.ArrayList;
+import java.util.List;
import org.apache.harmony.pack200.bytecode.Attribute;
import org.apache.harmony.pack200.bytecode.BCIRenumberedAttribute;
import org.apache.harmony.pack200.bytecode.ByteCode;
import org.apache.harmony.pack200.bytecode.CodeAttribute;
-import org.apache.harmony.pack200.bytecode.LineNumberTableAttribute;
import org.apache.harmony.pack200.bytecode.OperandManager;
/**
@@ -40,7 +39,7 @@
// The bands
// TODO: Haven't resolved references yet. Do we want to?
private int[] bcCaseCount;
- private int[][] bcCaseValue;
+ private int[] bcCaseValue;
private int[] bcByte;
private int[] bcLocal;
private int[] bcShort;
@@ -72,14 +71,6 @@
}
/* (non-Javadoc)
- * @see org.apache.harmony.pack200.BandSet#pack(java.io.OutputStream)
- */
- public void pack(OutputStream outputStream) {
- // TODO Auto-generated method stub
-
- }
-
- /* (non-Javadoc)
* @see org.apache.harmony.pack200.BandSet#unpack(java.io.InputStream)
*/
public void unpack(InputStream in) throws IOException,
@@ -126,6 +117,9 @@
AttributeLayout.CONTEXT_METHOD);
methodByteCodePacked = new byte[classCount][][];
int bcParsed = 0;
+
+ List switchIsTableSwitch = new ArrayList();
+ List wideByteCodes = new ArrayList();
for (int c = 0; c < classCount; c++) {
int numberOfMethods = methodFlags[c].length;
methodByteCodePacked[c] = new byte[numberOfMethods][];
@@ -200,7 +194,12 @@
bcLabelCount++;
break;
case 170: // tableswitch
+ switchIsTableSwitch.add(new Boolean(true));
+ bcCaseCountCount++;
+ bcLabelCount++;
+ break;
case 171: // lookupswitch
+ switchIsTableSwitch.add(new Boolean(false));
bcCaseCountCount++;
bcLabelCount++;
break;
@@ -260,6 +259,7 @@
break;
case 196: // wide
int nextInstruction = 0xff & methodByteCodePacked[c][m][i+1];
+ wideByteCodes.add(new Integer(nextInstruction));
if (nextInstruction == 132) { // iinc
bcLocalCount += 2;
bcShortCount++;
@@ -299,7 +299,22 @@
// other bytecode bands
debug("Parsed *bc_codes (" + bcParsed + ")");
bcCaseCount = decodeBandInt("bc_case_count", in, Codec.UNSIGNED5, bcCaseCountCount);
- bcCaseValue = decodeBandInt("bc_case_value", in, Codec.DELTA5, bcCaseCount);
+ int bcCaseValueCount = 0;
+ for (int i = 0; i < bcCaseCount.length; i++) {
+ boolean isTableSwitch = ((Boolean)switchIsTableSwitch.get(i)).booleanValue();
+ if(isTableSwitch) {
+ bcCaseValueCount += 1;
+ } else {
+ bcCaseValueCount += bcCaseCount[i];
+ }
+ }
+ bcCaseValue = decodeBandInt("bc_case_value", in, Codec.DELTA5, bcCaseValueCount );
+ // Every case value needs a label. We weren't able to count these
+ // above, because we didn't know how many cases there were.
+ // Have to correct it now.
+ for(int index=0; index < bcCaseCountCount; index++) {
+ bcLabelCount += bcCaseCount[index];
+ }
bcByte = decodeBandInt("bc_byte", in, Codec.BYTE1, bcByteCount);
bcShort = decodeBandInt("bc_short", in, Codec.DELTA5, bcShortCount);
bcLocal = decodeBandInt("bc_local", in, Codec.UNSIGNED5, bcLocalCount);
@@ -337,11 +352,15 @@
bcEscSize = decodeBandInt("bc_escsize", in, Codec.UNSIGNED5, bcEscCount);
bcEscByte = decodeBandInt("bc_escbyte", in, Codec.BYTE1, bcEscSize);
- OperandManager operandManager = new OperandManager(bcByte, bcShort,
- bcLocal, bcLabel, bcIntRef, bcFloatRef, bcLongRef, bcDoubleRef,
- bcStringRef, bcClassRef, bcFieldRef, bcMethodRef, bcIMethodRef,
- bcThisField, bcSuperField, bcThisMethod, bcSuperMethod,
- bcInitRef);
+ int[] wideByteCodeArray = new int[wideByteCodes.size()];
+ for(int index=0; index < wideByteCodeArray.length; index++) {
+ wideByteCodeArray[index] = ((Integer)wideByteCodes.get(index)).intValue();
+ }
+ OperandManager operandManager = new OperandManager(bcCaseCount, bcCaseValue,
+ bcByte, bcShort, bcLocal, bcLabel, bcIntRef, bcFloatRef, bcLongRef,
+ bcDoubleRef, bcStringRef, bcClassRef, bcFieldRef, bcMethodRef,
+ bcIMethodRef, bcThisField, bcSuperField, bcThisMethod, bcSuperMethod,
+ bcInitRef, wideByteCodeArray);
operandManager.setSegment(segment);
int i = 0;
@@ -357,26 +376,19 @@
if (!staticModifier.matches(methodFlag))
maxLocal++; // one for 'this' parameter
maxLocal += SegmentUtils.countArgs(methodDescr[c][m]);
- // TODO Move creation of code attribute until after constant
- // pool resolved
operandManager.setCurrentClass(segment.getClassBands().getClassThis()[c]);
operandManager.setSuperClass(segment.getClassBands().getClassSuper()[c]);
- CodeAttribute attr = new CodeAttribute(maxStack, maxLocal,
+ CodeAttribute codeAttr = new CodeAttribute(maxStack, maxLocal,
methodByteCodePacked[c][m], segment, operandManager);
- methodAttributes[c][m].add(attr);
+ methodAttributes[c][m].add(codeAttr);
// Should I add all the attributes in here?
ArrayList currentAttributes = (ArrayList)orderedCodeAttributes.get(i);
for(int index=0;index < currentAttributes.size(); index++) {
Attribute currentAttribute = (Attribute)currentAttributes.get(index);
- // TODO: The line below adds the LocalVariableTable
- // and LineNumber attributes. Currently things are
- // broken because these tables don't get renumbered
- // properly. Commenting out the add so the class files
- // will verify.
- //attr.attributes.add(currentAttribute);
+ codeAttr.addAttribute(currentAttribute);
// Fix up the line numbers if needed
if(currentAttribute.hasBCIRenumbering()) {
- ((BCIRenumberedAttribute)currentAttribute).renumber(attr.byteCodeOffsets);
+ ((BCIRenumberedAttribute)currentAttribute).renumber(codeAttr.byteCodeOffsets);
}
}
i++;
@@ -407,7 +419,7 @@
return bcCaseCount;
}
- public int[][] getBcCaseValue() {
+ public int[] getBcCaseValue() {
return bcCaseValue;
}
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=609928&r1=609927&r2=609928&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 Tue Jan 8 02:55:24 2008
@@ -18,15 +18,18 @@
import java.io.IOException;
import java.io.InputStream;
-import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Iterator;
+import java.util.List;
import org.apache.harmony.pack200.IcBands.ICTuple;
import org.apache.harmony.pack200.bytecode.Attribute;
import org.apache.harmony.pack200.bytecode.CPClass;
+import org.apache.harmony.pack200.bytecode.CPNameAndType;
import org.apache.harmony.pack200.bytecode.CPUTF8;
+import org.apache.harmony.pack200.bytecode.ClassConstantPool;
import org.apache.harmony.pack200.bytecode.ConstantValueAttribute;
+import org.apache.harmony.pack200.bytecode.EnclosingMethodAttribute;
import org.apache.harmony.pack200.bytecode.ExceptionsAttribute;
import org.apache.harmony.pack200.bytecode.LineNumberTableAttribute;
import org.apache.harmony.pack200.bytecode.LocalVariableTableAttribute;
@@ -35,7 +38,7 @@
import org.apache.harmony.pack200.bytecode.SourceFileAttribute;
/**
- *
+ * Pack200 Class Bands
*/
public class ClassBands extends BandSet {
@@ -105,16 +108,6 @@
/*
* (non-Javadoc)
*
- * @see org.apache.harmony.pack200.BandSet#pack(java.io.OutputStream)
- */
- public void pack(OutputStream outputStream) {
- // TODO Auto-generated method stub
-
- }
-
- /*
- * (non-Javadoc)
- *
* @see org.apache.harmony.pack200.BandSet#unpack(java.io.InputStream)
*/
public void unpack(InputStream in) throws IOException, Pack200Exception {
@@ -142,6 +135,10 @@
Pack200Exception {
fieldDescr = parseReferences("field_descr", in, Codec.DELTA5,
classFieldCount, cpBands.getCpDescriptor());
+ parseFieldAttrBands(in);
+ }
+
+ private void parseFieldAttrBands(InputStream in) throws IOException, Pack200Exception {
fieldFlags = parseFlags("field_flags", in, classFieldCount,
Codec.UNSIGNED5, options.hasFieldFlagsHi());
int fieldAttrCount = SegmentUtils.countBit16(fieldFlags);
@@ -153,6 +150,15 @@
AttributeLayout.CONTEXT_FIELD);
int[] fieldAttrCalls = decodeBandInt("field_attr_calls", in,
Codec.UNSIGNED5, callCount);
+
+ // Assign empty field attributes
+ fieldAttributes = new ArrayList[classCount][];
+ for (int i = 0; i < classCount; i++) {
+ fieldAttributes[i] = new ArrayList[fieldFlags[i].length];
+ for (int j = 0; j < fieldFlags[i].length; j++) {
+ fieldAttributes[i][j] = new ArrayList();
+ }
+ }
AttributeLayout constantValueLayout = attrMap.getAttributeLayout(
"ConstantValue", AttributeLayout.CONTEXT_FIELD);
@@ -171,11 +177,38 @@
Codec.UNSIGNED5, signatureCount);
int signatureIndex = 0;
- fieldAttributes = new ArrayList[classCount][];
+ 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;
+ }
+ }
+ }
+
for (int i = 0; i < classCount; i++) {
- fieldAttributes[i] = new ArrayList[fieldFlags[i].length];
for (int j = 0; j < fieldFlags[i].length; j++) {
- fieldAttributes[i][j] = new ArrayList();
long flag = fieldFlags[i][j];
if (constantValueLayout.matches(flag)) {
// we've got a value to read
@@ -199,25 +232,33 @@
int colon = desc.indexOf(':');
String type = desc.substring(colon + 1);
CPUTF8 value = new CPUTF8((String) signatureLayout.getValue(result, type,
- cpBands.getConstantPool()));
+ cpBands.getConstantPool()), ClassConstantPool.DOMAIN_SIGNATUREASCIIZ);
fieldAttributes[i][j]
.add(new SignatureAttribute(value));
signatureIndex++;
}
+ // Non-predefined attributes
+ 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));
+ otherAttributes[k].remove(0);
+ }
+ }
}
}
- parseFieldMetadataBands(in, fieldAttrCalls);
-
- // TODO: Parse other attribute bands
}
private void parseMethodBands(InputStream in) throws IOException,
Pack200Exception {
methodDescr = parseReferences("method_descr", in, Codec.MDELTA5,
- classMethodCount, cpBands.getCpDescriptor());
+ classMethodCount, cpBands.getCpDescriptor());
+ parseMethodAttrBands(in);
+ }
+
+ private void parseMethodAttrBands(InputStream in) throws IOException, Pack200Exception {
methodFlags = parseFlags("method_flags", in, classMethodCount,
Codec.UNSIGNED5, options.hasMethodFlagsHi());
-
int methodAttrCount = SegmentUtils.countBit16(methodFlags);
int[] methodAttrCounts = decodeBandInt("method_attr_count", in,
Codec.UNSIGNED5, methodAttrCount);
@@ -227,7 +268,7 @@
AttributeLayout.CONTEXT_METHOD);
methodAttrCalls = decodeBandInt("code_attr_calls", in, Codec.UNSIGNED5,
callCount);
-
+
// assign empty method attributes
methodAttributes = new ArrayList[classCount][];
for (int i = 0; i < classCount; i++) {
@@ -236,11 +277,98 @@
methodAttributes[i][j] = new ArrayList();
}
}
- parseAttributeMethodExceptions(in);
- parseAttributeMethodSigntaure(in);
- parseMethodMetadataBands(in, methodAttrCalls);
- // TODO: Parse other attribute bands
+ // Parse method exceptions attributes
+ AttributeLayout methodExceptionsLayout = attrMap.getAttributeLayout(AttributeLayout.ATTRIBUTE_EXCEPTIONS,
+ AttributeLayout.CONTEXT_METHOD);
+ int count = SegmentUtils.countMatches(methodFlags, methodExceptionsLayout);
+ int[] numExceptions = decodeBandInt("method_Exceptions_n", in,
+ Codec.UNSIGNED5, count);
+ String[][] methodExceptionsRS = parseReferences("method_Exceptions_RC",
+ in, Codec.UNSIGNED5, numExceptions, cpBands.getCpClass());
+
+ // Parse method signature attributes
+ AttributeLayout methodSignatureLayout = attrMap.getAttributeLayout(
+ AttributeLayout.ATTRIBUTE_SIGNATURE,
+ AttributeLayout.CONTEXT_METHOD);
+ int count1 = SegmentUtils.countMatches(methodFlags, methodSignatureLayout);
+ 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;
+ }
+ }
+ }
+
+ // Add attributes to the attribute arrays
+ int methodExceptionsIndex = 0;
+ int methodSignatureIndex = 0;
+ for (int i = 0; i < methodAttributes.length; i++) {
+ for (int j = 0; j < methodAttributes[i].length; j++) {
+ long flag = methodFlags[i][j];
+ if (methodExceptionsLayout.matches(flag)) {
+ int n = numExceptions[methodExceptionsIndex];
+ String[] exceptions = methodExceptionsRS[methodExceptionsIndex];
+ CPClass[] exceptionClasses = new CPClass[n];
+ for (int k = 0; k < n; k++) {
+ exceptionClasses[k] = new CPClass(exceptions[k]);
+ }
+ methodAttributes[i][j].add(new ExceptionsAttribute(
+ exceptionClasses));
+ methodExceptionsIndex++;
+ }
+ if (methodSignatureLayout.matches(flag)) {
+ // We've got a signature attribute
+ long result = methodSignatureRS[methodSignatureIndex];
+ String desc = methodDescr[i][j];
+ int colon = desc.indexOf(':');
+ String type = desc.substring(colon + 1);
+ // TODO Got to get better at this ... in any case, it should
+ // be e.g. KIB or KIH
+ if (type.equals("B") || type.equals("H"))
+ type = "I";
+ Object value = methodSignatureLayout.getValue(result, type, cpBands
+ .getConstantPool());
+ methodAttributes[i][j]
+ .add(new ConstantValueAttribute(value));
+ methodSignatureIndex++;
+ }
+ // Non-predefined attributes
+ for (int k = 0; k < otherLayouts.length; k++) {
+ if(otherLayouts[k] != null && otherLayouts[k].matches(flag)) {
+ // Add the next attribute
+ methodAttributes[i][j].add(otherAttributes[k].get(0));
+ otherAttributes[k].remove(0);
+ }
+ }
+ }
+ }
}
private int getCallCount(int[][] methodAttrIndexes, long[][] flags,
@@ -269,71 +397,6 @@
return callCount;
}
- private void parseAttributeMethodSigntaure(InputStream in)
- throws IOException, Pack200Exception {
- AttributeLayout layout = attrMap.getAttributeLayout(
- AttributeLayout.ATTRIBUTE_SIGNATURE,
- AttributeLayout.CONTEXT_METHOD);
- int count = SegmentUtils.countMatches(methodFlags, layout);
- long[] methodSignatureRS = decodeBandLong("method_signature_RS", in,
- Codec.UNSIGNED5, count);
- int index = 0;
- for (int i = 0; i < methodAttributes.length; i++) {
- for (int j = 0; j < methodAttributes[i].length; j++) {
- long flag = methodFlags[i][j];
- if (layout.matches(flag)) {
- // we've got a signature attribute
- long result = methodSignatureRS[index];
- String desc = methodDescr[i][j];
- int colon = desc.indexOf(':');
- String type = desc.substring(colon + 1);
- // TODO Got to get better at this ... in any case, it should
- // be e.g. KIB or KIH
- if (type.equals("B") || type.equals("H"))
- type = "I";
- Object value = layout.getValue(result, type, cpBands
- .getConstantPool());
- methodAttributes[i][j]
- .add(new ConstantValueAttribute(value));
- index++;
- }
- }
- }
- }
-
- /**
- * @param in
- * @throws Pack200Exception
- * @throws IOException
- */
- private void parseAttributeMethodExceptions(InputStream in)
- throws Pack200Exception, IOException {
- AttributeLayout layout = attrMap.getAttributeLayout("Exceptions",
- AttributeLayout.CONTEXT_METHOD);
- int count = SegmentUtils.countMatches(methodFlags, layout);
- int[] numExceptions = decodeBandInt("method_Exceptions_n", in,
- Codec.UNSIGNED5, count);
- String[][] methodExceptionsRS = parseReferences("method_Exceptions_RC",
- in, Codec.UNSIGNED5, numExceptions, cpBands.getCpClass());
- int index = 0;
- for (int i = 0; i < classCount; i++) {
- for (int j = 0; j < methodFlags[i].length; j++) {
- long flag = methodFlags[i][j];
- if (layout.matches(flag)) {
- int n = numExceptions[index];
- String[] exceptions = methodExceptionsRS[index];
- CPClass[] exceptionClasses = new CPClass[n];
- for (int k = 0; k < n; k++) {
- exceptionClasses[k] = new CPClass(exceptions[k]);
- }
- methodAttributes[i][j].add(new ExceptionsAttribute(
- exceptionClasses));
- index++;
- }
- }
- }
- }
-
private void parseClassAttrBands(InputStream in) throws IOException,
Pack200Exception {
String[] cpUTF8 = cpBands.getCpUTF8();
@@ -370,10 +433,11 @@
AttributeLayout.CONTEXT_CLASS);
int enclosingMethodCount = SegmentUtils.countMatches(classFlags,
enclosingMethodLayout);
- int[] enclosingMethodRC = decodeBandInt("class_EnclosingMethod_RC", in,
- Codec.UNSIGNED5, enclosingMethodCount);
- int[] enclosingMethodRDN = decodeBandInt("class_EnclosingMethod_RDN",
- in, Codec.UNSIGNED5, enclosingMethodCount);
+ String[] enclosingMethodRC = parseReferences(
+ "class_EnclosingMethod_RC", in, Codec.UNSIGNED5,
+ enclosingMethodCount, cpClass);
+ String[] enclosingMethodRDN = parseReferences(
+ "class_EnclosingMethod_RDN", in, Codec.UNSIGNED5, enclosingMethodCount, cpBands.getCpDescriptor());
AttributeLayout signatureLayout = attrMap.getAttributeLayout(
AttributeLayout.ATTRIBUTE_SIGNATURE,
@@ -383,7 +447,7 @@
int[] classSignature = decodeBandInt("class_Signature_RS", in,
Codec.UNSIGNED5, signatureCount);
- parseClassMetadataBands(in, classAttrCalls);
+ int backwardsCallsUsed = parseClassMetadataBands(in, classAttrCalls);
AttributeLayout innerClassLayout = attrMap.getAttributeLayout(
AttributeLayout.ATTRIBUTE_INNER_CLASSES,
@@ -424,7 +488,34 @@
int defaultVersionMajor = header.getDefaultClassMajorVersion();
int defaultVersionMinor = header.getDefaultClassMinorVersion();
- // TODO: Parse other attribute bands
+
+ // Parse non-predefined attribute bands
+ int backwardsCallIndex = backwardsCallsUsed;
+ int limit = options.hasClassFlagsHi() ? 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_CLASS);
+ if(layout != null && !(layout.isDefaultLayout())) {
+ otherLayouts[i] = layout;
+ counts[i] = SegmentUtils.countMatches(classFlags,
+ 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(classAttrCalls, backwardsCallIndex, backwardsCalls, 0, numBackwardsCallables);
+ bands.setBackwardsCalls(backwardsCalls);
+ backwardsCallIndex+= numBackwardsCallables;
+ }
+ }
+ }
// Now process the attribute bands we have parsed
int sourceFileIndex = 0;
@@ -467,7 +558,10 @@
sourceFileIndex++;
}
if (enclosingMethodLayout.matches(flag)) {
- // long result =
+ CPClass theClass = new CPClass(enclosingMethodRC[enclosingMethodIndex]);
+ CPNameAndType theMethod = new CPNameAndType(enclosingMethodRDN[enclosingMethodIndex]);
+ classAttributes[i].add(new EnclosingMethodAttribute(theClass, theMethod));
+ enclosingMethodIndex++;
}
if (signatureLayout.matches(flag)) {
long result = classSignature[signatureIndex];
@@ -513,6 +607,14 @@
classVersionMajor[i] = defaultVersionMajor;
classVersionMinor[i] = defaultVersionMinor;
}
+ // Non-predefined attributes
+ for (int j = 0; j < otherLayouts.length; j++) {
+ if(otherLayouts[j] != null && otherLayouts[j].matches(flag)) {
+ // Add the next attribute
+ classAttributes[i].add(otherAttributes[j].get(0));
+ otherAttributes[j].remove(0);
+ }
+ }
}
}
@@ -651,6 +753,22 @@
"code_LocalVariableTable_slot", in, Codec.UNSIGNED5,
localVariableTableN);
+ // Fix up localVariableTableTypeRS - for some reason,
+ // native signatures end up in DOMAINNORMALASCIIZ
+ // while nonnatives end up in DOMAINSIGNATUREASCIIZ.
+ // TODO: is this the right thing to do?
+ for(int x=0; x < localVariableTableTypeRS.length; x++) {
+ for(int y=0; y < localVariableTableTypeRS[x].length; y++) {
+ CPUTF8 element = localVariableTableTypeRS[x][y];
+ // TODO: come up with a better test for native vs nonnative signatures?
+ if(element.underlyingString().length() > 2) {
+ element.setDomain(ClassConstantPool.DOMAIN_SIGNATUREASCIIZ);
+ } else {
+ element.setDomain(ClassConstantPool.DOMAIN_NORMALASCIIZ);
+ }
+ }
+ }
+
int lengthLocalVariableTypeTableNBand = SegmentUtils.countMatches(
codeFlags, localVariableTypeTableLayout);
int[] localVariableTypeTableN = decodeBandInt(
@@ -672,6 +790,34 @@
"code_LocalVariableTypeTable_slot", in, Codec.UNSIGNED5,
localVariableTypeTableN);
+ // Parse non-predefined attribute bands
+ int backwardsCallIndex = 0;
+ int limit = options.hasCodeFlagsHi() ? 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_CODE);
+ if(layout != null && !(layout.isDefaultLayout())) {
+ otherLayouts[i] = layout;
+ counts[i] = SegmentUtils.countMatches(codeFlags,
+ 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(codeAttrCalls, backwardsCallIndex, backwardsCalls, 0, numBackwardsCallables);
+ bands.setBackwardsCalls(backwardsCalls);
+ backwardsCallIndex+= numBackwardsCallables;
+ }
+ }
+ }
+
int lineNumberIndex = 0;
int lvtIndex = 0;
int lvttIndex = 0;
@@ -706,8 +852,16 @@
lvttIndex++;
codeAttributes[i].add(lvtta);
}
+ // Non-predefined attributes
+ for (int j = 0; j < otherLayouts.length; j++) {
+ if(otherLayouts[j] != null && otherLayouts[j].matches(codeFlags[i])) {
+ // Add the next attribute
+ codeAttributes[i].add(otherAttributes[j].get(0));
+ otherAttributes[j].remove(0);
+ }
+ }
}
- // TODO: Parse other attribute bands
+
}
private CPUTF8[][] stringsToCPUTF8(String[][] strings) {
@@ -715,7 +869,7 @@
for (int i = 0; i < strings.length; i++) {
cpUTF8s[i] = new CPUTF8[strings[i].length];
for (int j = 0; j < strings[i].length; j++) {
- cpUTF8s[i][j] = new CPUTF8(strings[i][j]);
+ cpUTF8s[i][j] = new CPUTF8(strings[i][j], ClassConstantPool.DOMAIN_NORMALASCIIZ);
}
}
return cpUTF8s;
@@ -726,13 +880,14 @@
private CPUTF8[] stringsToCPUTF8(String[] strings) {
CPUTF8[] cpUTF8s = new CPUTF8[strings.length];
for (int i = 0; i < strings.length; i++) {
- cpUTF8s[i] = new CPUTF8(strings[i]);
+ cpUTF8s[i] = new CPUTF8(strings[i], ClassConstantPool.DOMAIN_UNDEFINED);
}
return cpUTF8s;
}
- private void parseFieldMetadataBands(InputStream in, int[] fieldAttrCalls)
+ private int parseFieldMetadataBands(InputStream in, int[] fieldAttrCalls)
throws Pack200Exception, IOException {
+ int backwardsCallsUsed = 0;
String[] RxA = new String[] { "RVA", "RIA" };
AttributeLayout rvaLayout = attrMap.getAttributeLayout(
@@ -748,11 +903,14 @@
int[] backwardsCalls = new int[] {0, 0};
if(rvaCount > 0) {
backwardsCalls[0] = fieldAttrCalls[0];
+ backwardsCallsUsed++;
if(riaCount > 0) {
backwardsCalls[1] = fieldAttrCalls[1];
+ backwardsCallsUsed++;
}
} else if (riaCount > 0) {
backwardsCalls[1] = fieldAttrCalls[0];
+ backwardsCallsUsed++;
}
MetadataBandGroup[] mb = parseMetadata(in, RxA, RxACount, backwardsCalls, "field");
Iterator rvaAttributesIterator = mb[0].getAttributes().iterator();
@@ -767,6 +925,7 @@
}
}
}
+ return backwardsCallsUsed;
}
private MetadataBandGroup[] parseMetadata(InputStream in, String[] RxA, int[] RxACount,
@@ -867,14 +1026,16 @@
return mbg;
}
- private void parseMethodMetadataBands(InputStream in, int[] methodAttrCalls)
+ private int parseMethodMetadataBands(InputStream in, int[] methodAttrCalls)
throws Pack200Exception, IOException {
+ int backwardsCallsUsed = 0;
String[] RxA = new String[] { "RVA", "RIA", "RVPA", "RIPA", "AD" };
int[] rxaCounts = new int[] { 0, 0, 0, 0, 0 };
int[] backwardsCalls = new int[5];
int methodAttrIndex = 0;
for (int i = 0; i < backwardsCalls.length; i++) {
if(rxaCounts[i] > 0) {
+ backwardsCallsUsed++;
backwardsCalls[i] = methodAttrCalls[methodAttrIndex];
methodAttrIndex++;
} else {
@@ -919,9 +1080,19 @@
}
}
}
+ return backwardsCallsUsed;
}
- private void parseClassMetadataBands(InputStream in, int[] classAttrCalls) throws Pack200Exception, IOException {
+ /**
+ * Parse the class metadata bands and return the number of backwards callables
+ * @param in
+ * @param classAttrCalls
+ * @return
+ * @throws Pack200Exception
+ * @throws IOException
+ */
+ private int parseClassMetadataBands(InputStream in, int[] classAttrCalls) throws Pack200Exception, IOException {
+ int numBackwardsCalls = 0;
String[] RxA = new String[] { "RVA", "RIA" };
AttributeLayout rvaLayout = attrMap.getAttributeLayout(
@@ -935,11 +1106,14 @@
int[] RxACount = new int[] { rvaCount, riaCount };
int[] backwardsCalls = new int[] {0, 0};
if(rvaCount > 0) {
+ numBackwardsCalls++;
backwardsCalls[0] = classAttrCalls[0];
if(riaCount > 0) {
+ numBackwardsCalls++;
backwardsCalls[1] = classAttrCalls[1];
}
} else if (riaCount > 0) {
+ numBackwardsCalls++;
backwardsCalls[1] = classAttrCalls[0];
}
MetadataBandGroup[] mbgs = parseMetadata(in, RxA, RxACount, backwardsCalls, "class");
@@ -953,6 +1127,7 @@
classAttributes[i].add(riaAttributesIterator.next());
}
}
+ return numBackwardsCalls;
}
public int[] getClassFieldCount() {
Modified: harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/CpBands.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/CpBands.java?rev=609928&r1=609927&r2=609928&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/CpBands.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/CpBands.java Tue Jan 8 02:55:24 2008
@@ -18,7 +18,6 @@
import java.io.IOException;
import java.io.InputStream;
-import java.io.OutputStream;
import java.util.ArrayList;
public class CpBands extends BandSet {
@@ -78,10 +77,6 @@
parseCpField(in);
parseCpMethod(in);
parseCpIMethod(in);
- }
-
- public void pack(OutputStream outputStream) {
-
}
/**
Modified: harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/FileBands.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/FileBands.java?rev=609928&r1=609927&r2=609928&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/FileBands.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/FileBands.java Tue Jan 8 02:55:24 2008
@@ -18,7 +18,6 @@
import java.io.IOException;
import java.io.InputStream;
-import java.io.OutputStream;
/**
* Parses the file band headers (not including the actual bits themselves).
@@ -48,14 +47,6 @@
public FileBands(Segment segment) {
super(segment);
this.cpUTF8 = segment.getCpBands().getCpUTF8();
- }
-
- /* (non-Javadoc)
- * @see org.apache.harmony.pack200.BandSet#pack(java.io.OutputStream)
- */
- public void pack(OutputStream outputStream) {
- // TODO Auto-generated method stub
-
}
/* (non-Javadoc)
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=609928&r1=609927&r2=609928&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 Tue Jan 8 02:55:24 2008
@@ -18,7 +18,6 @@
import java.io.IOException;
import java.io.InputStream;
-import java.io.OutputStream;
/**
* Pack200 Inner Class Bands
@@ -47,14 +46,6 @@
super(segment);
this.cpClass = segment.getCpBands().getCpClass();
this.cpUTF8 = segment.getCpBands().getCpUTF8();
- }
-
- /* (non-Javadoc)
- * @see org.apache.harmony.pack200.BandSet#pack(java.io.OutputStream)
- */
- public void pack(OutputStream outputStream) {
- // TODO Auto-generated method stub
-
}
/* (non-Javadoc)
Modified: harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/SegmentConstantPool.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/SegmentConstantPool.java?rev=609928&r1=609927&r2=609928&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/SegmentConstantPool.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/SegmentConstantPool.java Tue Jan 8 02:55:24 2008
@@ -28,6 +28,7 @@
import org.apache.harmony.pack200.bytecode.CPMethodRef;
import org.apache.harmony.pack200.bytecode.CPString;
import org.apache.harmony.pack200.bytecode.CPUTF8;
+import org.apache.harmony.pack200.bytecode.ClassConstantPool;
import org.apache.harmony.pack200.bytecode.ConstantPoolEntry;
public class SegmentConstantPool {
@@ -230,7 +231,7 @@
} else if (index < 0) {
throw new Pack200Exception("Cannot have a negative range");
} else if (cp == UTF_8) {
- return new CPUTF8(bands.getCpUTF8()[index]);
+ return new CPUTF8(bands.getCpUTF8()[index], ClassConstantPool.DOMAIN_NORMALASCIIZ);
} else if (cp == CP_INT) {
return new CPInteger(new Integer(bands.getCpInt()[index]));
} else if (cp == CP_FLOAT) {
Modified: harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/SegmentUtils.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/SegmentUtils.java?rev=609928&r1=609927&r2=609928&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/SegmentUtils.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/SegmentUtils.java Tue Jan 8 02:55:24 2008
@@ -20,29 +20,81 @@
public final class SegmentUtils {
public static int countArgs(String descriptor) {
- int bra = descriptor.indexOf("(");
- int ket = descriptor.indexOf(")");
- if (bra == -1 || ket == -1 || ket < bra)
- throw new IllegalArgumentException("No arguments");
+ return countArgs(descriptor, 1);
+// int bra = descriptor.indexOf("(");
+// int ket = descriptor.indexOf(")");
+// if (bra == -1 || ket == -1 || ket < bra)
+// throw new IllegalArgumentException("No arguments");
+//
+// boolean inType = false;
+// int count = 0;
+// for (int i = bra + 1; i < ket; i++) {
+// char charAt = descriptor.charAt(i);
+// if (inType && charAt == ';') {
+// inType = false;
+// } else if (!inType && charAt == 'L') {
+// inType = true;
+// count++;
+// } else if (charAt == '[' || inType) {
+// // NOP
+// } else {
+// count++;
+// }
+// }
+// return count;
+ }
- boolean inType = false;
- int count = 0;
- for (int i = bra + 1; i < ket; i++) {
- char charAt = descriptor.charAt(i);
- if (inType && charAt == ';') {
- inType = false;
- } else if (!inType && charAt == 'L') {
- inType = true;
- count++;
- } else if (charAt == '[' || inType) {
- // NOP
- } else {
- count++;
- }
- }
- return count;
+ public static int countInvokeInterfaceArgs(String descriptor) {
+ return countArgs(descriptor, 2);
}
+
+ /**
+ * Count the number of arguments in the descriptor. Each
+ * long or double counts as widthOfLongsAndDoubles; all other
+ * arguments count as 1.
+ * @param descriptor String for which arguments are counted
+ * @param widthOfLongsAndDoubles int increment to apply for longs
+ * doubles. This is typically 1 when counting arguments alone,
+ * or 2 when counting arguments for invokeinterface.
+ * @return integer count
+ */
+ protected static int countArgs(String descriptor, int widthOfLongsAndDoubles) {
+ int bra = descriptor.indexOf("(");
+ int ket = descriptor.indexOf(")");
+ if (bra == -1 || ket == -1 || ket < bra)
+ throw new IllegalArgumentException("No arguments");
+ boolean inType = false;
+ boolean consumingNextType = false;
+ int count = 0;
+ for (int i = bra + 1; i < ket; i++) {
+ char charAt = descriptor.charAt(i);
+ if (inType && charAt == ';') {
+ inType = false;
+ consumingNextType = false;
+ } else if (!inType && charAt == 'L') {
+ inType = true;
+ count++;
+ } else if (charAt == '[') {
+ consumingNextType = true;
+ } else if(inType) {
+ // NOP
+ } else {
+ if(consumingNextType) {
+ count++;
+ consumingNextType = false;
+ } else {
+ if(charAt == 'D' || charAt == 'J') {
+ count+=widthOfLongsAndDoubles;
+ } else {
+ count++;
+ }
+ }
+ }
+ }
+ return count;
+ }
+
public static int countMatches(long[] flags, IMatcher matcher) {
int count = 0;
for (int i = 0; i < flags.length; i++) {
Modified: harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/Attribute.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/Attribute.java?rev=609928&r1=609927&r2=609928&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/Attribute.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/Attribute.java Tue Jan 8 02:55:24 2008
@@ -25,7 +25,7 @@
private int attributeNameIndex;
public Attribute(String attributeName) {
- this.attributeName = new CPUTF8(attributeName);
+ this.attributeName = new CPUTF8(attributeName, ClassConstantPool.DOMAIN_ATTRIBUTEASCIIZ);
}
protected void doWrite(DataOutputStream dos) throws IOException {