OSDN Git Service

merge in klp-release history after reset to klp-dev
[android-x86/dalvik.git] / vm / InlineNative.cpp
index 124031d..00c1e95 100644 (file)
@@ -136,7 +136,7 @@ bool javaLangString_charAt(u4 arg0, u4 arg1, u4 arg2, u4 arg3,
         return false;
     }
 
-    //LOGI("String.charAt this=0x%08x index=%d", arg0, arg1);
+    //ALOGI("String.charAt this=0x%08x index=%d", arg0, arg1);
     count = dvmGetFieldInt((Object*) arg0, STRING_FIELDOFF_COUNT);
     if ((s4) arg1 < 0 || (s4) arg1 >= count) {
         dvmThrowStringIndexOutOfBoundsExceptionWithIndex(count, arg1);
@@ -180,9 +180,9 @@ static void badMatch(StringObject* thisStrObj, StringObject* compStrObj,
     thisStr = dvmCreateCstrFromString(thisStrObj);
     compStr = dvmCreateCstrFromString(compStrObj);
 
-    LOGE("%s expected %d got %d", compareType, expectResult, newResult);
-    LOGE(" this (o=%d l=%d) '%s'", thisOffset, thisCount, thisStr);
-    LOGE(" comp (o=%d l=%d) '%s'", compOffset, compCount, compStr);
+    ALOGE("%s expected %d got %d", compareType, expectResult, newResult);
+    ALOGE(" this (o=%d l=%d) '%s'", thisOffset, thisCount, thisStr);
+    ALOGE(" comp (o=%d l=%d) '%s'", compOffset, compCount, compStr);
     dvmPrintHexDumpEx(ANDROID_LOG_INFO, LOG_TAG,
         ((const u2*) thisArray->contents) + thisOffset, thisCount*2,
         kHexDumpLocal);
@@ -403,7 +403,7 @@ bool javaLangString_equals(u4 arg0, u4 arg1, u4 arg2, u4 arg3,
 bool javaLangString_length(u4 arg0, u4 arg1, u4 arg2, u4 arg3,
     JValue* pResult)
 {
-    //LOGI("String.length this=0x%08x pResult=%p", arg0, pResult);
+    //ALOGI("String.length this=0x%08x pResult=%p", arg0, pResult);
 
     /* null reference check on "this" */
     if ((Object*) arg0 == NULL) {
@@ -421,7 +421,7 @@ bool javaLangString_length(u4 arg0, u4 arg1, u4 arg2, u4 arg3,
 bool javaLangString_isEmpty(u4 arg0, u4 arg1, u4 arg2, u4 arg3,
     JValue* pResult)
 {
-    //LOGI("String.isEmpty this=0x%08x pResult=%p", arg0, pResult);
+    //ALOGI("String.isEmpty this=0x%08x pResult=%p", arg0, pResult);
 
     /* null reference check on "this" */
     if ((Object*) arg0 == NULL) {
@@ -455,7 +455,7 @@ static inline int indexOfCommon(Object* strObj, int ch, int start)
     const u2* chars = (const u2*)(void*)charArray->contents;
     int offset = dvmGetFieldInt(strObj, STRING_FIELDOFF_OFFSET);
     int count = dvmGetFieldInt(strObj, STRING_FIELDOFF_COUNT);
-    //LOGI("String.indexOf(0x%08x, 0x%04x, %d) off=%d count=%d",
+    //ALOGI("String.indexOf(0x%08x, 0x%04x, %d) off=%d count=%d",
     //    (u4) strObj, ch, start, offset, count);
 
     /* factor out the offset */
@@ -463,6 +463,8 @@ static inline int indexOfCommon(Object* strObj, int ch, int start)
 
     if (start < 0)
         start = 0;
+    else if (start > count)
+        start = count;
 
 #if 0
     /* 16-bit loop, simple */
@@ -730,51 +732,41 @@ const InlineOperation gDvmInlineOpsTable[] = {
         "Lorg/apache/harmony/dalvik/NativeTestTarget;",
         "emptyInlineMethod", "()V" },
 
-    { javaLangString_charAt,
-        "Ljava/lang/String;", "charAt", "(I)C" },
-    { javaLangString_compareTo,
-        "Ljava/lang/String;", "compareTo", "(Ljava/lang/String;)I" },
-    { javaLangString_equals,
-        "Ljava/lang/String;", "equals", "(Ljava/lang/Object;)Z" },
-    { javaLangString_fastIndexOf_II,
-        "Ljava/lang/String;", "fastIndexOf", "(II)I" },
-    { javaLangString_isEmpty,
-        "Ljava/lang/String;", "isEmpty", "()Z" },
-    { javaLangString_length,
-        "Ljava/lang/String;", "length", "()I" },
-
-    { javaLangMath_abs_int,
-        "Ljava/lang/Math;", "abs", "(I)I" },
-    { javaLangMath_abs_long,
-        "Ljava/lang/Math;", "abs", "(J)J" },
-    { javaLangMath_abs_float,
-        "Ljava/lang/Math;", "abs", "(F)F" },
-    { javaLangMath_abs_double,
-        "Ljava/lang/Math;", "abs", "(D)D" },
-    { javaLangMath_min_int,
-        "Ljava/lang/Math;", "min", "(II)I" },
-    { javaLangMath_max_int,
-        "Ljava/lang/Math;", "max", "(II)I" },
-    { javaLangMath_sqrt,
-        "Ljava/lang/Math;", "sqrt", "(D)D" },
-    { javaLangMath_cos,
-        "Ljava/lang/Math;", "cos", "(D)D" },
-    { javaLangMath_sin,
-        "Ljava/lang/Math;", "sin", "(D)D" },
-
-    { javaLangFloat_floatToIntBits,
-        "Ljava/lang/Float;", "floatToIntBits", "(F)I" },
-    { javaLangFloat_floatToRawIntBits,
-        "Ljava/lang/Float;", "floatToRawIntBits", "(F)I" },
-    { javaLangFloat_intBitsToFloat,
-        "Ljava/lang/Float;", "intBitsToFloat", "(I)F" },
-
-    { javaLangDouble_doubleToLongBits,
-        "Ljava/lang/Double;", "doubleToLongBits", "(D)J" },
-    { javaLangDouble_doubleToRawLongBits,
-        "Ljava/lang/Double;", "doubleToRawLongBits", "(D)J" },
-    { javaLangDouble_longBitsToDouble,
-        "Ljava/lang/Double;", "longBitsToDouble", "(J)D" },
+    { javaLangString_charAt, "Ljava/lang/String;", "charAt", "(I)C" },
+    { javaLangString_compareTo, "Ljava/lang/String;", "compareTo", "(Ljava/lang/String;)I" },
+    { javaLangString_equals, "Ljava/lang/String;", "equals", "(Ljava/lang/Object;)Z" },
+    { javaLangString_fastIndexOf_II, "Ljava/lang/String;", "fastIndexOf", "(II)I" },
+    { javaLangString_isEmpty, "Ljava/lang/String;", "isEmpty", "()Z" },
+    { javaLangString_length, "Ljava/lang/String;", "length", "()I" },
+
+    { javaLangMath_abs_int, "Ljava/lang/Math;", "abs", "(I)I" },
+    { javaLangMath_abs_long, "Ljava/lang/Math;", "abs", "(J)J" },
+    { javaLangMath_abs_float, "Ljava/lang/Math;", "abs", "(F)F" },
+    { javaLangMath_abs_double, "Ljava/lang/Math;", "abs", "(D)D" },
+    { javaLangMath_min_int, "Ljava/lang/Math;", "min", "(II)I" },
+    { javaLangMath_max_int, "Ljava/lang/Math;", "max", "(II)I" },
+    { javaLangMath_sqrt, "Ljava/lang/Math;", "sqrt", "(D)D" },
+    { javaLangMath_cos, "Ljava/lang/Math;", "cos", "(D)D" },
+    { javaLangMath_sin, "Ljava/lang/Math;", "sin", "(D)D" },
+
+    { javaLangFloat_floatToIntBits, "Ljava/lang/Float;", "floatToIntBits", "(F)I" },
+    { javaLangFloat_floatToRawIntBits, "Ljava/lang/Float;", "floatToRawIntBits", "(F)I" },
+    { javaLangFloat_intBitsToFloat, "Ljava/lang/Float;", "intBitsToFloat", "(I)F" },
+
+    { javaLangDouble_doubleToLongBits, "Ljava/lang/Double;", "doubleToLongBits", "(D)J" },
+    { javaLangDouble_doubleToRawLongBits, "Ljava/lang/Double;", "doubleToRawLongBits", "(D)J" },
+    { javaLangDouble_longBitsToDouble, "Ljava/lang/Double;", "longBitsToDouble", "(J)D" },
+
+    // These are implemented exactly the same in Math and StrictMath,
+    // so we can make the StrictMath calls fast too. Note that this
+    // isn't true in general!
+    { javaLangMath_abs_int, "Ljava/lang/StrictMath;", "abs", "(I)I" },
+    { javaLangMath_abs_long, "Ljava/lang/StrictMath;", "abs", "(J)J" },
+    { javaLangMath_abs_float, "Ljava/lang/StrictMath;", "abs", "(F)F" },
+    { javaLangMath_abs_double, "Ljava/lang/StrictMath;", "abs", "(D)D" },
+    { javaLangMath_min_int, "Ljava/lang/StrictMath;", "min", "(II)I" },
+    { javaLangMath_max_int, "Ljava/lang/StrictMath;", "max", "(II)I" },
+    { javaLangMath_sqrt, "Ljava/lang/StrictMath;", "sqrt", "(D)D" },
 };
 
 /*
@@ -823,7 +815,7 @@ Method* dvmFindInlinableMethod(const char* classDescriptor,
      */
     ClassObject* clazz = dvmFindClassNoInit(classDescriptor, NULL);
     if (clazz == NULL) {
-        LOGE("dvmFindInlinableMethod: can't find class '%s'",
+        ALOGE("dvmFindInlinableMethod: can't find class '%s'",
             classDescriptor);
         dvmClearException(dvmThreadSelf());
         return NULL;
@@ -840,7 +832,7 @@ Method* dvmFindInlinableMethod(const char* classDescriptor,
             methodSignature);
     }
     if (method == NULL) {
-        LOGE("dvmFindInlinableMethod: can't find method %s.%s %s",
+        ALOGE("dvmFindInlinableMethod: can't find method %s.%s %s",
             clazz->descriptor, methodName, methodSignature);
         return NULL;
     }
@@ -849,13 +841,13 @@ Method* dvmFindInlinableMethod(const char* classDescriptor,
      * Check that the method is appropriate for inlining.
      */
     if (!dvmIsFinalClass(clazz) && !dvmIsFinalMethod(method)) {
-        LOGE("dvmFindInlinableMethod: can't inline non-final method %s.%s",
+        ALOGE("dvmFindInlinableMethod: can't inline non-final method %s.%s",
             clazz->descriptor, method->name);
         return NULL;
     }
     if (dvmIsSynchronizedMethod(method) ||
             dvmIsDeclaredSynchronizedMethod(method)) {
-        LOGE("dvmFindInlinableMethod: can't inline synchronized method %s.%s",
+        ALOGE("dvmFindInlinableMethod: can't inline synchronized method %s.%s",
             clazz->descriptor, method->name);
         return NULL;
     }
@@ -891,9 +883,9 @@ Method* dvmResolveInlineNative(int opIndex)
     }
 
     gDvm.inlinedMethods[opIndex] = method;
-    IF_LOGV() {
+    IF_ALOGV() {
         char* desc = dexProtoCopyMethodDescriptor(&method->prototype);
-        LOGV("Registered for profile: %s.%s %s",
+        ALOGV("Registered for profile: %s.%s %s",
             method->clazz->descriptor, method->name, desc);
         free(desc);
     }