sO invokeMethodWithWidening(Method m, O o, O... args) ctex {
  try {
    Class<?>[] types = m.getParameterTypes();
    int n = types.length;
    O[] args2 = new[n];
    for i to n:
      args2[i] = convertPrimitiveIfNecessary(args[i], types[i]);
    ret m.invoke(o, args2);
  } catch (InvocationTargetException e) {
    throw rethrow(getExceptionCause(e));
  } catch (IllegalArgumentException e) {
    throw new IllegalArgumentException(e.getMessage() + " - was calling: " + m + ", args: " + joinWithSpace(classNames(args)));
  }
}