ballerina-lang
ballerina-lang copied to clipboard
`ArrayIndexOutOfBoundsException` when using default value parameters with function call in interop FieldSet
Description:
$title
[2022-06-24 11:23:53,032] SEVERE {b7a.log.crash} - Index -1 out of bounds for length 20
java.lang.ArrayIndexOutOfBoundsException: Index -1 out of bounds for length 20
at org.objectweb.asm.Frame.getLocal(Frame.java:486)
at org.objectweb.asm.Frame.execute(Frame.java:768)
at org.objectweb.asm.MethodWriter.visitVarInsn(MethodWriter.java:926)
at org.wso2.ballerinalang.compiler.bir.codegen.JvmCodeGenUtil.genYieldCheck(JvmCodeGenUtil.java:621)
at org.wso2.ballerinalang.compiler.bir.codegen.interop.InteropMethodGen.generateBasicBlocks(InteropMethodGen.java:313)
at org.wso2.ballerinalang.compiler.bir.codegen.interop.InteropMethodGen.genJFieldForInteropField(InteropMethodGen.java:192)
at org.wso2.ballerinalang.compiler.bir.codegen.interop.ExternalMethodGen.genJMethodForBExternalFunc(ExternalMethodGen.java:75)
at org.wso2.ballerinalang.compiler.bir.codegen.methodgen.MethodGen.generateMethod(MethodGen.java:159)
at org.wso2.ballerinalang.compiler.bir.codegen.JvmPackageGen.lambda$generateModuleClasses$0(JvmPackageGen.java:446)
at java.base/java.util.HashMap$EntrySet.forEach(HashMap.java:1039)
at org.wso2.ballerinalang.compiler.bir.codegen.JvmPackageGen.generateModuleClasses(JvmPackageGen.java:397)
at org.wso2.ballerinalang.compiler.bir.codegen.JvmPackageGen.generate(JvmPackageGen.java:808)
at org.wso2.ballerinalang.compiler.bir.codegen.CodeGenerator.generate(CodeGenerator.java:95)
at org.wso2.ballerinalang.compiler.bir.codegen.CodeGenerator.generate(CodeGenerator.java:70)
at io.ballerina.projects.JBallerinaBackend.performCodeGen(JBallerinaBackend.java:309)
at io.ballerina.projects.ModuleContext.generateCodeInternal(ModuleContext.java:473)
at io.ballerina.projects.ModuleCompilationState$4.generatePlatformSpecificCode(ModuleCompilationState.java:132)
at io.ballerina.projects.ModuleContext.generatePlatformSpecificCode(ModuleContext.java:381)
at io.ballerina.projects.JBallerinaBackend.performCodeGen(JBallerinaBackend.java:165)
at io.ballerina.projects.JBallerinaBackend.<init>(JBallerinaBackend.java:134)
at io.ballerina.projects.JBallerinaBackend.lambda$from$0(JBallerinaBackend.java:112)
at java.base/java.util.HashMap.computeIfAbsent(HashMap.java:1133)
at io.ballerina.projects.PackageCompilation.getCompilerBackend(PackageCompilation.java:169)
at io.ballerina.projects.JBallerinaBackend.from(JBallerinaBackend.java:111)
at io.ballerina.cli.task.CompileTask.execute(CompileTask.java:122)
at io.ballerina.cli.TaskExecutor.executeTasks(TaskExecutor.java:40)
at io.ballerina.cli.cmd.RunCommand.execute(RunCommand.java:205)
at java.base/java.util.Optional.ifPresent(Optional.java:183)
at io.ballerina.cli.launcher.Main.main(Main.java:51)
Steps to reproduce: java code (in "jar_dependencies/testBalFieldSet.jar")
public class TestFieldSet{
public static long a = 12;
public static long geta() {
return a;
}
}
ballerina code
import ballerina/jballerina.java;
import ballerina/io;
public function get_a() returns int = @java:FieldGet {
name:"a",
'class:"TestFieldSet"
} external;
function setA(int a = (1+2+func())) = @java:FieldSet {
name:"a",
'class:"TestFieldSet"
} external;
function func() returns int {
return 3;
}
public function main() {
setA();
int l = get_a();
io:println(l);
}
Ballerina.toml
[[platform.java11.dependency]]
path = "jar_dependencies/testBalFieldSet.jar"
Affected Versions: Ballerina 2201.1.0 (Swan Lake)
OS, DB, other environment details and versions:
Related Issues (optional):
Suggested Labels (optional):
Suggested Assignees (optional):
function setA(int a = (func())) = @java:FieldSet {
name:"a",
'class:"TestFieldSet"
} external;
Using a function call as a default parameter of a Java FielsSet extern function causes issues with stack frames.
Stacktrace obtained for above case:
```
[2022-08-18 15:04:17,238] SEVERE {b7a.log.crash} - null java.lang.NullPointerException at org.objectweb.asm.Frame.merge(Frame.java:1171) at org.objectweb.asm.MethodWriter.computeAllFrames(MethodWriter.java:1610) at org.objectweb.asm.MethodWriter.visitMaxs(MethodWriter.java:1546) at org.wso2.ballerinalang.compiler.bir.codegen.interop.InteropMethodGen.genJFieldForInteropField(InteropMethodGen.java:282) at org.wso2.ballerinalang.compiler.bir.codegen.interop.ExternalMethodGen.genJMethodForBExternalFunc(ExternalMethodGen.java:75) at org.wso2.ballerinalang.compiler.bir.codegen.methodgen.MethodGen.generateMethod(MethodGen.java:159) at org.wso2.ballerinalang.compiler.bir.codegen.JvmPackageGen.lambda$generateModuleClasses$0(JvmPackageGen.java:446) at java.base/java.util.HashMap$EntrySet.forEach(HashMap.java:1040) at org.wso2.ballerinalang.compiler.bir.codegen.JvmPackageGen.generateModuleClasses(JvmPackageGen.java:397) at org.wso2.ballerinalang.compiler.bir.codegen.JvmPackageGen.generate(JvmPackageGen.java:808) at org.wso2.ballerinalang.compiler.bir.codegen.CodeGenerator.generate(CodeGenerator.java:95) at org.wso2.ballerinalang.compiler.bir.codegen.CodeGenerator.generate(CodeGenerator.java:70) at io.ballerina.projects.JBallerinaBackend.performCodeGen(JBallerinaBackend.java:309) at io.ballerina.projects.ModuleContext.generateCodeInternal(ModuleContext.java:473) at io.ballerina.projects.ModuleCompilationState$4.generatePlatformSpecificCode(ModuleCompilationState.java:132) at io.ballerina.projects.ModuleContext.generatePlatformSpecificCode(ModuleContext.java:381) at io.ballerina.projects.JBallerinaBackend.performCodeGen(JBallerinaBackend.java:165) at io.ballerina.projects.JBallerinaBackend.
```
This issue will get resolved after the function default parameter value changes which will be done for update 3 @chiranSachintha @warunalakshitha. Need to add tests to test these cases because they are not currently available.
This issue is not solved with function default parameter value changes. Need to fix this and add tests. Now it is giving the below error.
[2022-09-30 11:00:50,415] SEVERE {b7a.log.crash} - Index 1 out of bounds for length 1
java.lang.IndexOutOfBoundsException: Index 1 out of bounds for length 1
at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:64)
at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:70)
at java.base/jdk.internal.util.Preconditions.checkIndex(Preconditions.java:248)
at java.base/java.util.Objects.checkIndex(Objects.java:372)
at java.base/java.util.ArrayList.get(ArrayList.java:459)
at org.wso2.ballerinalang.compiler.bir.codegen.interop.InteropMethodGen.genJFieldForInteropField(InteropMethodGen.java:183)
at org.wso2.ballerinalang.compiler.bir.codegen.interop.ExternalMethodGen.genJMethodForBExternalFunc(ExternalMethodGen.java:74)
at org.wso2.ballerinalang.compiler.bir.codegen.methodgen.MethodGen.generateMethod(MethodGen.java:168)
at org.wso2.ballerinalang.compiler.bir.codegen.JvmPackageGen.lambda$generateModuleClasses$0(JvmPackageGen.java:445)
at java.base/java.util.HashMap$EntrySet.forEach(HashMap.java:1039)
at org.wso2.ballerinalang.compiler.bir.codegen.JvmPackageGen.generateModuleClasses(JvmPackageGen.java:398)
at org.wso2.ballerinalang.compiler.bir.codegen.JvmPackageGen.generate(JvmPackageGen.java:809)
at org.wso2.ballerinalang.compiler.bir.codegen.CodeGenerator.generate(CodeGenerator.java:96)
at org.wso2.ballerinalang.compiler.bir.codegen.CodeGenerator.generate(CodeGenerator.java:71)
at io.ballerina.projects.JBallerinaBackend.performCodeGen(JBallerinaBackend.java:309)
at io.ballerina.projects.ModuleContext.generateCodeInternal(ModuleContext.java:476)
at io.ballerina.projects.ModuleCompilationState$4.generatePlatformSpecificCode(ModuleCompilationState.java:132)
at io.ballerina.projects.ModuleContext.generatePlatformSpecificCode(ModuleContext.java:384)
at io.ballerina.projects.JBallerinaBackend.performCodeGen(JBallerinaBackend.java:165)
at io.ballerina.projects.JBallerinaBackend.<init>(JBallerinaBackend.java:134)
at io.ballerina.projects.JBallerinaBackend.lambda$from$0(JBallerinaBackend.java:112)
at java.base/java.util.HashMap.computeIfAbsent(HashMap.java:1133)
at io.ballerina.projects.PackageCompilation.getCompilerBackend(PackageCompilation.java:170)
at io.ballerina.projects.JBallerinaBackend.from(JBallerinaBackend.java:111)
at io.ballerina.cli.task.CompileTask.execute(CompileTask.java:165)
at io.ballerina.cli.TaskExecutor.executeTasks(TaskExecutor.java:40)
at io.ballerina.cli.cmd.RunCommand.execute(RunCommand.java:213)
at java.base/java.util.Optional.ifPresent(Optional.java:183)
at io.ballerina.cli.launcher.Main.main(Main.java:51)