예제 #1
0
jboolean rvmThrowClassCastException(Env* env, JClass* expectedType, JClass* actualType) {
    const char* expectedTypeName = rvmGetHumanReadableClassName(env, expectedType);
    if (!expectedTypeName) return FALSE;
    const char* actualTypeName = rvmGetHumanReadableClassName(env, actualType);
    if (!actualTypeName) return FALSE;
    return rvmThrowNewf(env, java_lang_ClassCastException, "%s cannot be cast to %s", actualTypeName, expectedTypeName);
}
예제 #2
0
jboolean rvmThrowArrayStoreException(Env* env, JClass* elemType, JClass* arrayType) {
    const char* elemTypeName = rvmGetHumanReadableClassName(env, elemType);
    if (!elemTypeName) return FALSE;
    const char* arrayTypeName = rvmGetHumanReadableClassName(env, arrayType);
    if (!arrayTypeName) return FALSE;
    return rvmThrowNewf(env, java_lang_ArrayStoreException, 
        "%s cannot be stored in an array of type %s", elemTypeName, arrayTypeName);
}
예제 #3
0
jvalue* validateAndUnwrapArgs(Env* env, ObjectArray* parameterTypes, ObjectArray* args) {
    jint length = args->length;
    jvalue* jvalueArgs = length > 0 ? (jvalue*) rvmAllocateMemory(env, sizeof(jvalue) * length) : emptyJValueArgs;
    if (!jvalueArgs) return NULL;

    jint i;
    for (i = 0; i < length; i++) {
        Object* arg = args->values[i];
        Class* type = (Class*) parameterTypes->values[i];
        if (CLASS_IS_PRIMITIVE(type)) {
            if (arg == NULL) {
                const char* typeName = rvmGetHumanReadableClassName(env, type);
                if (typeName) {
                    rvmThrowNewf(env, java_lang_IllegalArgumentException, 
                        "argument %d should have type %s, got null", i + 1, typeName);
                }
                return NULL;
            }
            if (!rvmUnbox(env, arg, type, &jvalueArgs[i])) {
                if (rvmExceptionOccurred(env)->clazz == java_lang_ClassCastException) {
                    rvmExceptionClear(env);
                    const char* argTypeName = rvmGetHumanReadableClassName(env, arg->clazz);
                    const char* typeName = argTypeName ? rvmGetHumanReadableClassName(env, type) : NULL;
                    if (argTypeName && typeName) {
                        rvmThrowNewf(env, java_lang_IllegalArgumentException, 
                            "argument %d should have type %s, got %s", i + 1, typeName, argTypeName);
                    }
                }
                return NULL;
            }
        } else {
            if (arg && !rvmIsInstanceOf(env, arg, type)) {
                const char* argTypeName = rvmGetHumanReadableClassName(env, arg->clazz);
                const char* typeName = argTypeName ? rvmGetHumanReadableClassName(env, type) : NULL;
                if (argTypeName && typeName) {
                    rvmThrowNewf(env, java_lang_IllegalArgumentException, 
                        "argument %d should have type %s, got %s", i + 1, typeName, argTypeName);
                }
                return NULL;
            }
            jvalueArgs[i].l = (jobject) arg;
        }
    }
    return jvalueArgs;
}