ballerina-platform / ballerina-lang

The Ballerina Programming Language
https://ballerina.io/
Apache License 2.0
3.55k stars 735 forks source link

[Bug]: `data/error1.bal` and `data/hard.bal` tests in semtype port give SO error #42662

Closed lochana-chathura closed 1 month ago

lochana-chathura commented 1 month ago

Description

$subject.

Related TODO: https://github.com/ballerina-platform/ballerina-lang/blob/23f1db2da42b4d1a7121c721daa1c73825605922/semtypes/src/main/java/io/ballerina/types/typeops/MappingOps.java#L158-L160 data/error1.bal

stacktrace (click to expand) ``` java.lang.StackOverflowError at io.ballerina.types.subtypedata.BddNode.equals(BddNode.java:32) at java.base/java.util.Objects.equals(Objects.java:64) at io.ballerina.types.subtypedata.BddNode.equals(BddNode.java:32) at java.base/java.util.HashMap.putVal(HashMap.java:633) at java.base/java.util.HashMap.put(HashMap.java:610) at io.ballerina.types.Common.memoSubtypeIsEmpty(Common.java:200) at io.ballerina.types.typeops.ErrorOps.errorSubtypeIsEmpty(ErrorOps.java:50) at io.ballerina.types.typeops.ErrorOps.isEmpty(ErrorOps.java:64) at io.ballerina.types.Core.isEmpty(Core.java:337) at io.ballerina.types.typeops.CellOps.cellMutNoneInhabited(CellOps.java:88) at io.ballerina.types.typeops.CellOps.cellInhabited(CellOps.java:78) at io.ballerina.types.typeops.CellOps.cellFormulaIsEmpty(CellOps.java:69) at io.ballerina.types.Common.bddEvery(Common.java:55) at io.ballerina.types.Common.bddEvery(Common.java:58) at io.ballerina.types.Common.bddEvery(Common.java:60) at io.ballerina.types.typeops.CellOps.cellFormulaIsEmpty(CellOps.java:54) at io.ballerina.types.typeops.CellOps.isEmpty(CellOps.java:202) at io.ballerina.types.Core.isEmpty(Core.java:337) at io.ballerina.types.typeops.MappingOps.mappingInhabited(MappingOps.java:104) at io.ballerina.types.typeops.MappingOps.mappingFormulaIsEmpty(MappingOps.java:87) at io.ballerina.types.Common.bddEveryPositive(Common.java:67) at io.ballerina.types.Common.bddEveryPositive(Common.java:72) at io.ballerina.types.Common.bddEveryPositive(Common.java:70) at io.ballerina.types.Common.bddEveryPositive(Common.java:70) at io.ballerina.types.typeops.ErrorOps.errorBddIsEmpty(ErrorOps.java:54) at io.ballerina.types.Common.memoSubtypeIsEmpty(Common.java:205) at io.ballerina.types.typeops.ErrorOps.errorSubtypeIsEmpty(ErrorOps.java:50) at io.ballerina.types.typeops.ErrorOps.isEmpty(ErrorOps.java:64) at io.ballerina.types.Core.isEmpty(Core.java:337) at io.ballerina.types.typeops.CellOps.cellMutNoneInhabited(CellOps.java:88) at io.ballerina.types.typeops.CellOps.cellInhabited(CellOps.java:78) at io.ballerina.types.typeops.CellOps.cellFormulaIsEmpty(CellOps.java:69) at io.ballerina.types.Common.bddEvery(Common.java:55) at io.ballerina.types.Common.bddEvery(Common.java:58) at io.ballerina.types.Common.bddEvery(Common.java:60) at io.ballerina.types.typeops.CellOps.cellFormulaIsEmpty(CellOps.java:54) at io.ballerina.types.typeops.CellOps.isEmpty(CellOps.java:202) at io.ballerina.types.Core.isEmpty(Core.java:337) at io.ballerina.types.typeops.MappingOps.mappingInhabited(MappingOps.java:104) at io.ballerina.types.typeops.MappingOps.mappingFormulaIsEmpty(MappingOps.java:87) at io.ballerina.types.Common.bddEveryPositive(Common.java:67) at io.ballerina.types.Common.bddEveryPositive(Common.java:72) at io.ballerina.types.Common.bddEveryPositive(Common.java:70) at io.ballerina.types.Common.bddEveryPositive(Common.java:70) at io.ballerina.types.typeops.ErrorOps.errorBddIsEmpty(ErrorOps.java:54) at io.ballerina.types.Common.memoSubtypeIsEmpty(Common.java:205) at io.ballerina.types.typeops.ErrorOps.errorSubtypeIsEmpty(ErrorOps.java:50) at io.ballerina.types.typeops.ErrorOps.isEmpty(ErrorOps.java:64) ```

