Encapsulate NativeArray under ArrayHelper.

PiperOrigin-RevId: 365744903
Change-Id: If13d299c03ebd6a5ffb812e39ff125fd62a4a512
diff --git a/user/super/com/google/gwt/emul/java/io/Serializable.java b/user/super/com/google/gwt/emul/java/io/Serializable.java
index 9458df5..3d3a91d 100644
--- a/user/super/com/google/gwt/emul/java/io/Serializable.java
+++ b/user/super/com/google/gwt/emul/java/io/Serializable.java
@@ -15,8 +15,8 @@
  */
 package java.io;
 
+import javaemul.internal.ArrayHelper;
 import javaemul.internal.JsUtils;
-import javaemul.internal.NativeArray;
 import jsinterop.annotations.JsMethod;
 
 /**
@@ -38,7 +38,7 @@
         || type.equals("string")
         || instance.getTypeMarker()
         // Arrays are implicitly instances of Serializable (JLS 10.7).
-        || NativeArray.isArray(instance);
+        || ArrayHelper.isArray(instance);
   }
   // CHECKSTYLE_ON: end utility methods
 }
diff --git a/user/super/com/google/gwt/emul/java/lang/Cloneable.java b/user/super/com/google/gwt/emul/java/lang/Cloneable.java
index 907f569..21db90a 100644
--- a/user/super/com/google/gwt/emul/java/lang/Cloneable.java
+++ b/user/super/com/google/gwt/emul/java/lang/Cloneable.java
@@ -15,7 +15,7 @@
  */
 package java.lang;
 
-import javaemul.internal.NativeArray;
+import javaemul.internal.ArrayHelper;
 import jsinterop.annotations.JsMethod;
 
 /**
@@ -32,7 +32,7 @@
 
     return instance.getTypeMarker()
         // Arrays are implicitly instances of Cloneable (JLS 10.7).
-        || NativeArray.isArray(instance);
+        || ArrayHelper.isArray(instance);
   }
   // CHECKSTYLE_ON: end utility methods
 }
diff --git a/user/super/com/google/gwt/emul/java/util/Arrays.java b/user/super/com/google/gwt/emul/java/util/Arrays.java
index 3ddb92a..f0fa2fa 100644
--- a/user/super/com/google/gwt/emul/java/util/Arrays.java
+++ b/user/super/com/google/gwt/emul/java/util/Arrays.java
@@ -40,8 +40,8 @@
 import java.util.stream.Stream;
 import java.util.stream.StreamSupport;
 import javaemul.internal.ArrayHelper;
+import javaemul.internal.ArrayHelper.CompareFunction;
 import javaemul.internal.JsUtils;
-import javaemul.internal.NativeArray.CompareFunction;
 import jsinterop.annotations.JsFunction;
 
 /**
@@ -1241,7 +1241,7 @@
   }
 
   public static void sort(double[] array) {
-    ArrayHelper.asNativeArray(array).sort(getDoubleComparator());
+    ArrayHelper.sort(array, getDoubleComparator());
   }
 
   public static void sort(double[] array, int fromIndex, int toIndex) {
@@ -1250,7 +1250,7 @@
   }
 
   public static void sort(float[] array) {
-    ArrayHelper.asNativeArray(array).sort(getDoubleComparator());
+    ArrayHelper.sort(array, getDoubleComparator());
   }
 
   public static void sort(float[] array, int fromIndex, int toIndex) {
@@ -1268,7 +1268,7 @@
   }
 
   public static void sort(long[] array) {
-    ArrayHelper.asNativeArray(array).sort(getLongComparator());
+    ArrayHelper.sort(array, getLongComparator());
   }
 
   public static void sort(long[] array, int fromIndex, int toIndex) {
@@ -1700,7 +1700,7 @@
    */
   private static void nativeSort(Object array, int fromIndex, int toIndex, CompareFunction fn) {
     Object temp = ArrayHelper.unsafeClone(array, fromIndex, toIndex);
-    ArrayHelper.asNativeArray(temp).sort(fn);
+    ArrayHelper.sort(temp, fn);
     ArrayHelper.copy(temp, 0, array, fromIndex, toIndex - fromIndex);
   }
 
