ballerina-lang icon indicating copy to clipboard operation
ballerina-lang copied to clipboard

`ArrayIndexOutOfBoundsException` when using default value parameters with function call in interop FieldSet

Open Nadeeshan96 opened this issue 2 years ago • 2 comments

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):

Nadeeshan96 avatar Jun 26 '22 10:06 Nadeeshan96

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.(JBallerinaBackend.java:134) at io.ballerina.projects.JBallerinaBackend.lambda$from$0(JBallerinaBackend.java:112) at java.base/java.util.HashMap.computeIfAbsent(HashMap.java:1134) 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)
```

gabilang avatar Aug 18 '22 09:08 gabilang

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.

Nadeeshan96 avatar Aug 18 '22 10:08 Nadeeshan96

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)

Nadeeshan96 avatar Sep 30 '22 05:09 Nadeeshan96