data/hard.bal

stacktrace (click to expand) ``` java.lang.StackOverflowError at io.ballerina.types.Core.diff(Core.java:108) at io.ballerina.types.typeops.CellOps.cellMutLimitedInhabited(CellOps.java:107) at io.ballerina.types.typeops.CellOps.cellInhabited(CellOps.java:79) at io.ballerina.types.typeops.CellOps.cellFormulaIsEmpty(CellOps.java:69) at io.ballerina.types.Common.bddEvery(Common.java:55) at io.ballerina.types.Common.bddEvery(Common.java:58) at io.ballerina.types.Common.bddEvery(Common.java:60) at io.ballerina.types.typeops.CellOps.cellFormulaIsEmpty(CellOps.java:54) at io.ballerina.types.typeops.CellOps.isEmpty(CellOps.java:202) at io.ballerina.types.Core.isEmpty(Core.java:337) at io.ballerina.types.typeops.MappingOps.mappingInhabited(MappingOps.java:104) at io.ballerina.types.typeops.MappingOps.mappingFormulaIsEmpty(MappingOps.java:87) at io.ballerina.types.Common.bddEvery(Common.java:55) at io.ballerina.types.Common.bddEvery(Common.java:60) at io.ballerina.types.Common.bddEvery(Common.java:58) at io.ballerina.types.typeops.MappingOps.lambda$mappingSubtypeIsEmpty$0(MappingOps.java:161) at io.ballerina.types.Common.memoSubtypeIsEmpty(Common.java:205) at io.ballerina.types.typeops.MappingOps.mappingSubtypeIsEmpty(MappingOps.java:160) at io.ballerina.types.typeops.MappingOps.isEmpty(MappingOps.java:237) at io.ballerina.types.Core.isEmpty(Core.java:337) at io.ballerina.types.typeops.CellOps.cellMutLimitedInhabited(CellOps.java:107) at io.ballerina.types.typeops.CellOps.cellInhabited(CellOps.java:79) at io.ballerina.types.typeops.CellOps.cellFormulaIsEmpty(CellOps.java:69) at io.ballerina.types.Common.bddEvery(Common.java:55) at io.ballerina.types.Common.bddEvery(Common.java:58) at io.ballerina.types.Common.bddEvery(Common.java:60) at io.ballerina.types.typeops.CellOps.cellFormulaIsEmpty(CellOps.java:54) at io.ballerina.types.typeops.CellOps.isEmpty(CellOps.java:202) at io.ballerina.types.Core.isEmpty(Core.java:337) at io.ballerina.types.typeops.MappingOps.mappingInhabited(MappingOps.java:104) at io.ballerina.types.typeops.MappingOps.mappingFormulaIsEmpty(MappingOps.java:87) at io.ballerina.types.Common.bddEvery(Common.java:55) at io.ballerina.types.Common.bddEvery(Common.java:60) at io.ballerina.types.Common.bddEvery(Common.java:58) at io.ballerina.types.typeops.MappingOps.lambda$mappingSubtypeIsEmpty$0(MappingOps.java:161) at io.ballerina.types.Common.memoSubtypeIsEmpty(Common.java:205) at io.ballerina.types.typeops.MappingOps.mappingSubtypeIsEmpty(MappingOps.java:160) at io.ballerina.types.typeops.MappingOps.isEmpty(MappingOps.java:237) at io.ballerina.types.Core.isEmpty(Core.java:337) at io.ballerina.types.typeops.CellOps.cellMutLimitedInhabited(CellOps.java:107) at io.ballerina.types.typeops.CellOps.cellInhabited(CellOps.java:79) at io.ballerina.types.typeops.CellOps.cellFormulaIsEmpty(CellOps.java:69) at io.ballerina.types.Common.bddEvery(Common.java:55) at io.ballerina.types.Common.bddEvery(Common.java:58) at io.ballerina.types.Common.bddEvery(Common.java:60) at io.ballerina.types.typeops.CellOps.cellFormulaIsEmpty(CellOps.java:54) at io.ballerina.types.typeops.CellOps.isEmpty(CellOps.java:202) at io.ballerina.types.Core.isEmpty(Core.java:337) at io.ballerina.types.typeops.MappingOps.mappingInhabited(MappingOps.java:104) at io.ballerina.types.typeops.MappingOps.mappingFormulaIsEmpty(MappingOps.java:87) at io.ballerina.types.Common.bddEvery(Common.java:55) at io.ballerina.types.Common.bddEvery(Common.java:60) at io.ballerina.types.Common.bddEvery(Common.java:58) at io.ballerina.types.typeops.MappingOps.lambda$mappingSubtypeIsEmpty$0(MappingOps.java:161) at io.ballerina.types.Common.memoSubtypeIsEmpty(Common.java:205) at io.ballerina.types.typeops.MappingOps.mappingSubtypeIsEmpty(MappingOps.java:160) at io.ballerina.types.typeops.MappingOps.isEmpty(MappingOps.java:237) at io.ballerina.types.Core.isEmpty(Core.java:337) at io.ballerina.types.typeops.CellOps.cellMutLimitedInhabited(CellOps.java:107) at io.ballerina.types.typeops.CellOps.cellInhabited(CellOps.java:79) at io.ballerina.types.typeops.CellOps.cellFormulaIsEmpty(CellOps.java:69) at io.ballerina.types.Common.bddEvery(Common.java:55) at io.ballerina.types.Common.bddEvery(Common.java:58) at io.ballerina.types.Common.bddEvery(Common.java:60) at io.ballerina.types.typeops.CellOps.cellFormulaIsEmpty(CellOps.java:54) at io.ballerina.types.typeops.CellOps.isEmpty(CellOps.java:202) at io.ballerina.types.Core.isEmpty(Core.java:337) at io.ballerina.types.typeops.MappingOps.mappingInhabited(MappingOps.java:104) at io.ballerina.types.typeops.MappingOps.mappingFormulaIsEmpty(MappingOps.java:87) at io.ballerina.types.Common.bddEvery(Common.java:55) at io.ballerina.types.Common.bddEvery(Common.java:60) at io.ballerina.types.Common.bddEvery(Common.java:58) at io.ballerina.types.typeops.MappingOps.lambda$mappingSubtypeIsEmpty$0(MappingOps.java:161) at io.ballerina.types.Common.memoSubtypeIsEmpty(Common.java:205) at io.ballerina.types.typeops.MappingOps.mappingSubtypeIsEmpty(MappingOps.java:160) at io.ballerina.types.typeops.MappingOps.isEmpty(MappingOps.java:237) ```
lochana-chathura commented 1 month ago

