From 18d63863c9485cce6c79ad27dde7a98e4794eea2 Mon Sep 17 00:00:00 2001 From: Alexey Andreev Date: Wed, 23 Oct 2024 19:33:13 +0200 Subject: [PATCH] wasm gc: fix with passing JS objects to overlay methods of JS classes --- .../org/teavm/jso/impl/JSClassProcessor.java | 3 +- .../java/org/teavm/jso/test/JSClassTest.java | 63 +++++++++++++++++++ 2 files changed, 65 insertions(+), 1 deletion(-) create mode 100644 tests/src/test/java/org/teavm/jso/test/JSClassTest.java diff --git a/jso/impl/src/main/java/org/teavm/jso/impl/JSClassProcessor.java b/jso/impl/src/main/java/org/teavm/jso/impl/JSClassProcessor.java index a8ff0b206..1e31f3aeb 100644 --- a/jso/impl/src/main/java/org/teavm/jso/impl/JSClassProcessor.java +++ b/jso/impl/src/main/java/org/teavm/jso/impl/JSClassProcessor.java @@ -900,7 +900,8 @@ private boolean processInvocation(MethodReader method, CallLocation callLocation Variable[] newArguments = new Variable[invoke.getArguments().size() + 1]; newArguments[0] = invoke.getInstance(); for (int i = 0; i < invoke.getArguments().size(); ++i) { - newArguments[i + 1] = invoke.getArguments().get(i); + newArguments[i + 1] = convertValue(invoke, invoke.getArguments().get(i), + invoke.getMethod().parameterType(i + 1)); } invoke.setArguments(newArguments); invoke.setInstance(null); diff --git a/tests/src/test/java/org/teavm/jso/test/JSClassTest.java b/tests/src/test/java/org/teavm/jso/test/JSClassTest.java new file mode 100644 index 000000000..6849b5b23 --- /dev/null +++ b/tests/src/test/java/org/teavm/jso/test/JSClassTest.java @@ -0,0 +1,63 @@ +/* + * Copyright 2024 Alexey Andreev. + * + * 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.jso.test; + +import static org.junit.Assert.assertEquals; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.teavm.jso.JSBody; +import org.teavm.jso.JSFunctor; +import org.teavm.jso.JSObject; +import org.teavm.junit.EachTestCompiledSeparately; +import org.teavm.junit.OnlyPlatform; +import org.teavm.junit.SkipJVM; +import org.teavm.junit.TeaVMTestRunner; +import org.teavm.junit.TestPlatform; + +@RunWith(TeaVMTestRunner.class) +@SkipJVM +@OnlyPlatform({ TestPlatform.JAVASCRIPT, TestPlatform.WEBASSEMBLY_GC}) +@EachTestCompiledSeparately +public class JSClassTest { + @Test + public void passJSObjectToArgOfOverlayMethod() { + var c = C.create(); + var result = c.bar(() -> "test"); + assertEquals("bar,test", result); + } + + static abstract class C implements JSObject { + private C() { + } + + abstract String foo(String a, JSSupplier b); + + String bar(JSSupplier b) { + return foo("bar", b); + } + + @JSBody(script = "" + + "return {" + + "foo: function(a, b) { return a + ',' + b(); }" + + "}") + static native C create(); + } + + @JSFunctor + interface JSSupplier extends JSObject { + String get(); + } +}