diff options
author | Elliott Hughes <enh@google.com> | 2011-06-16 16:55:24 -0700 |
---|---|---|
committer | Elliott Hughes <enh@google.com> | 2011-06-16 17:27:22 -0700 |
commit | fe7f2b3920bf5d66eda262e643245b03df3e57c8 (patch) | |
tree | 723c9bf450e6b3cdfa804682131bf3be649f9a50 /vm/UtfString.cpp | |
parent | e6c0ef210ee6c62cf4c63d50c04f451d5fa505f5 (diff) | |
download | android_dalvik-fe7f2b3920bf5d66eda262e643245b03df3e57c8.tar.gz android_dalvik-fe7f2b3920bf5d66eda262e643245b03df3e57c8.tar.bz2 android_dalvik-fe7f2b3920bf5d66eda262e643245b03df3e57c8.zip |
Improve reference table dumping.
1. Show the newest entry first; I always assume the top is the newest.
2. Use human-readable type names.
3. Improve the human-readable type name code to show _which_ Class (i.e.
java.lang.Class<java.lang.String> rather than just java.lang.Class).
4. Make it clear when we're reporting the number of elements in an array.
5. Show the first few characters of a string.
6. Show the length of a string if we truncate it.
(I've also removed some redundant casts and improved const-correctness.)
Example:
Last 10 entries in JNI local reference table:
16: 0x40f8ec70 java.lang.String "android.permissi... (41 chars)
15: 0x40f8d450 android.os.Parcel
14: 0x40f8eb90 java.lang.String "BlackSurface"
13: 0x408caca0 android.view.SurfaceSession
12: 0x40f8eb60 android.view.Surface
11: 0x406bc6f0 java.lang.Class<com.android.server.SystemServer>
10: 0x406c0278 java.lang.String "com/android/serv... (31 chars)
9: 0x4015d488 dalvik.system.PathClassLoader
8: 0x40148de8 java.lang.Class<java.lang.ClassLoader>
7: 0x406bc560 java.lang.String[]
JNI local reference table summary (17 entries):
6 of java.lang.Class<com.android.server.SystemServer> (5 unique instances)
5 of java.lang.String (5 unique instances)
1 of java.lang.String[]
1 of java.lang.String[] (2 elements)
1 of dalvik.system.PathClassLoader
1 of android.os.Parcel
1 of android.view.SurfaceSession
1 of android.view.Surface
Change-Id: I56494104cd0daada3ecc1e610f1c94df1e11c640
Diffstat (limited to 'vm/UtfString.cpp')
-rw-r--r-- | vm/UtfString.cpp | 102 |
1 files changed, 43 insertions, 59 deletions
diff --git a/vm/UtfString.cpp b/vm/UtfString.cpp index 566650746..05bac533b 100644 --- a/vm/UtfString.cpp +++ b/vm/UtfString.cpp @@ -211,8 +211,8 @@ u4 dvmComputeStringHash(StringObject* strObj) { } int len = dvmGetFieldInt(strObj, STRING_FIELDOFF_COUNT); int offset = dvmGetFieldInt(strObj, STRING_FIELDOFF_OFFSET); - ArrayObject* chars = (ArrayObject*) dvmGetFieldObject(strObj, - STRING_FIELDOFF_VALUE); + ArrayObject* chars = + (ArrayObject*) dvmGetFieldObject(strObj, STRING_FIELDOFF_VALUE); hashCode = computeUtf16Hash((u2*)(void*)chars->contents + offset, len); dvmSetFieldInt(strObj, STRING_FIELDOFF_HASHCODE, hashCode); return hashCode; @@ -281,29 +281,25 @@ StringObject* dvmCreateStringFromUnicode(const u2* unichars, int len) * * Returns NULL if the object is NULL. */ -char* dvmCreateCstrFromString(StringObject* jstr) +char* dvmCreateCstrFromString(const StringObject* jstr) { - char* newStr; - ArrayObject* chars; - int len, byteLen, offset; - const u2* data; - assert(gDvm.classJavaLangString != NULL); - - if (jstr == NULL) + if (jstr == NULL) { return NULL; + } - len = dvmGetFieldInt((Object*) jstr, STRING_FIELDOFF_COUNT); - offset = dvmGetFieldInt((Object*) jstr, STRING_FIELDOFF_OFFSET); - chars = (ArrayObject*) dvmGetFieldObject((Object*) jstr, - STRING_FIELDOFF_VALUE); - data = (const u2*)(void*)chars->contents + offset; + int len = dvmGetFieldInt(jstr, STRING_FIELDOFF_COUNT); + int offset = dvmGetFieldInt(jstr, STRING_FIELDOFF_OFFSET); + ArrayObject* chars = + (ArrayObject*) dvmGetFieldObject(jstr, STRING_FIELDOFF_VALUE); + const u2* data = (const u2*)(void*)chars->contents + offset; assert(offset + len <= (int) chars->length); - byteLen = utf16_utf8ByteLen(data, len); - newStr = (char*) malloc(byteLen+1); - if (newStr == NULL) + int byteLen = utf16_utf8ByteLen(data, len); + char* newStr = (char*) malloc(byteLen+1); + if (newStr == NULL) { return NULL; + } convertUtf16ToUtf8(newStr, data, len); return newStr; @@ -313,12 +309,10 @@ char* dvmCreateCstrFromString(StringObject* jstr) * Create a UTF-8 C string from a region of a java/lang/String. (Used by * the JNI GetStringUTFRegion call.) */ -void dvmCreateCstrFromStringRegion(StringObject* jstr, int start, int len, - char* buf) +void dvmCreateCstrFromStringRegion(const StringObject* jstr, + int start, int len, char* buf) { - const u2* data; - - data = dvmStringChars(jstr) + start; + const u2* data = dvmStringChars(jstr) + start; convertUtf16ToUtf8(buf, data, len); } @@ -327,22 +321,18 @@ void dvmCreateCstrFromStringRegion(StringObject* jstr, int start, int len, * * Does not include the terminating null byte. */ -int dvmStringUtf8ByteLen(StringObject* jstr) +int dvmStringUtf8ByteLen(const StringObject* jstr) { - ArrayObject* chars; - int len, offset; - const u2* data; - assert(gDvm.classJavaLangString != NULL); - - if (jstr == NULL) + if (jstr == NULL) { return 0; // should we throw something? assert? + } - len = dvmGetFieldInt((Object*) jstr, STRING_FIELDOFF_COUNT); - offset = dvmGetFieldInt((Object*) jstr, STRING_FIELDOFF_OFFSET); - chars = (ArrayObject*) dvmGetFieldObject((Object*) jstr, - STRING_FIELDOFF_VALUE); - data = (const u2*)(void*)chars->contents + offset; + int len = dvmGetFieldInt(jstr, STRING_FIELDOFF_COUNT); + int offset = dvmGetFieldInt(jstr, STRING_FIELDOFF_OFFSET); + ArrayObject* chars = + (ArrayObject*) dvmGetFieldObject(jstr, STRING_FIELDOFF_VALUE); + const u2* data = (const u2*)(void*)chars->contents + offset; assert(offset + len <= (int) chars->length); return utf16_utf8ByteLen(data, len); @@ -351,31 +341,27 @@ int dvmStringUtf8ByteLen(StringObject* jstr) /* * Get the string's length. */ -int dvmStringLen(StringObject* jstr) +int dvmStringLen(const StringObject* jstr) { - return dvmGetFieldInt((Object*) jstr, STRING_FIELDOFF_COUNT); + return dvmGetFieldInt(jstr, STRING_FIELDOFF_COUNT); } /* * Get the char[] object from the String. */ -ArrayObject* dvmStringCharArray(StringObject* jstr) +ArrayObject* dvmStringCharArray(const StringObject* jstr) { - return (ArrayObject*) dvmGetFieldObject((Object*) jstr, - STRING_FIELDOFF_VALUE); + return (ArrayObject*) dvmGetFieldObject(jstr, STRING_FIELDOFF_VALUE); } /* * Get the string's data. */ -const u2* dvmStringChars(StringObject* jstr) +const u2* dvmStringChars(const StringObject* jstr) { - ArrayObject* chars; - int offset; - - offset = dvmGetFieldInt((Object*) jstr, STRING_FIELDOFF_OFFSET); - chars = (ArrayObject*) dvmGetFieldObject((Object*) jstr, - STRING_FIELDOFF_VALUE); + int offset = dvmGetFieldInt(jstr, STRING_FIELDOFF_OFFSET); + ArrayObject* chars = + (ArrayObject*) dvmGetFieldObject(jstr, STRING_FIELDOFF_VALUE); return (const u2*)(void*)chars->contents + offset; } @@ -391,24 +377,22 @@ int dvmHashcmpStrings(const void* vstrObj1, const void* vstrObj2) { const StringObject* strObj1 = (const StringObject*) vstrObj1; const StringObject* strObj2 = (const StringObject*) vstrObj2; - ArrayObject* chars1; - ArrayObject* chars2; - int len1, len2, offset1, offset2; assert(gDvm.classJavaLangString != NULL); /* get offset and length into char array; all values are in 16-bit units */ - len1 = dvmGetFieldInt((Object*) strObj1, STRING_FIELDOFF_COUNT); - offset1 = dvmGetFieldInt((Object*) strObj1, STRING_FIELDOFF_OFFSET); - len2 = dvmGetFieldInt((Object*) strObj2, STRING_FIELDOFF_COUNT); - offset2 = dvmGetFieldInt((Object*) strObj2, STRING_FIELDOFF_OFFSET); - if (len1 != len2) + int len1 = dvmGetFieldInt(strObj1, STRING_FIELDOFF_COUNT); + int offset1 = dvmGetFieldInt(strObj1, STRING_FIELDOFF_OFFSET); + int len2 = dvmGetFieldInt(strObj2, STRING_FIELDOFF_COUNT); + int offset2 = dvmGetFieldInt(strObj2, STRING_FIELDOFF_OFFSET); + if (len1 != len2) { return len1 - len2; + } - chars1 = (ArrayObject*) dvmGetFieldObject((Object*) strObj1, - STRING_FIELDOFF_VALUE); - chars2 = (ArrayObject*) dvmGetFieldObject((Object*) strObj2, - STRING_FIELDOFF_VALUE); + ArrayObject* chars1 = + (ArrayObject*) dvmGetFieldObject(strObj1, STRING_FIELDOFF_VALUE); + ArrayObject* chars2 = + (ArrayObject*) dvmGetFieldObject(strObj2, STRING_FIELDOFF_VALUE); /* damage here actually indicates a broken java/lang/String */ assert(offset1 + len1 <= (int) chars1->length); |