You are viewing a plain text version of this content. The canonical link for it is here.
Posted to kato-commits@incubator.apache.org by mo...@apache.org on 2009/11/30 17:56:08 UTC
svn commit: r885519 -
/incubator/kato/trunk/org.apache.kato/kato.cjvmti/src/main/java/org/apache/kato/jvmti/reader/CJVMTIBinReader.java
Author: monteith
Date: Mon Nov 30 17:56:07 2009
New Revision: 885519
URL: http://svn.apache.org/viewvc?rev=885519&view=rev
Log:
Read in strings as UTF-8. Fixes non iso8859-1 characters.
Modified:
incubator/kato/trunk/org.apache.kato/kato.cjvmti/src/main/java/org/apache/kato/jvmti/reader/CJVMTIBinReader.java
Modified: incubator/kato/trunk/org.apache.kato/kato.cjvmti/src/main/java/org/apache/kato/jvmti/reader/CJVMTIBinReader.java
URL: http://svn.apache.org/viewvc/incubator/kato/trunk/org.apache.kato/kato.cjvmti/src/main/java/org/apache/kato/jvmti/reader/CJVMTIBinReader.java?rev=885519&r1=885518&r2=885519&view=diff
==============================================================================
--- incubator/kato/trunk/org.apache.kato/kato.cjvmti/src/main/java/org/apache/kato/jvmti/reader/CJVMTIBinReader.java (original)
+++ incubator/kato/trunk/org.apache.kato/kato.cjvmti/src/main/java/org/apache/kato/jvmti/reader/CJVMTIBinReader.java Mon Nov 30 17:56:07 2009
@@ -281,9 +281,9 @@
private JLocalVariableTableEntry nlocalVarTable()
throws IOException {
// log.log(Level.FINEST,"Get local var table");
- String name = readCString(variablesIn);
- String sig = readCString(variablesIn);
- String genSig = readCString(variablesIn);
+ String name = readUTFString(variablesIn);
+ String sig = readUTFString(variablesIn);
+ String genSig = readUTFString(variablesIn);
int length = variablesIn.readInt();
int slot = variablesIn.readInt();
long start_location = variablesIn.readLong();
@@ -307,9 +307,9 @@
if (variablesIn.readByte() != CJVMTI_METHOD)
throw new IOException();
long methodID = variablesIn.readLong();
- String mName = readCString(variablesIn);
- String mSig = readCString(variablesIn);
- String mGenSig = readCString(variablesIn);
+ String mName = readUTFString(variablesIn);
+ String mSig = readUTFString(variablesIn);
+ String mGenSig = readUTFString(variablesIn);
int modifiers = variablesIn.readInt();
int count = variablesIn.readInt();
@@ -349,9 +349,9 @@
for (int i = 0; i < fieldCount; i++) {
int modifiers = variablesIn.readInt();
long fieldID = variablesIn.readLong();
- String name = readCString(variablesIn);
- String sig = readCString(variablesIn);
- String genSig = readCString(variablesIn);
+ String name = readUTFString(variablesIn);
+ String sig = readUTFString(variablesIn);
+ String genSig = readUTFString(variablesIn);
JField fl = c.getField(fieldID);
fl.name = name;
fl.genericsignature = genSig;
@@ -373,9 +373,9 @@
for (int i = 0; i < fieldCount; i++) {
int modifiers = variablesIn.readInt();
long fieldID = variablesIn.readLong();
- String name = readCString(variablesIn);
- String sig = readCString(variablesIn);
- String genSig = readCString(variablesIn);
+ String name = readUTFString(variablesIn);
+ String sig = readUTFString(variablesIn);
+ String genSig = readUTFString(variablesIn);
JField fl = c.getField(fieldID);
fl.name = name;
fl.genericsignature = genSig;
@@ -393,13 +393,17 @@
* @throws IOException
*/
private JClass nreadClass(long ref) throws IOException {
- variablesIn.seek(ref);
- if (ref == 0) {
+ if (ref == 0L) {
+ return null;
}
- if (variablesIn.readByte() == CJVMTI_CLASS) {
+
+ variablesIn.seek(ref);
+
+ short tag = variablesIn.readByte();
+ if (tag == CJVMTI_CLASS) {
return nreadClass();
} else {
- log.log(Level.FINEST, "IO EX" + Long.toHexString(ref));
+ log.log(Level.FINEST, "nreadClass: incorrect tag"+tag+" at 0x" + Long.toHexString(ref));
throw new IOException("unable to read class at offset "+ref);
}
}
@@ -422,9 +426,9 @@
int modifiers = variablesIn.readInt();
c.modifiers = (short) modifiers;
log.log(Level.FINEST, "mods " + modifiers + " " + c.modifiers);
- String name = readCString(variablesIn);
- String sourceFile = readCString(variablesIn);
- String genSig = readCString(variablesIn);
+ String name = readUTFString(variablesIn);
+ String sourceFile = readUTFString(variablesIn);
+ String genSig = readUTFString(variablesIn);
// TODO move this to C implementation
if (sourceFile.equals("NoSource")) {
@@ -957,7 +961,34 @@
return sb.toString();
}
-
+ /**
+ * Read a UTF8 style null terminated string
+ * @param z Input stream pointing at the start of the string
+ * @return a String
+ * @throws IOException
+ */
+ private String readUTFString(FileImageInputStream z) throws IOException {
+
+ z.mark();
+
+ // Determine array size
+ int len = 0;
+ int cur;
+ while ((cur = z.readUnsignedByte()) != 0) {
+ len++;
+ }
+
+ // then read it into byte array
+ z.reset();
+ byte array[] = new byte[len];
+ int cnt = 0;
+ while ((cur = z.readUnsignedByte()) != 0) {
+ array[cnt++] = (byte)cur;
+ }
+
+ // Convert bytes into unicode string.
+ return new String(array,"UTF-8");
+ }
/**
* Read a stack frame
@@ -979,7 +1010,7 @@
}
long methodID = variablesIn.readLong();
- String methodName = readCString(variablesIn);
+ String methodName = readUTFString(variablesIn);
log.log(Level.FINEST, "Method name is: " + methodName);
long declaringClass = variablesIn.readLong();
long cPos = variablesIn.getStreamPosition(); // Save where we are before reading in the declaring class
@@ -1111,7 +1142,7 @@
log.fine("Error");
System.exit(0);
}
- String threadname = readCString(variablesIn);
+ String threadname = readUTFString(variablesIn);
log.finest("thread name "+threadname);
long objectRef = variablesIn.readLong();