Narrowed down to

// J1<:J2
// J2<:J1
type J1 record {|J1 x; J1 y;|}|();
type J2 record {|J2 x; J1 y;|}|();

However,

// J1<:J2
// J2<:J1
type J1 [J1,J1]|();
type J2 [J2,J1]|();

works.

lochana-chathura commented 1 month ago

One unnecessary cell creation was found.

Now that we handle CellSemType instance creation within the createComplexSemType() itself, at L101 we get a CellSemType instance. Therefore we don't need to create another cell with L103. https://github.com/ballerina-platform/ballerina-lang/blob/23f1db2da42b4d1a7121c721daa1c73825605922/semtypes/src/main/java/io/ballerina/types/typeops/MappingOps.java#L101-L103

However, the above is not a bug. Just a redundant cell creation. Still the sample is falling with a SO.

lochana-chathura commented 1 month ago

Bug found to be in this line, https://github.com/ballerina-platform/ballerina-lang/blob/23f1db2da42b4d1a7121c721daa1c73825605922/semtypes/src/main/java/io/ballerina/types/Common.java#L191

we are using listMemo for mappings and functions.

lochana-chathura commented 1 month ago

Fixed in #42679

github-actions[bot] commented 1 month ago

This issue is NOT closed with a proper Reason/ label. Make sure to add proper reason label before closing. Please add or leave a comment with the proper reason label now.

      - Reason/EngineeringMistake - The issue occurred due to a mistake made in the past.
      - Reason/Regression - The issue has introduced a regression.
      - Reason/MultipleComponentInteraction - Issue occured due to interactions in multiple components.
      - Reason/Complex - Issue occurred due to complex scenario.
      - Reason/Invalid - Issue is invalid.
      - Reason/Other - None of the above cases.