@@ -1708,7 +1708,7 @@
    * Sort an entire array of number primitives of integral type.
    */
   private static void nativeIntegerSort(Object array) {
-    ArrayHelper.asNativeArray(array).sort(getIntComparator());
+    ArrayHelper.sort(array, getIntComparator());
   }
 
   /**
diff --git a/user/super/com/google/gwt/emul/java/util/InternalHashCodeMap.java b/user/super/com/google/gwt/emul/java/util/InternalHashCodeMap.java
index ab96835..4b9a251 100644
--- a/user/super/com/google/gwt/emul/java/util/InternalHashCodeMap.java
+++ b/user/super/com/google/gwt/emul/java/util/InternalHashCodeMap.java
@@ -21,7 +21,6 @@
 import java.util.Map.Entry;
 import javaemul.internal.ArrayHelper;
 import javaemul.internal.JsUtils;
-import javaemul.internal.NativeArray;
 
 /**
  * A simple wrapper around JavaScriptObject to provide {@link java.util.Map}-like semantics for any
@@ -148,7 +147,7 @@
   }
 
   private Entry<K, V>[] newEntryChain() {
-    return JsUtils.uncheckedCast(new NativeArray());
+    return JsUtils.uncheckedCast(new Object[0]);
   }
 
   /**
diff --git a/user/super/com/google/gwt/emul/javaemul/internal/ArrayHelper.java b/user/super/com/google/gwt/emul/javaemul/internal/ArrayHelper.java
index c388935..ed3ba73 100644
--- a/user/super/com/google/gwt/emul/javaemul/internal/ArrayHelper.java
+++ b/user/super/com/google/gwt/emul/javaemul/internal/ArrayHelper.java
@@ -15,14 +15,13 @@
  */
 package javaemul.internal;
 
-import jsinterop.annotations.JsPackage;
+import jsinterop.annotations.JsFunction;
+import jsinterop.annotations.JsMethod;
 import jsinterop.annotations.JsProperty;
 import jsinterop.annotations.JsType;
 
-/**
- * Provides utilities to perform operations on Arrays.
- */
-public class ArrayHelper {
+/** Provides utilities to perform operations on Arrays. */
+public final class ArrayHelper {
 
   public static final int ARRAY_PROCESS_BATCH_SIZE = 10000;
 
@@ -43,6 +42,9 @@
     return ArrayStamper.stampJavaTypeInfo(new NativeArray(length), array);
   }
 
+  @JsMethod(name = "Array.isArray", namespace = "<window>")
+  public static native boolean isArray(Object o);
+
   public static int getLength(Object array) {
     return asNativeArray(array).length;
   }
@@ -85,14 +87,14 @@
       int batchEnd = Math.min(batchStart + ARRAY_PROCESS_BATCH_SIZE, end);
       len = batchEnd - batchStart;
       Object[] spliceArgs = unsafeClone(src, batchStart, batchEnd);
-      asNativeArray(spliceArgs).splice(0, 0, destOfs, overwrite ? len : 0);
+      asNativeArray(spliceArgs).splice(0, 0, (double) destOfs, (double) (overwrite ? len : 0));
       getSpliceFunction().apply(destArray, spliceArgs);
       batchStart = batchEnd;
       destOfs += len;
     }
   }
 
-  @JsType(isNative = true, name = "Function", namespace = JsPackage.GLOBAL)
+  @JsType(isNative = true, name = "Function", namespace = "<window>")
   private static class NativeFunction {
     public native String apply(Object thisContext, Object[] argsArray);
   }
@@ -100,8 +102,35 @@
   @JsProperty(name = "Array.prototype.splice", namespace = "<window>")
   private static native NativeFunction getSpliceFunction();
 
-  public static NativeArray asNativeArray(Object array) {
+  /** Compare function for sort. */
+  @JsFunction
+  public interface CompareFunction {
+    double compare(Object d1, Object d2);
+  }
+
+  public static void sort(Object array, CompareFunction fn) {
+    asNativeArray(array).sort(fn);
+  }
+
+  private static NativeArray asNativeArray(Object array) {
     return JsUtils.uncheckedCast(array);
   }
+
+  @JsType(isNative = true, name = "Array", namespace = "<window>")
+  private static class NativeArray {
+    int length;
+
+    NativeArray(int length) {}
+
+    native Object concat(Object arrayToAdd);
+
+    native Object[] slice(int fromIndex, int toIndex);
+
+    native void splice(int index, int deleteCount, Object... value);
+
+    native <T> void sort(CompareFunction compareFunction);
+  }
+
+  private ArrayHelper() {}
 }
 
diff --git a/user/super/com/google/gwt/emul/javaemul/internal/NativeArray.java b/user/super/com/google/gwt/emul/javaemul/internal/NativeArray.java
deleted file mode 100644
index 792ab3c..0000000
--- a/user/super/com/google/gwt/emul/javaemul/internal/NativeArray.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright 2017 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package javaemul.internal;
-
-import javaemul.internal.annotations.DoNotAutobox;
-import jsinterop.annotations.JsFunction;
-import jsinterop.annotations.JsType;
-
-/**
- * Simple class to work with native array API.
- */
-@JsType(isNative = true, name = "Array", namespace = "<window>")
-public class NativeArray {
-  /**
-   * Compare function for sort.
-   */
-  @JsFunction
-  public interface CompareFunction {
-    double compare(Object d1, Object d2);
-  }
-
-  public int length;
-  public NativeArray() { }
-  public NativeArray(int length) { }
-  public native Object concat(Object arrayToAdd);
-  public native Object[] slice(int fromIndex, int toIndex);
-  public native void splice(int index, int deleteCount, @DoNotAutobox Object... value);
-  public native <T> void sort(CompareFunction compareFunction);
-
-  public static native boolean isArray(Object o);
-}