ccmintrinsics.c

来自「This is a resource based on j2me embedde」· C语言 代码 · 共 1,291 行 · 第 1/3 页

C
1,291
字号
            CVMthrowArrayIndexOutOfBoundsException(ee, NULL);        }        CVMCCMhandleException(ccee);    }}#endif#ifndef CVMCCM_DISABLE_SHARED_STRING_INDEXOF_II_INTRINSIC/* Purpose: Intrinsic version of String.indexOf(int ch, int fromIndex). */static CVMJavaIntCVMCCMintrinsic_java_lang_String_indexOf_II(CVMObject* thisObj,					    CVMJavaInt ch,					    CVMJavaInt fromIndex){    CVMObject *valueObj;    CVMArrayOfChar *valueArr;    CVMJavaInt offset;    CVMJavaInt count;    CVMJavaInt max;    CVMJavaInt i;    CVMJavaChar c;    FIELD_READ_COUNT(thisObj, count);     if (fromIndex >= count) {        return -1;    }    if (fromIndex < 0) {	fromIndex = 0;    }       FIELD_READ_OFFSET(thisObj, offset);    FIELD_READ_VALUE(thisObj, valueObj);    valueArr = (CVMArrayOfChar *)valueObj;    max = offset + count;    i = offset + fromIndex;    while (i < max) {	CVMD_arrayReadChar(valueArr, i, c);	if (c == ch) {	    return i - offset;	}	i++;    }    /* Not found. Return -1. */    return -1;}#endif#ifndef CVMCCM_DISABLE_SHARED_STRING_INDEXOF_I_INTRINSIC/* Purpose: Intrinsic version of String.indexOf(int ch). */static CVMJavaIntCVMCCMintrinsic_java_lang_String_indexOf_I(CVMObject* thisObj,					   CVMJavaInt ch){    return CVMCCMintrinsic_java_lang_String_indexOf_II(thisObj, ch, 0);}#endif#ifndef CVMCCM_DISABLE_SHARED_STRING_INDEXOF_STRING_I_INTRINSIC/* Purpose: Intrinsic version of String.indexOf(String str, int fromIndex). */static CVMJavaIntCVMCCMintrinsic_java_lang_String_indexOf_STRING_I(CVMCCExecEnv *ccee,						  CVMObject* thisObj,						  CVMObject *strObj,						  CVMJavaInt fromIndex){   CVMObject *vObj1;   CVMObject *vObj2;   CVMArrayOfChar *v1;   CVMArrayOfChar *v2;   CVMJavaInt offset;   CVMJavaInt strOffset;   CVMJavaInt count;   CVMJavaInt strCount;   CVMJavaInt max;   CVMJavaChar first;   CVMJavaChar c1;   CVMJavaChar c2;   CVMJavaInt i; /* Iterates v1 searching for the first char of v2 */   CVMJavaInt j; /* Iterates v1 searching for the rest of v2 */   CVMJavaInt k; /* Iterates v2 */   CVMJavaInt end;   CVMassert(CVMD_isgcUnsafe(CVMcceeGetEE(ccee)));    /* If strObj is null, a NullPointerException should be thrown. */    if (strObj == NULL) {        CVMExecEnv *ee = CVMcceeGetEE(ccee);        CVMCCMruntimeLazyFixups(ee);	CVMthrowNullPointerException(ee, NULL);        CVMCCMhandleException(ccee);	return -1;    }   /* The caller is responsible for NULL checking for strICell. */   FIELD_READ_COUNT(thisObj, count);   FIELD_READ_COUNT(strObj, strCount);   if (fromIndex >= count) {       if (strCount == 0) {           /*             * Special case: return the length of the first string            * when searching for an empty String, 4276204 & 6205369            */           return count;       }       return -1;   }   if (fromIndex < 0) {       fromIndex = 0;   }   if (strCount == 0) {       return fromIndex;   }   FIELD_READ_VALUE(thisObj, vObj1);   FIELD_READ_VALUE(strObj, vObj2);   FIELD_READ_OFFSET(thisObj, offset);   FIELD_READ_OFFSET(strObj, strOffset);   v1 = (CVMArrayOfChar *)vObj1;   v2 = (CVMArrayOfChar *)vObj2;   CVMD_arrayReadChar(v2, strOffset, first);   max = offset + (count - strCount);   i = offset + fromIndex;   while (i <= max) {       /* Search for first character. */       CVMD_arrayReadChar(v1, i, c1);       if (c1 == first) {	   /* Found first character, now look at the rest of v2 */	   j = i + 1;	   end = i + strCount;	   k = strOffset + 1;	   while(j < end) {	       CVMD_arrayReadChar(v1, j, c1);	       CVMD_arrayReadChar(v2, k, c2);	       if (c1 != c2) {		   goto continueSearch;	       }	       j++;	       k++;	   }	   /* Found */	   return i - offset;       }   continueSearch:       i++;   }   /* If we are here, then we have failed to find v2 in v1.*/   return -1;}#endif#ifndef CVMCCM_DISABLE_SHARED_STRING_INDEXOF_STRING_INTRINSIC/* Purpose: Intrinsic version of String.indexOf(String str). */static CVMJavaIntCVMCCMintrinsic_java_lang_String_indexOf_STRING(CVMCCExecEnv *ccee,						CVMObject* thisObj,						CVMObject *strObj){    return CVMCCMintrinsic_java_lang_String_indexOf_STRING_I(ccee, thisObj,							     strObj, 0);}#endif#undef MIN#undef FIELD_READ_COUNT#undef FIELD_READ_VALUE#undef FIELD_READ_OFFSET#ifdef CVM_DEBUG_ASSERTS#define CVMassertOKToCopyArrayOfType(expectedType_) \    {                                                                   \        CVMClassBlock *srcCb, *dstCb;                                   \        CVMClassBlock *srcElemCb, *dstElemCb;                           \        size_t srclen, dstlen;                                          \        CVMArrayOfAnyType *srcArr;                                      \        CVMArrayOfAnyType *dstArr;                                      \                                                                        \        srcArr = (CVMArrayOfAnyType *)src;                              \        dstArr = (CVMArrayOfAnyType *)dst;                              \        CVMassert(srcArr != NULL);                                      \        CVMassert(dstArr != NULL);                                      \                                                                        \        srcCb = CVMobjectGetClass(srcArr);                              \        dstCb = CVMobjectGetClass(dstArr);                              \        CVMassert(CVMisArrayClass(srcCb));                              \        CVMassert(CVMisArrayClass(dstCb));                              \                                                                        \        srcElemCb = CVMarrayElementCb(srcCb);                           \        dstElemCb = CVMarrayElementCb(dstCb);                           \        CVMassert(srcElemCb == dstElemCb);                              \        CVMassert(CVMarrayElemTypeCode(srcCb) == expectedType_);        \                                                                        \        srclen = CVMD_arrayGetLength(srcArr);                           \        dstlen = CVMD_arrayGetLength(dstArr);                           \                                                                        \        CVMassert(!(length < 0));                                       \        CVMassert(!(src_pos < 0));                                      \        CVMassert(!(dst_pos < 0));                                      \        CVMassert(!(length + src_pos > srclen));                        \        CVMassert(!(length + dst_pos > dstlen));                        \    }#else#define CVMassertOKToCopyArrayOfType(expectedType_)#endif /* CVM_DEBUG_ASSERTS */#ifndef CVMCCM_DISABLE_SHARED_CVM_COPYBOOLEANARRAY_INTRINSIC/* Purpose: Intrinsic version of CVM.copyBooleanArray(). */voidCVMCCMintrinsic_sun_misc_CVM_copyBooleanArray(CVMArrayOfBoolean *src,    jint src_pos, CVMArrayOfBoolean *dst, jint dst_pos, jint length){    CVMassertOKToCopyArrayOfType(CVM_T_BOOLEAN);    CVMD_arrayCopyBoolean(src, src_pos, dst, dst_pos, length);}#endif#ifndef CVMCCM_DISABLE_SHARED_CVM_COPYBYTEARRAY_INTRINSIC/* Purpose: Intrinsic version of CVM.copyByteArray(). */voidCVMCCMintrinsic_sun_misc_CVM_copyByteArray(CVMArrayOfByte *src,    jint src_pos, CVMArrayOfByte *dst, jint dst_pos, jint length){    CVMassertOKToCopyArrayOfType(CVM_T_BYTE);    CVMD_arrayCopyByte(src, src_pos, dst, dst_pos, length);}#endif#ifndef CVMCCM_DISABLE_SHARED_CVM_COPYSHORTARRAY_INTRINSIC/* Purpose: Intrinsic version of CVM.copyShortArray(). */voidCVMCCMintrinsic_sun_misc_CVM_copyShortArray(CVMArrayOfShort *src,    jint src_pos, CVMArrayOfShort *dst, jint dst_pos, jint length){    CVMassertOKToCopyArrayOfType(CVM_T_SHORT);    CVMD_arrayCopyShort(src, src_pos, dst, dst_pos, length);}#endif#ifndef CVMCCM_DISABLE_SHARED_CVM_COPYCHARARRAY_INTRINSIC/* Purpose: Intrinsic version of CVM.copyCharArray(). */voidCVMCCMintrinsic_sun_misc_CVM_copyCharArray(CVMArrayOfChar *src,    jint src_pos, CVMArrayOfChar *dst, jint dst_pos, jint length){    CVMassertOKToCopyArrayOfType(CVM_T_CHAR);    CVMD_arrayCopyChar(src, src_pos, dst, dst_pos, length);}#endif#ifndef CVMCCM_DISABLE_SHARED_CVM_COPYINTARRAY_INTRINSIC/* Purpose: Intrinsic version of CVM.copyIntArray(). */voidCVMCCMintrinsic_sun_misc_CVM_copyIntArray(CVMArrayOfInt *src,    jint src_pos, CVMArrayOfInt *dst, jint dst_pos, jint length){    CVMassertOKToCopyArrayOfType(CVM_T_INT);    CVMD_arrayCopyInt(src, src_pos, dst, dst_pos, length);}#endif#ifndef CVMCCM_DISABLE_SHARED_CVM_COPYLONGARRAY_INTRINSIC/* Purpose: Intrinsic version of CVM.copyLongArray(). */voidCVMCCMintrinsic_sun_misc_CVM_copyLongArray(CVMArrayOfLong *src,    jint src_pos, CVMArrayOfLong *dst, jint dst_pos, jint length){    CVMassertOKToCopyArrayOfType(CVM_T_LONG);    CVMD_arrayCopyLong(src, src_pos, dst, dst_pos, length);}#endif#ifndef CVMCCM_DISABLE_SHARED_CVM_COPYFLOATARRAY_INTRINSIC/* Purpose: Intrinsic version of CVM.copyFloatArray(). */voidCVMCCMintrinsic_sun_misc_CVM_copyFloatArray(CVMArrayOfFloat *src,    jint src_pos, CVMArrayOfFloat *dst, jint dst_pos, jint length){    CVMassertOKToCopyArrayOfType(CVM_T_FLOAT);    CVMD_arrayCopyFloat(src, src_pos, dst, dst_pos, length);}#endif#ifndef CVMCCM_DISABLE_SHARED_CVM_COPYDOUBLEARRAY_INTRINSIC/* Purpose: Intrinsic version of CVM.copyDoubleArray(). */voidCVMCCMintrinsic_sun_misc_CVM_copyDoubleArray(CVMArrayOfDouble *src,    jint src_pos, CVMArrayOfDouble *dst, jint dst_pos, jint length){    CVMassertOKToCopyArrayOfType(CVM_T_DOUBLE);    CVMD_arrayCopyDouble(src, src_pos, dst, dst_pos, length);}#endif#ifndef CVMCCM_DISABLE_SHARED_CVM_COPYOBJECTARRAY_INTRINSIC/* Purpose: Intrinsic version of CVM.copyObjectArray(). */voidCVMCCMintrinsic_sun_misc_CVM_copyObjectArray(CVMArrayOfRef *src,    jint src_pos, CVMArrayOfRef *dst, jint dst_pos, jint length){    CVMassertOKToCopyArrayOfType(CVM_T_CLASS);    if (length != 0)	CVMD_arrayCopyRef(src, src_pos, dst, dst_pos, length);}#endif#ifndef CVMCCM_DISABLE_SHARED_SYSTEM_ARRAYCOPY_INTRINSIC/* Purpose: Intrinsic version of System.arraycopy(). */voidCVMCCMintrinsic_java_lang_System_arraycopy(CVMCCExecEnv *ccee,    CVMArrayOfAnyType *srcArr, jint src_pos,    CVMArrayOfAnyType *dstArr, jint dst_pos, jint length){    CVMExecEnv *ee = CVMcceeGetEE(ccee);    CVMClassBlock *srcCb, *dstCb;    CVMClassBlock *srcElemCb, *dstElemCb;    size_t srclen;    size_t dstlen;    CVMassert(CVMD_isgcUnsafe(ee));    if ((srcArr == 0) || (dstArr == 0)) {        CVMCCMruntimeLazyFixups(ee);        CVMthrowNullPointerException(ee, NULL);        goto bail;    }    srcCb = CVMobjectGetClass(srcArr);    dstCb = CVMobjectGetClass(dstArr);    /*     * First check whether we are dealing with source and destination     * arrays here. If not, bail out quickly.     */    if (!CVMisArrayClass(srcCb) || !CVMisArrayClass(dstCb)) {        CVMCCMruntimeLazyFixups(ee);        CVMthrowArrayStoreException(ee, NULL);        goto bail;    }    srcElemCb = CVMarrayElementCb(srcCb);    dstElemCb = CVMarrayElementCb(dstCb);    srclen = CVMD_arrayGetLength(srcArr);    dstlen = CVMD_arrayGetLength(dstArr);    /*     * If we are trying to copy between     * arrays that don't have the same type of primitive elements,     * bail out quickly.     *     * The more refined assignability checks for reference arrays     * will be performed in the CVM_T_CLASS case below.     */    /*     * We could make this check slightly faster by comparing     * type-codes of the elements of the array, if we had a     * quick way of getting to that.     */    if ((srcElemCb != dstElemCb) && (CVMcbIs(srcElemCb, PRIMITIVE) ||                                     CVMcbIs(dstElemCb, PRIMITIVE))) {        CVMCCMruntimeLazyFixups(ee);        CVMthrowArrayStoreException(ee, NULL);        goto bail;    } else if ((length < 0) || (src_pos < 0) || (dst_pos < 0) ||               (length + src_pos > srclen) ||               (length + dst_pos > dstlen)) {        CVMCCMruntimeLazyFixups(ee);        CVMthrowArrayIndexOutOfBoundsException(ee, NULL);        goto bail;    }        switch(CVMarrayElemTypeCode(srcCb)) {    case CVM_T_BOOLEAN:         CVMD_arrayCopyBoolean((CVMArrayOfBoolean*)srcArr, src_pos,                              (CVMArrayOfBoolean*)dstArr, dst_pos,                              length);        break;    case CVM_T_BYTE:         CVMD_arrayCopyByte((CVMArrayOfByte*)srcArr, src_pos,                           (CVMArrayOfByte*)dstArr, dst_pos,                           length);        break;            case CVM_T_SHORT:        CVMD_arrayCopyShort((CVMArrayOfShort*)srcArr, src_pos,                            (CVMArrayOfShort*)dstArr, dst_pos,                            length);        break;    case CVM_T_CHAR:        CVMD_arrayCopyChar((CVMArrayOfChar*)srcArr, src_pos,                           (CVMArrayOfChar*)dstArr, dst_pos,                           length);        break;    case CVM_T_INT:        CVMD_arrayCopyInt((CVMArrayOfInt*)srcArr, src_pos,                          (CVMArrayOfInt*)dstArr, dst_pos,                          length);        break;    case CVM_T_LONG:        CVMD_arrayCopyLong((CVMArrayOfLong*)srcArr, src_pos,                           (CVMArrayOfLong*)dstArr, dst_pos,                           length);        break;    case CVM_T_FLOAT:         CVMD_arrayCopyFloat((CVMArrayOfFloat*)srcArr, src_pos,                            (CVMArrayOfFloat*)dstArr, dst_pos,                            length);        break;    case CVM_T_DOUBLE:         CVMD_arrayCopyDouble((CVMArrayOfDouble*)srcArr, src_pos,                             (CVMArrayOfDouble*)dstArr, dst_pos,                             length);        break;    case CVM_T_CLASS: {        /*         * Do a quick check here for the easy case of the same         * array type, or copying into an array of objects. No         * need for element-wise checks in that case.           */        if ((srcElemCb == dstElemCb) ||            (dstElemCb == CVMsystemClass(java_lang_Object))) {            CVMD_arrayCopyRef((CVMArrayOfRef*)srcArr, src_pos,                              (CVMArrayOfRef*)dstArr, dst_pos,                              length);        } else {            /* Do it the hard way. */            CVMcopyRefArrays(ee,                              (CVMArrayOfRef*)srcArr, src_pos, 

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?