From 4c61a13057d342598be457d8a7bbedf39552c0e8 Mon Sep 17 00:00:00 2001 From: Peter Johnson Date: Sun, 10 Oct 2021 15:53:35 -0700 Subject: [PATCH] [ntcore] Revert to per-element copy for toNative() (#3621) arraycopy() does not unbox values, so throws an exception. This was broken in #3419 due to a false positive in PMD (see https://sourceforge.net/p/pmd/bugs/804/). --- .../networktables/NetworkTableValue.java | 22 +++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/ntcore/src/main/java/edu/wpi/first/networktables/NetworkTableValue.java b/ntcore/src/main/java/edu/wpi/first/networktables/NetworkTableValue.java index 8f8a6aa3a7..f4b929048d 100644 --- a/ntcore/src/main/java/edu/wpi/first/networktables/NetworkTableValue.java +++ b/ntcore/src/main/java/edu/wpi/first/networktables/NetworkTableValue.java @@ -478,27 +478,41 @@ public final class NetworkTableValue { return Objects.hash(m_type, m_value); } + // arraycopy() doesn't know how to unwrap boxed values; this is a false positive in PMD + // (see https://sourceforge.net/p/pmd/bugs/804/) + @SuppressWarnings("PMD.AvoidArrayLoops") static boolean[] toNative(Boolean[] arr) { boolean[] out = new boolean[arr.length]; - System.arraycopy(arr, 0, out, 0, arr.length); + for (int i = 0; i < arr.length; i++) { + out[i] = arr[i]; + } return out; } + @SuppressWarnings("PMD.AvoidArrayLoops") static double[] toNative(Number[] arr) { double[] out = new double[arr.length]; - System.arraycopy(arr, 0, out, 0, arr.length); + for (int i = 0; i < arr.length; i++) { + out[i] = arr[i].doubleValue(); + } return out; } + @SuppressWarnings("PMD.AvoidArrayLoops") static Boolean[] fromNative(boolean[] arr) { Boolean[] out = new Boolean[arr.length]; - System.arraycopy(arr, 0, out, 0, arr.length); + for (int i = 0; i < arr.length; i++) { + out[i] = arr[i]; + } return out; } + @SuppressWarnings("PMD.AvoidArrayLoops") static Double[] fromNative(double[] arr) { Double[] out = new Double[arr.length]; - System.arraycopy(arr, 0, out, 0, arr.length); + for (int i = 0; i < arr.length; i++) { + out[i] = arr[i]; + } return out; }