summaryrefslogtreecommitdiffstats
path: root/vm/UtfString.cpp
diff options
context:
space:
mode:
authorElliott Hughes <enh@google.com>2011-06-16 16:55:24 -0700
committerElliott Hughes <enh@google.com>2011-06-16 17:27:22 -0700
commitfe7f2b3920bf5d66eda262e643245b03df3e57c8 (patch)
tree723c9bf450e6b3cdfa804682131bf3be649f9a50 /vm/UtfString.cpp
parente6c0ef210ee6c62cf4c63d50c04f451d5fa505f5 (diff)
downloadandroid_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.cpp102
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);