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); }
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); }
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; }