diff --git a/classlib/src/main/java/org/teavm/classlib/java/util/ArraysNativeGenerator.java b/classlib/src/main/java/org/teavm/classlib/java/util/ArraysNativeGenerator.java new file mode 100644 index 0000000000..17b23b43ef --- /dev/null +++ b/classlib/src/main/java/org/teavm/classlib/java/util/ArraysNativeGenerator.java @@ -0,0 +1,37 @@ +/* + * Copyright 2025 ihromant. + * + * 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 org.teavm.classlib.java.util; + +import org.teavm.backend.javascript.codegen.SourceWriter; +import org.teavm.backend.javascript.spi.Generator; +import org.teavm.backend.javascript.spi.GeneratorContext; +import org.teavm.backend.javascript.templating.JavaScriptTemplate; +import org.teavm.backend.javascript.templating.JavaScriptTemplateFactory; +import org.teavm.model.MethodReference; + +public class ArraysNativeGenerator implements Generator { + private JavaScriptTemplate template; + + public ArraysNativeGenerator(JavaScriptTemplateFactory templateFactory) { + template = templateFactory.createFromResource("org/teavm/classlib/java/util/Arrays.js"); + } + + @Override + public void generate(GeneratorContext context, SourceWriter writer, MethodReference methodRef) { + var fragment = template.builder(methodRef.getName()).withContext(context).build(); + fragment.write(writer, 0); + } +} diff --git a/classlib/src/main/java/org/teavm/classlib/java/util/TArrays.java b/classlib/src/main/java/org/teavm/classlib/java/util/TArrays.java index ef3ce227f9..6a1367c0b1 100644 --- a/classlib/src/main/java/org/teavm/classlib/java/util/TArrays.java +++ b/classlib/src/main/java/org/teavm/classlib/java/util/TArrays.java @@ -23,6 +23,8 @@ import java.util.function.IntToDoubleFunction; import java.util.function.IntToLongFunction; import java.util.function.IntUnaryOperator; +import org.teavm.backend.javascript.spi.GeneratedBy; +import org.teavm.classlib.PlatformDetector; import org.teavm.classlib.java.lang.TIllegalArgumentException; import org.teavm.classlib.java.lang.TMath; import org.teavm.classlib.java.lang.TObject; @@ -488,7 +490,20 @@ public static void sort(int[] a, int fromIndex, int toIndex) { } } + @GeneratedBy(ArraysNativeGenerator.class) + private static native void sortJS(Object arr); + + @GeneratedBy(ArraysNativeGenerator.class) + private static native void sortJSCmp(T[] arr, TComparator cmp); + + //@JSBody(params = {"arr", "cmp"}, script="arr.sort(cmp);") + //private static native void sortJS(@JSByRef Object arr, TComparator cmp); + public static void sort(int[] a) { + if (PlatformDetector.isJavaScript()) { + sortJS(a); + return; + } if (a.length == 0) { return; } @@ -930,6 +945,10 @@ private static void merge(double[] a, double[] b, int from, int split, int to) { } public static void sort(Object[] a) { + if (PlatformDetector.isJavaScript()) { + sortJSCmp(a, TComparator.NaturalOrder.instance()); + return; + } sort(a, TComparator.NaturalOrder.instance()); } diff --git a/classlib/src/main/resources/org/teavm/classlib/java/util/Arrays.js b/classlib/src/main/resources/org/teavm/classlib/java/util/Arrays.js new file mode 100644 index 0000000000..6485c7768d --- /dev/null +++ b/classlib/src/main/resources/org/teavm/classlib/java/util/Arrays.js @@ -0,0 +1,23 @@ +/* + * Copyright 2025 ihromant. + * + * 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. + */ + +function sortJS(arr) { + arr.data.sort(); +} + +function sortJSCmp(arr, cmp) { + arr.data.sort((a, b) => cmp.$compare1.apply(null, a, b)); +} \ No newline at end of file diff --git a/tests/src/test/java/org/teavm/classlib/java/util/ArraysTest.java b/tests/src/test/java/org/teavm/classlib/java/util/ArraysTest.java index d762a5cb42..bb842284ca 100644 --- a/tests/src/test/java/org/teavm/classlib/java/util/ArraysTest.java +++ b/tests/src/test/java/org/teavm/classlib/java/util/ArraysTest.java @@ -32,6 +32,14 @@ public class ArraysTest { @Test public void arraySorted() { + int[] intArr = { 2, 5, 7, 3, 5, 6 }; + Arrays.sort(intArr); + assertEquals(2, intArr[0]); + assertEquals(3, intArr[1]); + assertEquals(5, intArr[2]); + assertEquals(5, intArr[3]); + assertEquals(6, intArr[4]); + assertEquals(7, intArr[5]); Integer[] array = { 2, 5, 7, 3, 5, 6 }; Arrays.sort(array); assertEquals(Integer.valueOf(2), array[0]);