From 69fc2dac84642ea01216115d0d9d008aba783754 Mon Sep 17 00:00:00 2001 From: gabilang Date: Fri, 27 Oct 2023 13:31:48 +0530 Subject: [PATCH 01/15] Fix so with equals of maps with cyclic references --- .../runtime/internal/values/MapValueImpl.java | 22 ++++++++++++++++ .../EqualAndNotEqualOperationsTest.java | 2 +- .../equal_and_not_equal_operation.bal | 26 +++++++++++++++++++ 3 files changed, 49 insertions(+), 1 deletion(-) diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/MapValueImpl.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/MapValueImpl.java index b04c29edc370..7110d33297da 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/MapValueImpl.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/MapValueImpl.java @@ -360,9 +360,31 @@ public boolean equals(Object o) { return false; } + if (hasCyclicReference(this, mapValue, new LinkedHashSet<>())) { + return false; + } + return entrySet().equals(mapValue.entrySet()); } + private boolean hasCyclicReference(MapValueImpl obj1, MapValueImpl obj2, + Set, MapValueImpl>> visited) { + if (visited.contains(Map.entry(obj1, obj2))) { + return true; // Cyclic reference detected. + } + visited.add(Map.entry(obj1, obj2)); // Mark this object pair as visited. + + for (Map.Entry entry : obj1.entrySet()) { + Object value = entry.getValue(); + if (value instanceof MapValueImpl) { + if (hasCyclicReference((MapValueImpl) value, obj2, visited)) { + return true; + } + } + } + return false; // No cyclic references detected. + } + /** * Returns the hash code value. * diff --git a/tests/jballerina-unit-test/src/test/java/org/ballerinalang/test/expressions/binaryoperations/EqualAndNotEqualOperationsTest.java b/tests/jballerina-unit-test/src/test/java/org/ballerinalang/test/expressions/binaryoperations/EqualAndNotEqualOperationsTest.java index 7d8a82c93589..aceeba7cc21e 100644 --- a/tests/jballerina-unit-test/src/test/java/org/ballerinalang/test/expressions/binaryoperations/EqualAndNotEqualOperationsTest.java +++ b/tests/jballerina-unit-test/src/test/java/org/ballerinalang/test/expressions/binaryoperations/EqualAndNotEqualOperationsTest.java @@ -60,7 +60,7 @@ public Object[] getValueTestFunctions() { "checkDecimalEquality", "checkStringEquality", "checkEqualityToNil", "checkAnyDataEquality", "testIntByteEqualityPositive", "testIntByteEqualityNegative", "testIntersectingUnionEquality", "testTableEquality", "testEqualityWithNonAnydataType", "testEqualityByteWithIntSubTypes", - "checkFiniteTypeEquality" + "checkFiniteTypeEquality", "testEqualityWithCyclicReferences" }; } diff --git a/tests/jballerina-unit-test/src/test/resources/test-src/expressions/binaryoperations/equal_and_not_equal_operation.bal b/tests/jballerina-unit-test/src/test/resources/test-src/expressions/binaryoperations/equal_and_not_equal_operation.bal index 92980fe96b4c..4253400647ee 100644 --- a/tests/jballerina-unit-test/src/test/resources/test-src/expressions/binaryoperations/equal_and_not_equal_operation.bal +++ b/tests/jballerina-unit-test/src/test/resources/test-src/expressions/binaryoperations/equal_and_not_equal_operation.bal @@ -1768,3 +1768,29 @@ function testEqualityByteWithIntSubTypes() { (g !== a) || (h !== a)); // Need to add (a !== f) , (f !== a) after fixing #32924 } + +type Part anydata[]; +type J anydata; + +function testEqualityWithCyclicReferences() { + map m1 = {one: 1, two: 2}; + map m2 = {one: 1, two: 2}; + m1["three"] = m2; + m2["three"] = m1; + test:assertTrue(m1 == m2); + test:assertFalse(m1 != m2); + + map j1 = { loop: () }; + map j2 = { loop: () }; + j1["loop"] = j1; + j2["loop"] = j1; + map j3 = { loop: () }; + j3["loop"] = { loop: { loop: { loop: j3 }}}; + test:assertTrue(j1 == j3); + + Part yin = []; + Part yang = []; + yin[0] = yang; + yang[0] = yin; + test:assertTrue(yin == yang); +} From ff2e55949c38899652cb0b377d516f5b41e76bc8 Mon Sep 17 00:00:00 2001 From: gabilang Date: Tue, 21 Nov 2023 11:46:07 +0530 Subject: [PATCH 02/15] Define custom equals method --- .../runtime/internal/TypeChecker.java | 157 ++---------------- .../internal/values/AbstractArrayValue.java | 28 ++++ .../runtime/internal/values/CharIterator.java | 21 +++ .../runtime/internal/values/ErrorValue.java | 11 ++ .../runtime/internal/values/FPValue.java | 11 ++ .../runtime/internal/values/FutureValue.java | 11 ++ .../runtime/internal/values/HandleValue.java | 11 ++ .../runtime/internal/values/MapValueImpl.java | 53 +++--- .../runtime/internal/values/RefValue.java | 3 + .../internal/values/RegExpAssertion.java | 12 ++ .../internal/values/RegExpAtomQuantifier.java | 12 ++ .../internal/values/RegExpCapturingGroup.java | 12 ++ .../internal/values/RegExpCharSet.java | 11 ++ .../internal/values/RegExpCharSetRange.java | 12 ++ .../internal/values/RegExpCharacterClass.java | 12 ++ .../internal/values/RegExpDisjunction.java | 11 ++ .../internal/values/RegExpFlagExpression.java | 12 ++ .../internal/values/RegExpFlagOnOff.java | 12 ++ .../values/RegExpLiteralCharOrEscape.java | 12 ++ .../internal/values/RegExpQuantifier.java | 12 ++ .../internal/values/RegExpSequence.java | 11 ++ .../runtime/internal/values/RegExpValue.java | 11 ++ .../runtime/internal/values/StreamValue.java | 11 ++ .../internal/values/StreamingJsonValue.java | 11 ++ .../internal/values/TableValueImpl.java | 77 ++++++++- .../internal/values/TupleValueImpl.java | 4 +- .../internal/values/TypedescValueImpl.java | 16 ++ .../runtime/internal/values/ValuePair.java | 126 ++++++++++++++ .../runtime/internal/values/XmlComment.java | 19 +++ .../runtime/internal/values/XmlItem.java | 41 +++++ .../internal/values/XmlNonElementItem.java | 14 ++ .../runtime/internal/values/XmlPi.java | 31 ++++ .../runtime/internal/values/XmlQName.java | 11 ++ .../runtime/internal/values/XmlSequence.java | 36 ++++ .../runtime/internal/values/XmlText.java | 21 +++ 35 files changed, 703 insertions(+), 173 deletions(-) create mode 100644 bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/ValuePair.java diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/TypeChecker.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/TypeChecker.java index 6717bf6a8d1b..dd0a2e266a49 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/TypeChecker.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/TypeChecker.java @@ -75,6 +75,7 @@ import io.ballerina.runtime.internal.values.TupleValueImpl; import io.ballerina.runtime.internal.values.TypedescValue; import io.ballerina.runtime.internal.values.TypedescValueImpl; +import io.ballerina.runtime.internal.values.ValuePair; import io.ballerina.runtime.internal.values.XmlComment; import io.ballerina.runtime.internal.values.XmlItem; import io.ballerina.runtime.internal.values.XmlPi; @@ -88,6 +89,7 @@ import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Objects; @@ -376,7 +378,7 @@ public static Type getType(Object value) { * @return True if values are equal, else false. */ public static boolean isEqual(Object lhsValue, Object rhsValue) { - return isEqual(lhsValue, rhsValue, new ArrayList<>()); + return isEqual(lhsValue, rhsValue, new LinkedHashSet<>()); } /** @@ -416,7 +418,7 @@ private static boolean isDecimalRealNumber(DecimalValue decimalValue) { /** * Reference equality check for values. If both the values are simple basic types, returns the same - * result as {@link #isEqual(Object, Object, List)} + * result as {@link #isEqual(Object, Object, Set)} * * @param lhsValue The value on the left hand side * @param rhsValue The value on the right hand side @@ -2932,7 +2934,7 @@ static boolean isSimpleBasicType(Type type) { * @param checkedValues Structured value pairs already compared or being compared * @return True if values are equal, else false. */ - private static boolean isEqual(Object lhsValue, Object rhsValue, List checkedValues) { + public static boolean isEqual(Object lhsValue, Object rhsValue, Set checkedValues) { if (lhsValue == rhsValue) { return true; } @@ -2944,7 +2946,7 @@ private static boolean isEqual(Object lhsValue, Object rhsValue, List return checkValueEquals(lhsValue, rhsValue, checkedValues, getType(lhsValue), getType(rhsValue)); } - private static boolean checkValueEquals(Object lhsValue, Object rhsValue, List checkedValues, + private static boolean checkValueEquals(Object lhsValue, Object rhsValue, Set checkedValues, Type lhsValType, Type rhsValType) { lhsValType = getImpliedType(lhsValType); rhsValType = getImpliedType(rhsValType); @@ -2995,18 +2997,16 @@ private static boolean checkValueEquals(Object lhsValue, Object rhsValue, List checkedValues) { - ValuePair compValuePair = new ValuePair(lhsList, rhsList); - if (checkedValues.contains(compValuePair)) { - return true; - } - checkedValues.add(compValuePair); - - if (lhsList.size() != rhsList.size()) { - return false; - } - - for (int i = 0; i < lhsList.size(); i++) { - if (!isEqual(lhsList.get(i), rhsList.get(i), checkedValues)) { - return false; - } - } - return true; - } - - /** - * Deep equality check for a map. - * - * @param lhsMap Map on the left hand side - * @param rhsMap Map on the right hand side - * @param checkedValues Structured value pairs already compared or being compared - * @return True if the map values are equal, else false. - */ - private static boolean isEqual(MapValueImpl lhsMap, MapValueImpl rhsMap, List checkedValues) { - ValuePair compValuePair = new ValuePair(lhsMap, rhsMap); - if (checkedValues.contains(compValuePair)) { - return true; - } - checkedValues.add(compValuePair); - - if (lhsMap.size() != rhsMap.size()) { - return false; - } - - if (!lhsMap.keySet().containsAll(rhsMap.keySet())) { - return false; - } - - Iterator> mapIterator = lhsMap.entrySet().iterator(); - while (mapIterator.hasNext()) { - Map.Entry lhsMapEntry = mapIterator.next(); - if (!isEqual(lhsMapEntry.getValue(), rhsMap.get(lhsMapEntry.getKey()), checkedValues)) { - return false; - } - } - return true; - } - - /** - * Deep equality check for a table. - * - * @param lhsTable Table on the left hand side - * @param rhsTable Table on the right hand side - * @param checkedValues Structured value pairs already compared or being compared - * @return True if the table values are equal, else false. - */ - private static boolean isEqual(TableValueImpl lhsTable, TableValueImpl rhsTable, List checkedValues) { - ValuePair compValuePair = new ValuePair(lhsTable, rhsTable); - if (checkedValues.contains(compValuePair)) { - return true; - } - checkedValues.add(compValuePair); - - if (lhsTable.size() != rhsTable.size()) { - return false; - } - - boolean isLhsKeyedTable = - ((BTableType) getImpliedType(lhsTable.getType())).getFieldNames().length > 0; - boolean isRhsKeyedTable = - ((BTableType) getImpliedType(rhsTable.getType())).getFieldNames().length > 0; - - Object[] lhsTableValues = lhsTable.values().toArray(); - Object[] rhsTableValues = rhsTable.values().toArray(); - - if (isLhsKeyedTable == isRhsKeyedTable) { - for (int i = 0; i < lhsTableValues.length; i++) { - if (!isEqual(lhsTableValues[i], rhsTableValues[i], checkedValues)) { - return false; - } - } - return true; - } - - return false; - } - /** * Deep equality check for regular expressions. * @@ -3145,7 +3046,7 @@ private static boolean isEqual(RegExpValue lhsRegExp, RegExpValue rhsRegExp) { * @param checkedValues Errors already compared or being compared * @return True if the error values are equal, else false. */ - private static boolean isEqual(ErrorValue lhsError, ErrorValue rhsError, List checkedValues) { + private static boolean isEqual(ErrorValue lhsError, ErrorValue rhsError, Set checkedValues) { ValuePair compValuePair = new ValuePair(lhsError, rhsError); if (checkedValues.contains(compValuePair)) { return true; @@ -3153,7 +3054,7 @@ private static boolean isEqual(ErrorValue lhsError, ErrorValue rhsError, List valueList = new ArrayList<>(2); - - ValuePair(Object valueOne, Object valueTwo) { - valueList.add(valueOne); - valueList.add(valueTwo); - } - - @Override - public boolean equals(Object otherPair) { - if (!(otherPair instanceof ValuePair)) { - return false; - } - - ArrayList otherList = ((ValuePair) otherPair).valueList; - ArrayList currentList = valueList; - - if (otherList.size() != currentList.size()) { - return false; - } - - for (int i = 0; i < otherList.size(); i++) { - if (!otherList.get(i).equals(currentList.get(i))) { - return false; - } - } - - return true; - } - } - /** * Checks whether a given {@link BType} has an implicit initial value or not. * @param type {@link BType} to be analyzed. diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/AbstractArrayValue.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/AbstractArrayValue.java index 80c1ac6512f0..9dd1b4b331c6 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/AbstractArrayValue.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/AbstractArrayValue.java @@ -33,8 +33,10 @@ import java.util.ArrayList; import java.util.LinkedHashSet; import java.util.Map; +import java.util.Set; import static io.ballerina.runtime.api.constants.RuntimeConstants.ARRAY_LANG_LIB; +import static io.ballerina.runtime.internal.TypeChecker.isEqual; import static io.ballerina.runtime.internal.errors.ErrorCodes.INVALID_READONLY_VALUE_UPDATE; import static io.ballerina.runtime.internal.errors.ErrorReasons.INVALID_UPDATE_ERROR_IDENTIFIER; import static io.ballerina.runtime.internal.errors.ErrorReasons.getModulePrefixedReason; @@ -73,6 +75,27 @@ public void append(Object value) { add(size, value); } + @Override + public boolean equals(Object o, Set visitedValues) { + ValuePair compValuePair = new ValuePair(this, o); + if (visitedValues.contains(compValuePair)) { + return true; + } + visitedValues.add(compValuePair); + + ArrayValue arrayValue = (ArrayValue) o; + if (arrayValue.size() != this.size()) { + return false; + } + + for (int i = 0; i < this.size(); i++) { + if (!isEqual(this.get(i), arrayValue.get(i), visitedValues)) { + return false; + } + } + return true; + } + @Override public Object reverse() { throw new UnsupportedOperationException("reverse for tuple types is not supported directly."); @@ -269,5 +292,10 @@ public Object next() { public boolean hasNext() { return cursor < length; } + + @Override + public boolean equals(Object o, Set visitedValues) { + return o.equals(this); + } } } diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/CharIterator.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/CharIterator.java index fcc188ec901a..59c47fd76128 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/CharIterator.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/CharIterator.java @@ -18,6 +18,8 @@ package io.ballerina.runtime.internal.values; +import java.util.Set; + /** * {@code {@link CharIterator }} provides iterator implementation for Ballerina string values. * @@ -64,4 +66,23 @@ public boolean hasNext() { return cursor < length; } + /** + * @param o + * @param visitedValues + * @return + */ + @Override + public boolean equals(Object o, Set visitedValues) { + if (o == this) { + return true; + } + if (o instanceof RefValue refValue) { + if (visitedValues.contains(new ValuePair(this, refValue))) { + return true; + } + visitedValues.add(new ValuePair(this, refValue)); + return this.equals(refValue, visitedValues); + } + return o.equals(this); + } } diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/ErrorValue.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/ErrorValue.java index 2e36028bbcc7..3bb77213be98 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/ErrorValue.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/ErrorValue.java @@ -43,6 +43,7 @@ import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.Set; import java.util.StringJoiner; import static io.ballerina.runtime.api.PredefinedTypes.TYPE_MAP; @@ -447,4 +448,14 @@ private String cleanupClassName(String className) { private boolean isCompilerAddedName(String name) { return name != null && name.startsWith("$") && name.endsWith("$"); } + + /** + * @param o + * @param visitedValues + * @return + */ + @Override + public boolean equals(Object o, Set visitedValues) { + return o.equals(this); + } } diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/FPValue.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/FPValue.java index e2c28fb225c0..bafb591069ef 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/FPValue.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/FPValue.java @@ -28,6 +28,7 @@ import io.ballerina.runtime.internal.scheduling.Scheduler; import java.util.Map; +import java.util.Set; import java.util.function.Consumer; import java.util.function.Function; @@ -125,4 +126,14 @@ public BTypedesc getTypedesc() { public String toString() { return RuntimeConstants.EMPTY; } + + /** + * @param o + * @param visitedValues + * @return + */ + @Override + public boolean equals(Object o, Set visitedValues) { + return o.equals(this); + } } diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/FutureValue.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/FutureValue.java index a9c26ee2bcbb..609da2921480 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/FutureValue.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/FutureValue.java @@ -26,6 +26,7 @@ import io.ballerina.runtime.internal.types.BFutureType; import java.util.Map; + import java.util.Set; import java.util.StringJoiner; /** @@ -160,4 +161,14 @@ public boolean hasWaited() { public void setWaited(boolean waited) { this.waited = waited; } + + /** + * @param o + * @param visitedValues + * @return + */ + @Override + public boolean equals(Object o, Set visitedValues) { + return this.equals(o); + } } diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/HandleValue.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/HandleValue.java index f41b50630709..654f6b8603c2 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/HandleValue.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/HandleValue.java @@ -24,6 +24,7 @@ import io.ballerina.runtime.api.values.BTypedesc; import java.util.Map; +import java.util.Set; /** *

@@ -99,4 +100,14 @@ public Object frozenCopy(Map refs) { public static HandleValue valueOfJ(Object value) { return new HandleValue(value); } + + /** + * @param o + * @param visitedValues + * @return + */ + @Override + public boolean equals(Object o, Set visitedValues) { + return o.equals(this); + } } diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/MapValueImpl.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/MapValueImpl.java index 7110d33297da..fdb15b780b76 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/MapValueImpl.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/MapValueImpl.java @@ -65,6 +65,7 @@ import static io.ballerina.runtime.api.constants.RuntimeConstants.MAP_LANG_LIB; import static io.ballerina.runtime.api.utils.TypeUtils.getImpliedType; import static io.ballerina.runtime.internal.JsonInternalUtils.mergeJson; +import static io.ballerina.runtime.internal.TypeChecker.isEqual; import static io.ballerina.runtime.internal.ValueUtils.getTypedescValue; import static io.ballerina.runtime.internal.errors.ErrorCodes.INVALID_READONLY_VALUE_UPDATE; import static io.ballerina.runtime.internal.errors.ErrorReasons.INVALID_UPDATE_ERROR_IDENTIFIER; @@ -337,17 +338,24 @@ public boolean containsKey(Object key) { } @Override - public boolean equals(Object o) { + public boolean equals(Object o, Set visitedValues) { + ValuePair compValuePair = new ValuePair(this, o); + for (ValuePair valuePair : visitedValues) { + if (valuePair.equals(compValuePair, visitedValues)) { + return true; + } + } + visitedValues.add(compValuePair); + if (this == o) { return true; } - if (o == null || getClass() != o.getClass()) { - return false; + if (o == null || this.getClass() != o.getClass()) { + return false; } MapValueImpl mapValue = (MapValueImpl) o; - if (mapValue.type.getTag() != this.type.getTag()) { return false; } @@ -360,29 +368,18 @@ public boolean equals(Object o) { return false; } - if (hasCyclicReference(this, mapValue, new LinkedHashSet<>())) { + if (!this.keySet().containsAll(mapValue.keySet())) { return false; } - return entrySet().equals(mapValue.entrySet()); - } - - private boolean hasCyclicReference(MapValueImpl obj1, MapValueImpl obj2, - Set, MapValueImpl>> visited) { - if (visited.contains(Map.entry(obj1, obj2))) { - return true; // Cyclic reference detected. - } - visited.add(Map.entry(obj1, obj2)); // Mark this object pair as visited. - - for (Map.Entry entry : obj1.entrySet()) { - Object value = entry.getValue(); - if (value instanceof MapValueImpl) { - if (hasCyclicReference((MapValueImpl) value, obj2, visited)) { - return true; - } + Iterator> mapIterator = this.entrySet().iterator(); + while (mapIterator.hasNext()) { + Map.Entry lhsMapEntry = mapIterator.next(); + if (!isEqual(lhsMapEntry.getValue(), mapValue.get(lhsMapEntry.getKey()), visitedValues)) { + return false; } } - return false; // No cyclic references detected. + return true; } /** @@ -610,6 +607,18 @@ public Object next() { public boolean hasNext() { return iterator.hasNext(); } + + /** + * Check the equality of two iterators. + * + * @param o Object to be compared for equality + * @param visitedValues Visited values in recursive calls + * @return Boolean value indicating whether the given value is equal to this value + */ + @Override + public boolean equals(Object o, Set visitedValues) { + return o.equals(this); + } } /** diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RefValue.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RefValue.java index 7a1af9b0582a..d25417950444 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RefValue.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RefValue.java @@ -19,6 +19,8 @@ import io.ballerina.runtime.api.values.BRefValue; +import java.util.Set; + /** *

* Interface to be implemented by all the reference types. @@ -31,4 +33,5 @@ */ public interface RefValue extends SimpleValue, BRefValue { + boolean equals(Object o, Set visitedValues); } diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpAssertion.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpAssertion.java index e223d6d76d40..df96d6e59ce9 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpAssertion.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpAssertion.java @@ -19,6 +19,8 @@ import io.ballerina.runtime.api.values.BLink; +import java.util.Set; + /** *

* Represents an ReAssertion in a regular expression. @@ -40,4 +42,14 @@ public RegExpAssertion(String assertion) { public String stringValue(BLink parent) { return this.assertion; } + + /** + * @param o + * @param visitedValues + * @return + */ + @Override + public boolean equals(Object o, Set visitedValues) { + return o.equals(this); + } } diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpAtomQuantifier.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpAtomQuantifier.java index 5e400ffa8a6a..61d6e3b060bc 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpAtomQuantifier.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpAtomQuantifier.java @@ -21,6 +21,8 @@ import io.ballerina.runtime.api.values.BString; import io.ballerina.runtime.internal.regexp.RegExpFactory; +import java.util.Set; + import static io.ballerina.runtime.internal.util.StringUtils.getStringVal; /** @@ -75,4 +77,14 @@ private void validateInsertion(BString insertion) { public String stringValue(BLink parent) { return getStringVal(this.reAtom, parent) + this.reQuantifier.stringValue(parent); } + + /** + * @param o + * @param visitedValues + * @return + */ + @Override + public boolean equals(Object o, Set visitedValues) { + return o.equals(this); + } } diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpCapturingGroup.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpCapturingGroup.java index 80370ae581ab..3cbbbeee257d 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpCapturingGroup.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpCapturingGroup.java @@ -19,6 +19,8 @@ import io.ballerina.runtime.api.values.BLink; +import java.util.Set; + /** *

* Represents a capturing group, "(" ["?" ReFlagsOnOff ":"] ReDisjunction ")" in a regular expression. @@ -48,4 +50,14 @@ public String stringValue(BLink parent) { return this.openParen + this.flagExpr.stringValue(parent) + this.reDisjunction.stringValue(parent) + this.closeParen; } + + /** + * @param o + * @param visitedValues + * @return + */ + @Override + public boolean equals(Object o, Set visitedValues) { + return o.equals(this); + } } diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpCharSet.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpCharSet.java index 79d1e2612697..f0adb3d02da6 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpCharSet.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpCharSet.java @@ -21,6 +21,7 @@ import io.ballerina.runtime.api.values.BString; import io.ballerina.runtime.api.values.BValue; +import java.util.Set; import java.util.StringJoiner; /** @@ -79,4 +80,14 @@ public String stringValue(BLink parent) { } return atoms.toString(); } + + /** + * @param o + * @param visitedValues + * @return + */ + @Override + public boolean equals(Object o, Set visitedValues) { + return o.equals(this); + } } diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpCharSetRange.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpCharSetRange.java index 9a25df276e46..e9b47fbb5036 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpCharSetRange.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpCharSetRange.java @@ -19,6 +19,8 @@ import io.ballerina.runtime.api.values.BLink; +import java.util.Set; + /** *

* Represents an ReCharSetRange or ReCharSetRangeNoDash in regular expression. @@ -60,4 +62,14 @@ public void setRhsCharSetAom(String rhsCharSetAom) { public String stringValue(BLink parent) { return this.lhsCharSetAtom + this.dash + this.rhsCharSetAom; } + + /** + * @param o + * @param visitedValues + * @return + */ + @Override + public boolean equals(Object o, Set visitedValues) { + return o.equals(this); + } } diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpCharacterClass.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpCharacterClass.java index 057cab178ffe..8717ccbe3e1d 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpCharacterClass.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpCharacterClass.java @@ -19,6 +19,8 @@ import io.ballerina.runtime.api.values.BLink; +import java.util.Set; + /** *

* Represents a character class, "[" ["^"] [ReCharSet] "]" in a regular expression. @@ -63,4 +65,14 @@ public void setCharacterClassEnd(String characterClassEnd) { public String stringValue(BLink parent) { return this.characterClassStart + this.negation + this.reCharSet.stringValue(parent) + this.characterClassEnd; } + + /** + * @param o + * @param visitedValues + * @return + */ + @Override + public boolean equals(Object o, Set visitedValues) { + return o.equals(this); + } } diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpDisjunction.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpDisjunction.java index 96f0cbfb0cf5..151bf1fc2fb7 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpDisjunction.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpDisjunction.java @@ -19,6 +19,7 @@ import io.ballerina.runtime.api.values.BLink; +import java.util.Set; import java.util.StringJoiner; import static io.ballerina.runtime.internal.util.StringUtils.getStringVal; @@ -63,4 +64,14 @@ public String stringValue(BLink parent) { } return terms.toString(); } + + /** + * @param o + * @param visitedValues + * @return + */ + @Override + public boolean equals(Object o, Set visitedValues) { + return o.equals(this); + } } diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpFlagExpression.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpFlagExpression.java index 87052a6b8be5..51b4034660cf 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpFlagExpression.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpFlagExpression.java @@ -19,6 +19,8 @@ import io.ballerina.runtime.api.values.BLink; +import java.util.Set; + /** *

* Represents a flag expression, "?" ReFlagsOnOff ":" in regular expression. @@ -44,4 +46,14 @@ public RegExpFlagExpression(String questionMark, RegExpFlagOnOff flagsOnOff, Str public String stringValue(BLink parent) { return this.questionMark + this.flagsOnOff.stringValue(parent) + this.colon; } + + /** + * @param o + * @param visitedValues + * @return + */ + @Override + public boolean equals(Object o, Set visitedValues) { + return o.equals(this); + } } diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpFlagOnOff.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpFlagOnOff.java index ba0a466ba0b2..072e8a408d43 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpFlagOnOff.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpFlagOnOff.java @@ -19,6 +19,8 @@ import io.ballerina.runtime.api.values.BLink; +import java.util.Set; + /** *

* Represents an ReFlagsOnOff in regular expression. @@ -40,4 +42,14 @@ public RegExpFlagOnOff(String flags) { public String stringValue(BLink parent) { return this.flags; } + + /** + * @param o + * @param visitedValues + * @return + */ + @Override + public boolean equals(Object o, Set visitedValues) { + return o.equals(this); + } } diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpLiteralCharOrEscape.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpLiteralCharOrEscape.java index 83ff241bf249..56954e1fb25b 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpLiteralCharOrEscape.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpLiteralCharOrEscape.java @@ -19,6 +19,8 @@ import io.ballerina.runtime.api.values.BLink; +import java.util.Set; + /** *

* Represents a ReLiteralChar, ReEscape or "." in a regular expression. @@ -48,4 +50,14 @@ public void setCharOrEscape(String charOrEscape) { public String stringValue(BLink parent) { return this.charOrEscape; } + + /** + * @param o + * @param visitedValues + * @return + */ + @Override + public boolean equals(Object o, Set visitedValues) { + return o.equals(this); + } } diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpQuantifier.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpQuantifier.java index 1f5e6ef840d2..7a6f68ca7a41 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpQuantifier.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpQuantifier.java @@ -19,6 +19,8 @@ import io.ballerina.runtime.api.values.BLink; +import java.util.Set; + /** *

* Represents an ReQuantifier in regular expression. @@ -42,4 +44,14 @@ public RegExpQuantifier(String quantifier, String nonGreedyChar) { public String stringValue(BLink parent) { return this.quantifier + this.nonGreedyChar; } + + /** + * @param o + * @param visitedValues + * @return + */ + @Override + public boolean equals(Object o, Set visitedValues) { + return o.equals(this); + } } diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpSequence.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpSequence.java index 2992344571f5..3752a662a0ad 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpSequence.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpSequence.java @@ -19,6 +19,7 @@ import io.ballerina.runtime.api.values.BLink; +import java.util.Set; import java.util.StringJoiner; /** @@ -63,4 +64,14 @@ public String stringValue(BLink parent) { } return terms.toString(); } + + /** + * @param o + * @param visitedValues + * @return + */ + @Override + public boolean equals(Object o, Set visitedValues) { + return o.equals(this); + } } diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpValue.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpValue.java index 151a98822ca0..0485b28e2458 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpValue.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpValue.java @@ -23,6 +23,7 @@ import java.util.Map; import java.util.Objects; +import java.util.Set; import static io.ballerina.runtime.internal.ValueUtils.getTypedescValue; @@ -106,4 +107,14 @@ public void freezeDirect() { public String toString() { return this.stringValue(null); } + + /** + * @param o + * @param visitedValues + * @return + */ + @Override + public boolean equals(Object o, Set visitedValues) { + return o.equals(this); + } } diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/StreamValue.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/StreamValue.java index a0cb54eb1ff6..ce60baadbf37 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/StreamValue.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/StreamValue.java @@ -27,6 +27,7 @@ import io.ballerina.runtime.internal.types.BStreamType; import java.util.Map; +import java.util.Set; import java.util.UUID; /** @@ -140,4 +141,14 @@ public Type getCompletionType() { public String toString() { return stringValue(null); } + + /** + * @param o + * @param visitedValues + * @return + */ + @Override + public boolean equals(Object o, Set visitedValues) { + return o.equals(this); + } } diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/StreamingJsonValue.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/StreamingJsonValue.java index 944d7ed19579..8ed0805ed988 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/StreamingJsonValue.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/StreamingJsonValue.java @@ -30,6 +30,7 @@ import java.io.OutputStream; import java.io.Writer; import java.util.Map; +import java.util.Set; /** *

@@ -240,5 +241,15 @@ public boolean hasNext() { return array.datasource.hasNext(); } + + /** + * @param o + * @param visitedValues + * @return + */ + @Override + public boolean equals(Object o, Set visitedValues) { + return o.equals(this); + } } } diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/TableValueImpl.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/TableValueImpl.java index ed1fe926fb60..d7cb3c147605 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/TableValueImpl.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/TableValueImpl.java @@ -64,6 +64,8 @@ import java.util.concurrent.ConcurrentHashMap; import static io.ballerina.runtime.api.constants.RuntimeConstants.TABLE_LANG_LIB; +import static io.ballerina.runtime.api.utils.TypeUtils.getImpliedType; +import static io.ballerina.runtime.internal.TypeChecker.isEqual; import static io.ballerina.runtime.internal.ValueUtils.getTypedescValue; import static io.ballerina.runtime.internal.errors.ErrorReasons.INHERENT_TYPE_VIOLATION_ERROR_IDENTIFIER; import static io.ballerina.runtime.internal.errors.ErrorReasons.OPERATION_NOT_SUPPORTED_ERROR; @@ -469,6 +471,51 @@ public Type getIteratorNextReturnType() { return iteratorNextReturnType; } + /** + * Check whether the given table value is equal to the current value. + * + * @param o the value to check equality with + * @param visitedValues the values that have already been visited + * @return true if the current value is equal to the given value + */ + @Override + public boolean equals(Object o, Set visitedValues) { + ValuePair compValuePair = new ValuePair(this, o); + if (visitedValues.contains(compValuePair)) { + return true; + } + visitedValues.add(compValuePair); + + if (o == this) { + return true; + } + if (!(o instanceof TableValueImpl table)) { + return false; + } + if (this.size() != table.size()) { + return false; + } + if (this.getType().getTag() != table.getType().getTag()) { + return false; + } + + boolean isLhsKeyedTable = + ((BTableType) getImpliedType(this.getType())).getFieldNames().length > 0; + boolean isRhsKeyedTable = + ((BTableType) getImpliedType(table.getType())).getFieldNames().length > 0; + Object[] lhsTableValues = this.values().toArray(); + Object[] rhsTableValues = table.values().toArray(); + if (isLhsKeyedTable == isRhsKeyedTable) { + for (int i = 0; i < lhsTableValues.length; i++) { + if (!isEqual(lhsTableValues[i], rhsTableValues[i], visitedValues)) { + return false; + } + } + return true; + } + return false; + } + private class TableIterator implements IteratorValue { private long cursor; @@ -502,6 +549,30 @@ public Object next() { public boolean hasNext() { return cursor < noOfAddedEntries && values.size() != 0; } + + /** + * Check whether the given value is equal to the current value. + * + * @param o the value to check equality with + * @param visitedValues the values that have already been visited + * @return true if the current value is equal to the given value + */ + @Override + public boolean equals(Object o, Set visitedValues) { + if (o == this) { + return true; + } + + if (o instanceof RefValue refValue) { + ValuePair valuePair = new ValuePair(this, refValue); + if (visitedValues.contains(valuePair)) { + return true; + } + visitedValues.add(valuePair); + return refValue.equals(this, visitedValues); + } + return o.equals(this); + } } private class ValueHolder { @@ -605,7 +676,7 @@ public V getData(K key) { return null; } for (Map.Entry entry: entryList) { - if (TypeChecker.isEqual(key, entry.getKey())) { + if (isEqual(key, entry.getKey())) { return entry.getValue(); } } @@ -660,7 +731,7 @@ public V remove(K key) { List> entryList = entries.get(hash); if (entryList != null && entryList.size() > 1) { for (Map.Entry entry: entryList) { - if (TypeChecker.isEqual(key, entry.getKey())) { + if (isEqual(key, entry.getKey())) { List valueList = values.get(hash); valueList.remove(entry.getValue()); entryList.remove(entry); @@ -691,7 +762,7 @@ public boolean containsKey(K key) { if (keys.containsKey(TableUtils.hash(key, null))) { List> entryList = entries.get(TableUtils.hash(key, null)); for (Map.Entry entry: entryList) { - if (TypeChecker.isEqual(entry.getKey(), key)) { + if (isEqual(entry.getKey(), key)) { return true; } } diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/TupleValueImpl.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/TupleValueImpl.java index 1283cf5a11cc..709e96b53a25 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/TupleValueImpl.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/TupleValueImpl.java @@ -69,8 +69,8 @@ public class TupleValueImpl extends AbstractArrayValue { protected TupleType tupleType; protected Type type; Object[] refValues; - private int minSize; - private boolean hasRestElement; // cached value for ease of access + private final int minSize; + private final boolean hasRestElement; // cached value for ease of access private BTypedesc typedesc; private TypedescValueImpl inherentType; // ------------------------ Constructors ------------------------------------------------------------------- diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/TypedescValueImpl.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/TypedescValueImpl.java index 6d014bcf16ed..07bfbe5a71b0 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/TypedescValueImpl.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/TypedescValueImpl.java @@ -31,6 +31,7 @@ import io.ballerina.runtime.internal.types.BTypedescType; import java.util.Map; +import java.util.Set; import static io.ballerina.runtime.api.utils.TypeUtils.getImpliedType; @@ -152,4 +153,19 @@ public BTypedesc getTypedesc() { public Object frozenCopy(Map refs) { return this; } + + /** + * @param o + * @param visitedValues + * @return + */ + @Override + public boolean equals(Object o, Set visitedValues) { + if (o == this) { + return true; + } + TypedescValueImpl other = (TypedescValueImpl) o; +// return other.describingType == this.describingType; + return other.equals(this); + } } diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/ValuePair.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/ValuePair.java new file mode 100644 index 000000000000..f2e4e42c4676 --- /dev/null +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/ValuePair.java @@ -0,0 +1,126 @@ +/* + * Copyright (c) 2023, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. + * + * WSO2 LLC. licenses this file to you 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 io.ballerina.runtime.internal.values; + +import io.ballerina.runtime.api.types.Type; +import io.ballerina.runtime.api.values.BLink; +import io.ballerina.runtime.api.values.BTypedesc; + +import java.util.LinkedHashSet; +import java.util.Map; +import java.util.Set; + +/** + * Unordered value vector of size two, to hold two values being compared. + * + * @since 2201.9.0 + */ + +public class ValuePair implements RefValue { + + Set valuePairSet = new LinkedHashSet<>(2); + + public ValuePair(Object obj1, Object obj2) { + valuePairSet.add(obj1); + valuePairSet.add(obj2); + } + + @Override + public boolean equals(Object o, Set visitedValues) { + if (!(o instanceof ValuePair valuePair)) { + return false; + } + + Set otherSet = valuePair.valuePairSet; + Set currentSet = this.valuePairSet; + if (otherSet.size() != currentSet.size()) { + return false; + } + + for (Object otherObj : otherSet) { + if (!currentSet.contains(otherObj)) { + return false; + } + } + return true; + } + + /** + * @return + */ + @Override + public BTypedesc getTypedesc() { + + return null; + } + + /** + * Method to perform a deep copy, recursively copying all structural values and their members. + * + * @param refs The map which keep track of the references of already cloned values in cycles + * @return A new copy of the value + */ + @Override + public Object copy(Map refs) { + + return null; + } + + /** + * Method to performs a deep copy, recursively copying all structural values and their members but the created + * clone is a read-only value. + * + * @param refs The map which keep track of the references of already cloned values in cycles + * @return A new copy of the value + */ + @Override + public Object frozenCopy(Map refs) { + + return null; + } + + /** + * @param parent + * @return + */ + @Override + public String stringValue(BLink parent) { + + return null; + } + + /** + * @param parent + * @return + */ + @Override + public String expressionStringValue(BLink parent) { + + return null; + } + + /** + * @return + */ + @Override + public Type getType() { + + return null; + } +} diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlComment.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlComment.java index 71e346c5cecf..47af93dd80e1 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlComment.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlComment.java @@ -25,6 +25,7 @@ import java.util.Map; import java.util.NoSuchElementException; import java.util.Objects; +import java.util.Set; /** * XML nodes containing comment data. @@ -64,6 +65,11 @@ public Object next() { throw new NoSuchElementException(); } } + + @Override + public boolean equals(Object o, Set visitedValues) { + return o.equals(this); + } }; } @@ -119,4 +125,17 @@ public int hashCode() { public boolean equals(Object obj) { return this == obj; } + + /** + * @param o + * @param visitedValues + * @return + */ + @Override + public boolean equals(Object o, Set visitedValues) { + if (this == o) { + return true; + } + return o.equals(this); + } } diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlItem.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlItem.java index 842256465bd4..067a54343609 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlItem.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlItem.java @@ -48,6 +48,7 @@ import java.util.Map; import java.util.NoSuchElementException; import java.util.Objects; +import java.util.Set; import javax.xml.XMLConstants; import javax.xml.namespace.QName; @@ -660,6 +661,26 @@ public BXmlSequence getChildrenSeq() { public IteratorValue getIterator() { XmlItem that = this; return new IteratorValue() { + /** + * @param o + * @param visitedValues + * @return + */ + @Override + public boolean equals(Object o, Set visitedValues) { + if (o == this) { + return true; + } + if (o instanceof RefValue refValue) { + if (visitedValues.contains(new ValuePair(this, refValue))) { + return true; + } + visitedValues.add(new ValuePair(this, refValue)); + return refValue.equals(this, visitedValues); + } + return o.equals(this); + } + boolean read = false; @Override @@ -683,6 +704,26 @@ public int hashCode() { return Objects.hash(name, children, attributes, probableParents); } + /** + * @param o + * @param visitedValues + * @return + */ + @Override + public boolean equals(Object o, Set visitedValues) { + if (o == this) { + return true; + } + if (o instanceof RefValue refValue) { + if (visitedValues.contains(new ValuePair(this, refValue))) { + return true; + } + visitedValues.add(new ValuePair(this, refValue)); + return this.equals(o, visitedValues); + } + return o.equals(this); + } + private interface SetAttributeFunction { void set(String localName, String namespace, String prefix, String value); } diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlNonElementItem.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlNonElementItem.java index 0a40cc982b3c..cec2ab1e0e95 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlNonElementItem.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlNonElementItem.java @@ -35,6 +35,7 @@ import java.nio.charset.StandardCharsets; import java.util.List; import java.util.NoSuchElementException; +import java.util.Set; import static io.ballerina.runtime.api.constants.RuntimeConstants.STRING_NULL_VALUE; @@ -178,6 +179,19 @@ public void removeChildren(String qname) { @Override public IteratorValue getIterator() { return new IteratorValue() { + /** + * @param o The reference value to be compared + * @param visitedValues Temporary set to keep already visited values + * @return boolean value indicating whether the given value is equal to this value + */ + @Override + public boolean equals(Object o, Set visitedValues) { + if (o == this) { + return true; + } + return o.equals(this); + } + @Override public boolean hasNext() { return false; diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlPi.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlPi.java index 1f50617f219f..7fd058025777 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlPi.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlPi.java @@ -25,6 +25,7 @@ import java.util.Map; import java.util.NoSuchElementException; import java.util.Objects; +import java.util.Set; /** * XML nodes containing processing instructions. @@ -53,6 +54,16 @@ public XmlPi(String data, String target, boolean readonly) { public IteratorValue getIterator() { XmlPi that = this; return new IteratorValue() { + /** + * @param o + * @param visitedValues + * @return + */ + @Override + public boolean equals(Object o, Set visitedValues) { + return o.equals(that); + } + boolean read = false; @Override public boolean hasNext() { @@ -127,4 +138,24 @@ public int hashCode() { public String stringValue(BLink parent) { return ""; } + + /** + * @param o + * @param visitedValues + * @return + */ + @Override + public boolean equals(Object o, Set visitedValues) { + if (o == this) { + return true; + } + if (o instanceof XmlPi) { + if (visitedValues.contains(new ValuePair(o, this))) { + return true; + } + visitedValues.add(new ValuePair(o, this)); + return ((XmlPi) o).equals(o, visitedValues); + } + return false; + } } diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlQName.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlQName.java index 6ef15a47244b..5cef00696729 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlQName.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlQName.java @@ -26,6 +26,7 @@ import java.util.Map; import java.util.Objects; +import java.util.Set; import static io.ballerina.runtime.internal.ValueUtils.getTypedescValue; @@ -185,4 +186,14 @@ public String getPrefix() { public void setPrefix(String prefix) { this.prefix = prefix; } + + /** + * @param o + * @param visitedValues + * @return + */ + @Override + public boolean equals(Object o, Set visitedValues) { + return o.equals(this); + } } diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlSequence.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlSequence.java index e37e0e0f93db..cce8ae238cb0 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlSequence.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlSequence.java @@ -611,6 +611,22 @@ public boolean isFrozen() { @Override public IteratorValue getIterator() { return new IteratorValue() { + + @Override + public boolean equals(Object o, Set visitedValues) { + if (o == this) { + return true; + } + if (o instanceof RefValue refValue) { + if (visitedValues.contains(new ValuePair(this, refValue))) { + return true; + } + visitedValues.add(new ValuePair(this, refValue)); + return this.equals(refValue, visitedValues); + } + return o.equals(this); + } + Iterator iterator = children.iterator(); @Override @@ -660,4 +676,24 @@ public Type getIteratorNextReturnType() { } return iteratorNextReturnType; } + + /** + * @param o + * @param visitedValues + * @return + */ + @Override + public boolean equals(Object o, Set visitedValues) { + if (o == this) { + return true; + } + if (o instanceof XmlSequence) { + if (visitedValues.contains(new ValuePair(this, o))) { + return true; + } + visitedValues.add(new ValuePair(this, o)); + return ((XmlSequence) o).equals(o, visitedValues); + } + return false; + } } diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlText.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlText.java index 0f516fb0965c..aac0d06a75f6 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlText.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlText.java @@ -26,6 +26,7 @@ import java.util.Map; import java.util.NoSuchElementException; import java.util.Objects; +import java.util.Set; /** * XML nodes containing atomic content such as text, comment and processing instructions. @@ -94,6 +95,16 @@ public OMNode value() { public IteratorValue getIterator() { XmlText that = this; return new IteratorValue() { + /** + * @param o + * @param visitedValues + * @return + */ + @Override + public boolean equals(Object o, Set visitedValues) { + return o.equals(this); + } + boolean read = false; @Override public boolean hasNext() { @@ -126,4 +137,14 @@ public int hashCode() { public Type getType() { return this.type; } + + /** + * @param o + * @param visitedValues + * @return + */ + @Override + public boolean equals(Object o, Set visitedValues) { + return o.equals(this); + } } From 7f86f7a86838ec1bccc8c799649401d860ea00a0 Mon Sep 17 00:00:00 2001 From: gabilang Date: Thu, 23 Nov 2023 14:01:53 +0530 Subject: [PATCH 03/15] Remove type tags equality checks for maps --- .../runtime/internal/values/MapValueImpl.java | 11 +------ .../internal/values/TupleValueImpl.java | 32 +++++++++++++++---- 2 files changed, 26 insertions(+), 17 deletions(-) diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/MapValueImpl.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/MapValueImpl.java index fdb15b780b76..f2386a77fbcc 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/MapValueImpl.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/MapValueImpl.java @@ -351,16 +351,7 @@ public boolean equals(Object o, Set visitedValues) { return true; } - if (o == null || this.getClass() != o.getClass()) { - return false; - } - - MapValueImpl mapValue = (MapValueImpl) o; - if (mapValue.type.getTag() != this.type.getTag()) { - return false; - } - - if (mapValue.referredType.getTag() != this.referredType.getTag()) { + if (!(o instanceof MapValueImpl mapValue)) { return false; } diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/TupleValueImpl.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/TupleValueImpl.java index 709e96b53a25..c2c54b5883d7 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/TupleValueImpl.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/TupleValueImpl.java @@ -43,10 +43,12 @@ import java.util.Arrays; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.StringJoiner; import java.util.stream.IntStream; import static io.ballerina.runtime.api.constants.RuntimeConstants.ARRAY_LANG_LIB; +import static io.ballerina.runtime.internal.TypeChecker.isEqual; import static io.ballerina.runtime.internal.ValueUtils.getTypedescValue; import static io.ballerina.runtime.internal.errors.ErrorReasons.INDEX_OUT_OF_RANGE_ERROR_IDENTIFIER; import static io.ballerina.runtime.internal.errors.ErrorReasons.INHERENT_TYPE_VIOLATION_ERROR_IDENTIFIER; @@ -76,20 +78,36 @@ public class TupleValueImpl extends AbstractArrayValue { // ------------------------ Constructors ------------------------------------------------------------------- @Override - public boolean equals(Object o) { + public boolean equals(Object o, Set visitedValues) { + ValuePair compValuePair = new ValuePair(this, o); + if (visitedValues.contains(compValuePair)) { + return true; + } + visitedValues.add(compValuePair); + if (this == o) { return true; } - if (o == null || getClass() != o.getClass()) { + if (!(o instanceof ArrayValue arrayValue)) { + return false; + } + if (arrayValue.size() != this.size()) { return false; } + for (int i = 0; i < this.size(); i++) { + if (!isEqual(this.get(i), arrayValue.get(i), visitedValues)) { + return false; + } + } - TupleValueImpl that = (TupleValueImpl) o; - return minSize == that.minSize && - hasRestElement == that.hasRestElement && - type.equals(that.type) && - Arrays.equals(refValues, that.refValues); + if (arrayValue instanceof TupleValueImpl that) { + return minSize == that.minSize && + hasRestElement == that.hasRestElement && + type.equals(that.type) && + Arrays.equals(refValues, that.refValues); + } + return true; } public TupleValueImpl(Object[] values, TupleType type) { From 86b63d07bc9e6f4923c0d672613212236e34d957 Mon Sep 17 00:00:00 2001 From: gabilang Date: Mon, 27 Nov 2023 01:56:34 +0530 Subject: [PATCH 04/15] Fix equals methods of table and tuple values --- .../runtime/internal/TypeChecker.java | 7 ++-- .../internal/values/TableValueImpl.java | 17 ++++----- .../internal/values/TupleValueImpl.java | 35 ------------------- 3 files changed, 10 insertions(+), 49 deletions(-) diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/TypeChecker.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/TypeChecker.java index dd0a2e266a49..b6ed8d17e63f 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/TypeChecker.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/TypeChecker.java @@ -554,10 +554,10 @@ public static Object getAnnotValue(TypedescValue typedescValue, BString annotTag * * @param sourceType type to check * @param targetType type to compare with - * @return flag indicating the the equivalence of the two types + * @return flag indicating the equivalence of the two types */ public static boolean checkIsType(Type sourceType, Type targetType) { - return checkIsType(sourceType, targetType, (List) null); + return checkIsType(sourceType, targetType, null); } @Deprecated @@ -2475,11 +2475,10 @@ private static boolean isLikeAnydataType(Object[] objects, List u private static boolean checkIsLikeTupleType(Object sourceValue, BTupleType targetType, List unresolvedValues, boolean allowNumericConversion) { - if (!(sourceValue instanceof ArrayValue)) { + if (!(sourceValue instanceof ArrayValue source)) { return false; } - ArrayValue source = (ArrayValue) sourceValue; List targetTypes = targetType.getTupleTypes(); int sourceTypeSize = source.size(); int targetTypeSize = targetTypes.size(); diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/TableValueImpl.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/TableValueImpl.java index d7cb3c147605..648730c86212 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/TableValueImpl.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/TableValueImpl.java @@ -495,9 +495,6 @@ public boolean equals(Object o, Set visitedValues) { if (this.size() != table.size()) { return false; } - if (this.getType().getTag() != table.getType().getTag()) { - return false; - } boolean isLhsKeyedTable = ((BTableType) getImpliedType(this.getType())).getFieldNames().length > 0; @@ -505,15 +502,15 @@ public boolean equals(Object o, Set visitedValues) { ((BTableType) getImpliedType(table.getType())).getFieldNames().length > 0; Object[] lhsTableValues = this.values().toArray(); Object[] rhsTableValues = table.values().toArray(); - if (isLhsKeyedTable == isRhsKeyedTable) { - for (int i = 0; i < lhsTableValues.length; i++) { - if (!isEqual(lhsTableValues[i], rhsTableValues[i], visitedValues)) { - return false; - } + if (isLhsKeyedTable != isRhsKeyedTable) { + return false; + } + for (int i = 0; i < lhsTableValues.length; i++) { + if (!isEqual(lhsTableValues[i], rhsTableValues[i], visitedValues)) { + return false; } - return true; } - return false; + return true; } private class TableIterator implements IteratorValue { diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/TupleValueImpl.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/TupleValueImpl.java index c2c54b5883d7..2fdfb69213ce 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/TupleValueImpl.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/TupleValueImpl.java @@ -43,12 +43,10 @@ import java.util.Arrays; import java.util.List; import java.util.Map; -import java.util.Set; import java.util.StringJoiner; import java.util.stream.IntStream; import static io.ballerina.runtime.api.constants.RuntimeConstants.ARRAY_LANG_LIB; -import static io.ballerina.runtime.internal.TypeChecker.isEqual; import static io.ballerina.runtime.internal.ValueUtils.getTypedescValue; import static io.ballerina.runtime.internal.errors.ErrorReasons.INDEX_OUT_OF_RANGE_ERROR_IDENTIFIER; import static io.ballerina.runtime.internal.errors.ErrorReasons.INHERENT_TYPE_VIOLATION_ERROR_IDENTIFIER; @@ -77,39 +75,6 @@ public class TupleValueImpl extends AbstractArrayValue { private TypedescValueImpl inherentType; // ------------------------ Constructors ------------------------------------------------------------------- - @Override - public boolean equals(Object o, Set visitedValues) { - ValuePair compValuePair = new ValuePair(this, o); - if (visitedValues.contains(compValuePair)) { - return true; - } - visitedValues.add(compValuePair); - - if (this == o) { - return true; - } - - if (!(o instanceof ArrayValue arrayValue)) { - return false; - } - if (arrayValue.size() != this.size()) { - return false; - } - for (int i = 0; i < this.size(); i++) { - if (!isEqual(this.get(i), arrayValue.get(i), visitedValues)) { - return false; - } - } - - if (arrayValue instanceof TupleValueImpl that) { - return minSize == that.minSize && - hasRestElement == that.hasRestElement && - type.equals(that.type) && - Arrays.equals(refValues, that.refValues); - } - return true; - } - public TupleValueImpl(Object[] values, TupleType type) { this.refValues = values; this.type = this.tupleType = type; From ca3febe83485b4682a65fa551f3242a36af2b1d5 Mon Sep 17 00:00:00 2001 From: gabilang Date: Wed, 29 Nov 2023 16:30:57 +0530 Subject: [PATCH 05/15] Fix StackOverflow with array values --- .../internal/values/AbstractArrayValue.java | 6 ++-- .../internal/values/ArrayValueImpl.java | 28 ++++++++++++++++++- .../internal/values/TableValueImpl.java | 6 ++-- 3 files changed, 35 insertions(+), 5 deletions(-) diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/AbstractArrayValue.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/AbstractArrayValue.java index 9dd1b4b331c6..4919390014ab 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/AbstractArrayValue.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/AbstractArrayValue.java @@ -78,8 +78,10 @@ public void append(Object value) { @Override public boolean equals(Object o, Set visitedValues) { ValuePair compValuePair = new ValuePair(this, o); - if (visitedValues.contains(compValuePair)) { - return true; + for (ValuePair valuePair : visitedValues) { + if (valuePair.equals(compValuePair, visitedValues)) { + return true; + } } visitedValues.add(compValuePair); diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/ArrayValueImpl.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/ArrayValueImpl.java index 59543d47ce2b..49f790c03539 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/ArrayValueImpl.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/ArrayValueImpl.java @@ -45,9 +45,14 @@ import java.io.IOException; import java.io.OutputStream; import java.nio.charset.Charset; +import java.util.ArrayList; import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.Set; import java.util.StringJoiner; import java.util.stream.IntStream; @@ -1291,7 +1296,7 @@ private int getCurrentArrayLength() { @Override public int hashCode() { int result = Objects.hash(type, elementType); - result = 31 * result + Arrays.hashCode(refValues); + result = 31 * result + calculateHashCode(new ArrayList<>()); result = 31 * result + Arrays.hashCode(intValues); result = 31 * result + Arrays.hashCode(booleanValues); result = 31 * result + Arrays.hashCode(byteValues); @@ -1299,4 +1304,25 @@ public int hashCode() { result = 31 * result + Arrays.hashCode(bStringValues); return result; } + + private int calculateHashCode(List visited) { + if (refValues == null) { + return 0; + } + + int result = 1; + if (visited.contains(refValues)) { + return 31 * result + System.identityHashCode(refValues); + } + visited.add(refValues); + + for (Object ref : refValues) { + if (ref instanceof ArrayValueImpl) { + result = 31 * result + calculateHashCode(visited); + } else { + result = 31 * result + (ref == null ? 0 : ref.hashCode()); + } + } + return result; + } } diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/TableValueImpl.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/TableValueImpl.java index 648730c86212..c11a54d54b22 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/TableValueImpl.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/TableValueImpl.java @@ -481,8 +481,10 @@ public Type getIteratorNextReturnType() { @Override public boolean equals(Object o, Set visitedValues) { ValuePair compValuePair = new ValuePair(this, o); - if (visitedValues.contains(compValuePair)) { - return true; + for (ValuePair valuePair : visitedValues) { + if (valuePair.equals(compValuePair, visitedValues)) { + return true; + } } visitedValues.add(compValuePair); From a1b5fcb7fe76e1c1392b7af45347c1a8bf78e613 Mon Sep 17 00:00:00 2001 From: gabilang Date: Wed, 29 Nov 2023 16:32:02 +0530 Subject: [PATCH 06/15] Fix checkstyle warnings --- .../runtime/internal/values/CharIterator.java | 15 ------- .../runtime/internal/values/ErrorValue.java | 5 --- .../runtime/internal/values/FPValue.java | 5 --- .../runtime/internal/values/FutureValue.java | 5 --- .../runtime/internal/values/HandleValue.java | 5 --- .../runtime/internal/values/MapValueImpl.java | 7 ---- .../internal/values/RegExpAssertion.java | 5 --- .../internal/values/RegExpAtomQuantifier.java | 5 --- .../internal/values/RegExpCapturingGroup.java | 5 --- .../internal/values/RegExpCharSet.java | 5 --- .../internal/values/RegExpCharSetRange.java | 5 --- .../internal/values/RegExpCharacterClass.java | 5 --- .../internal/values/RegExpDisjunction.java | 5 --- .../internal/values/RegExpFlagExpression.java | 5 --- .../internal/values/RegExpFlagOnOff.java | 7 +--- .../values/RegExpLiteralCharOrEscape.java | 5 --- .../internal/values/RegExpQuantifier.java | 9 +---- .../internal/values/RegExpSequence.java | 5 --- .../runtime/internal/values/RegExpValue.java | 5 --- .../runtime/internal/values/StreamValue.java | 5 --- .../internal/values/StreamingJsonValue.java | 5 --- .../internal/values/TypedescValueImpl.java | 13 +++++- .../runtime/internal/values/ValuePair.java | 33 --------------- .../runtime/internal/values/XmlComment.java | 8 ---- .../runtime/internal/values/XmlItem.java | 40 +++---------------- .../internal/values/XmlNonElementItem.java | 18 +++------ .../runtime/internal/values/XmlPi.java | 25 +++--------- .../runtime/internal/values/XmlQName.java | 5 --- .../runtime/internal/values/XmlSequence.java | 26 +++--------- .../runtime/internal/values/XmlText.java | 15 +++---- 30 files changed, 39 insertions(+), 267 deletions(-) diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/CharIterator.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/CharIterator.java index 59c47fd76128..a7228079ef54 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/CharIterator.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/CharIterator.java @@ -66,23 +66,8 @@ public boolean hasNext() { return cursor < length; } - /** - * @param o - * @param visitedValues - * @return - */ @Override public boolean equals(Object o, Set visitedValues) { - if (o == this) { - return true; - } - if (o instanceof RefValue refValue) { - if (visitedValues.contains(new ValuePair(this, refValue))) { - return true; - } - visitedValues.add(new ValuePair(this, refValue)); - return this.equals(refValue, visitedValues); - } return o.equals(this); } } diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/ErrorValue.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/ErrorValue.java index 3bb77213be98..1d5dd6bc0810 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/ErrorValue.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/ErrorValue.java @@ -449,11 +449,6 @@ private boolean isCompilerAddedName(String name) { return name != null && name.startsWith("$") && name.endsWith("$"); } - /** - * @param o - * @param visitedValues - * @return - */ @Override public boolean equals(Object o, Set visitedValues) { return o.equals(this); diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/FPValue.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/FPValue.java index bafb591069ef..00e68c065f46 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/FPValue.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/FPValue.java @@ -127,11 +127,6 @@ public String toString() { return RuntimeConstants.EMPTY; } - /** - * @param o - * @param visitedValues - * @return - */ @Override public boolean equals(Object o, Set visitedValues) { return o.equals(this); diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/FutureValue.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/FutureValue.java index 609da2921480..e0576038f4f2 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/FutureValue.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/FutureValue.java @@ -162,11 +162,6 @@ public void setWaited(boolean waited) { this.waited = waited; } - /** - * @param o - * @param visitedValues - * @return - */ @Override public boolean equals(Object o, Set visitedValues) { return this.equals(o); diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/HandleValue.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/HandleValue.java index 654f6b8603c2..ccc9e3ef86f8 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/HandleValue.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/HandleValue.java @@ -101,11 +101,6 @@ public static HandleValue valueOfJ(Object value) { return new HandleValue(value); } - /** - * @param o - * @param visitedValues - * @return - */ @Override public boolean equals(Object o, Set visitedValues) { return o.equals(this); diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/MapValueImpl.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/MapValueImpl.java index f2386a77fbcc..6a4da4a66128 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/MapValueImpl.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/MapValueImpl.java @@ -599,13 +599,6 @@ public boolean hasNext() { return iterator.hasNext(); } - /** - * Check the equality of two iterators. - * - * @param o Object to be compared for equality - * @param visitedValues Visited values in recursive calls - * @return Boolean value indicating whether the given value is equal to this value - */ @Override public boolean equals(Object o, Set visitedValues) { return o.equals(this); diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpAssertion.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpAssertion.java index df96d6e59ce9..da3d0216f0fa 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpAssertion.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpAssertion.java @@ -43,11 +43,6 @@ public String stringValue(BLink parent) { return this.assertion; } - /** - * @param o - * @param visitedValues - * @return - */ @Override public boolean equals(Object o, Set visitedValues) { return o.equals(this); diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpAtomQuantifier.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpAtomQuantifier.java index 61d6e3b060bc..fdc377d2b932 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpAtomQuantifier.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpAtomQuantifier.java @@ -78,11 +78,6 @@ public String stringValue(BLink parent) { return getStringVal(this.reAtom, parent) + this.reQuantifier.stringValue(parent); } - /** - * @param o - * @param visitedValues - * @return - */ @Override public boolean equals(Object o, Set visitedValues) { return o.equals(this); diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpCapturingGroup.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpCapturingGroup.java index 3cbbbeee257d..ebeb4ecef64c 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpCapturingGroup.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpCapturingGroup.java @@ -51,11 +51,6 @@ public String stringValue(BLink parent) { + this.closeParen; } - /** - * @param o - * @param visitedValues - * @return - */ @Override public boolean equals(Object o, Set visitedValues) { return o.equals(this); diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpCharSet.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpCharSet.java index f0adb3d02da6..03efa8a00793 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpCharSet.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpCharSet.java @@ -81,11 +81,6 @@ public String stringValue(BLink parent) { return atoms.toString(); } - /** - * @param o - * @param visitedValues - * @return - */ @Override public boolean equals(Object o, Set visitedValues) { return o.equals(this); diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpCharSetRange.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpCharSetRange.java index e9b47fbb5036..5625b77a652d 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpCharSetRange.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpCharSetRange.java @@ -63,11 +63,6 @@ public String stringValue(BLink parent) { return this.lhsCharSetAtom + this.dash + this.rhsCharSetAom; } - /** - * @param o - * @param visitedValues - * @return - */ @Override public boolean equals(Object o, Set visitedValues) { return o.equals(this); diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpCharacterClass.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpCharacterClass.java index 8717ccbe3e1d..2a68a6571f25 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpCharacterClass.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpCharacterClass.java @@ -66,11 +66,6 @@ public String stringValue(BLink parent) { return this.characterClassStart + this.negation + this.reCharSet.stringValue(parent) + this.characterClassEnd; } - /** - * @param o - * @param visitedValues - * @return - */ @Override public boolean equals(Object o, Set visitedValues) { return o.equals(this); diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpDisjunction.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpDisjunction.java index 151bf1fc2fb7..3cb1d2a7c372 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpDisjunction.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpDisjunction.java @@ -65,11 +65,6 @@ public String stringValue(BLink parent) { return terms.toString(); } - /** - * @param o - * @param visitedValues - * @return - */ @Override public boolean equals(Object o, Set visitedValues) { return o.equals(this); diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpFlagExpression.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpFlagExpression.java index 51b4034660cf..3a19846ec874 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpFlagExpression.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpFlagExpression.java @@ -47,11 +47,6 @@ public String stringValue(BLink parent) { return this.questionMark + this.flagsOnOff.stringValue(parent) + this.colon; } - /** - * @param o - * @param visitedValues - * @return - */ @Override public boolean equals(Object o, Set visitedValues) { return o.equals(this); diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpFlagOnOff.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpFlagOnOff.java index 072e8a408d43..b8b5229c40f3 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpFlagOnOff.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpFlagOnOff.java @@ -32,7 +32,7 @@ * @since 2201.3.0 */ public class RegExpFlagOnOff extends RegExpCommonValue { - private String flags; + private final String flags; public RegExpFlagOnOff(String flags) { this.flags = flags; @@ -43,11 +43,6 @@ public String stringValue(BLink parent) { return this.flags; } - /** - * @param o - * @param visitedValues - * @return - */ @Override public boolean equals(Object o, Set visitedValues) { return o.equals(this); diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpLiteralCharOrEscape.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpLiteralCharOrEscape.java index 56954e1fb25b..72bc068b65d3 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpLiteralCharOrEscape.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpLiteralCharOrEscape.java @@ -51,11 +51,6 @@ public String stringValue(BLink parent) { return this.charOrEscape; } - /** - * @param o - * @param visitedValues - * @return - */ @Override public boolean equals(Object o, Set visitedValues) { return o.equals(this); diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpQuantifier.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpQuantifier.java index 7a6f68ca7a41..48827f9c63e8 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpQuantifier.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpQuantifier.java @@ -32,8 +32,8 @@ * @since 2201.3.0 */ public class RegExpQuantifier extends RegExpCommonValue { - private String quantifier; - private String nonGreedyChar; + private final String quantifier; + private final String nonGreedyChar; public RegExpQuantifier(String quantifier, String nonGreedyChar) { this.quantifier = quantifier; @@ -45,11 +45,6 @@ public String stringValue(BLink parent) { return this.quantifier + this.nonGreedyChar; } - /** - * @param o - * @param visitedValues - * @return - */ @Override public boolean equals(Object o, Set visitedValues) { return o.equals(this); diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpSequence.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpSequence.java index 3752a662a0ad..9128d07e49d4 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpSequence.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpSequence.java @@ -65,11 +65,6 @@ public String stringValue(BLink parent) { return terms.toString(); } - /** - * @param o - * @param visitedValues - * @return - */ @Override public boolean equals(Object o, Set visitedValues) { return o.equals(this); diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpValue.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpValue.java index 0485b28e2458..017927bb8169 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpValue.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpValue.java @@ -108,11 +108,6 @@ public String toString() { return this.stringValue(null); } - /** - * @param o - * @param visitedValues - * @return - */ @Override public boolean equals(Object o, Set visitedValues) { return o.equals(this); diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/StreamValue.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/StreamValue.java index ce60baadbf37..9116a9d68830 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/StreamValue.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/StreamValue.java @@ -142,11 +142,6 @@ public String toString() { return stringValue(null); } - /** - * @param o - * @param visitedValues - * @return - */ @Override public boolean equals(Object o, Set visitedValues) { return o.equals(this); diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/StreamingJsonValue.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/StreamingJsonValue.java index 8ed0805ed988..41029012f257 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/StreamingJsonValue.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/StreamingJsonValue.java @@ -242,11 +242,6 @@ public boolean hasNext() { return array.datasource.hasNext(); } - /** - * @param o - * @param visitedValues - * @return - */ @Override public boolean equals(Object o, Set visitedValues) { return o.equals(this); diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/TypedescValueImpl.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/TypedescValueImpl.java index 07bfbe5a71b0..4195a5fe35b4 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/TypedescValueImpl.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/TypedescValueImpl.java @@ -161,11 +161,20 @@ public Object frozenCopy(Map refs) { */ @Override public boolean equals(Object o, Set visitedValues) { + ValuePair compValuePair = new ValuePair(this, o); + for (ValuePair valuePair : visitedValues) { + if (valuePair.equals(compValuePair, visitedValues)) { + return true; + } + } + visitedValues.add(compValuePair); + if (o == this) { return true; } - TypedescValueImpl other = (TypedescValueImpl) o; -// return other.describingType == this.describingType; + if (!(o instanceof TypedescValueImpl other)) { + return false; + } return other.equals(this); } } diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/ValuePair.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/ValuePair.java index f2e4e42c4676..418b0c7ae41a 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/ValuePair.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/ValuePair.java @@ -61,66 +61,33 @@ public boolean equals(Object o, Set visitedValues) { return true; } - /** - * @return - */ @Override public BTypedesc getTypedesc() { - return null; } - /** - * Method to perform a deep copy, recursively copying all structural values and their members. - * - * @param refs The map which keep track of the references of already cloned values in cycles - * @return A new copy of the value - */ @Override public Object copy(Map refs) { - return null; } - /** - * Method to performs a deep copy, recursively copying all structural values and their members but the created - * clone is a read-only value. - * - * @param refs The map which keep track of the references of already cloned values in cycles - * @return A new copy of the value - */ @Override public Object frozenCopy(Map refs) { - return null; } - /** - * @param parent - * @return - */ @Override public String stringValue(BLink parent) { - return null; } - /** - * @param parent - * @return - */ @Override public String expressionStringValue(BLink parent) { - return null; } - /** - * @return - */ @Override public Type getType() { - return null; } } diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlComment.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlComment.java index 47af93dd80e1..c000c4ca431b 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlComment.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlComment.java @@ -126,16 +126,8 @@ public boolean equals(Object obj) { return this == obj; } - /** - * @param o - * @param visitedValues - * @return - */ @Override public boolean equals(Object o, Set visitedValues) { - if (this == o) { - return true; - } return o.equals(this); } } diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlItem.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlItem.java index 067a54343609..f149235d43aa 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlItem.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlItem.java @@ -661,26 +661,6 @@ public BXmlSequence getChildrenSeq() { public IteratorValue getIterator() { XmlItem that = this; return new IteratorValue() { - /** - * @param o - * @param visitedValues - * @return - */ - @Override - public boolean equals(Object o, Set visitedValues) { - if (o == this) { - return true; - } - if (o instanceof RefValue refValue) { - if (visitedValues.contains(new ValuePair(this, refValue))) { - return true; - } - visitedValues.add(new ValuePair(this, refValue)); - return refValue.equals(this, visitedValues); - } - return o.equals(this); - } - boolean read = false; @Override @@ -696,6 +676,11 @@ public Object next() { read = true; return that; } + + @Override + public boolean equals(Object o, Set visitedValues) { + return o.equals(this); + } }; } @@ -704,23 +689,8 @@ public int hashCode() { return Objects.hash(name, children, attributes, probableParents); } - /** - * @param o - * @param visitedValues - * @return - */ @Override public boolean equals(Object o, Set visitedValues) { - if (o == this) { - return true; - } - if (o instanceof RefValue refValue) { - if (visitedValues.contains(new ValuePair(this, refValue))) { - return true; - } - visitedValues.add(new ValuePair(this, refValue)); - return this.equals(o, visitedValues); - } return o.equals(this); } diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlNonElementItem.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlNonElementItem.java index cec2ab1e0e95..a923a93e912c 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlNonElementItem.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlNonElementItem.java @@ -179,19 +179,6 @@ public void removeChildren(String qname) { @Override public IteratorValue getIterator() { return new IteratorValue() { - /** - * @param o The reference value to be compared - * @param visitedValues Temporary set to keep already visited values - * @return boolean value indicating whether the given value is equal to this value - */ - @Override - public boolean equals(Object o, Set visitedValues) { - if (o == this) { - return true; - } - return o.equals(this); - } - @Override public boolean hasNext() { return false; @@ -201,6 +188,11 @@ public boolean hasNext() { public Object next() { throw new NoSuchElementException(); } + + @Override + public boolean equals(Object o, Set visitedValues) { + return o.equals(this); + } }; } diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlPi.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlPi.java index 7fd058025777..cec4a7804df6 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlPi.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlPi.java @@ -129,6 +129,11 @@ public boolean equals(Object obj) { return this == obj; } + @Override + public boolean equals(Object o, Set visitedValues) { + return o.equals(this); + } + @Override public int hashCode() { return Objects.hash(data, target); @@ -138,24 +143,4 @@ public int hashCode() { public String stringValue(BLink parent) { return ""; } - - /** - * @param o - * @param visitedValues - * @return - */ - @Override - public boolean equals(Object o, Set visitedValues) { - if (o == this) { - return true; - } - if (o instanceof XmlPi) { - if (visitedValues.contains(new ValuePair(o, this))) { - return true; - } - visitedValues.add(new ValuePair(o, this)); - return ((XmlPi) o).equals(o, visitedValues); - } - return false; - } } diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlQName.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlQName.java index 5cef00696729..82260d7c5587 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlQName.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlQName.java @@ -187,11 +187,6 @@ public void setPrefix(String prefix) { this.prefix = prefix; } - /** - * @param o - * @param visitedValues - * @return - */ @Override public boolean equals(Object o, Set visitedValues) { return o.equals(this); diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlSequence.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlSequence.java index cce8ae238cb0..5428e91b249b 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlSequence.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlSequence.java @@ -611,22 +611,6 @@ public boolean isFrozen() { @Override public IteratorValue getIterator() { return new IteratorValue() { - - @Override - public boolean equals(Object o, Set visitedValues) { - if (o == this) { - return true; - } - if (o instanceof RefValue refValue) { - if (visitedValues.contains(new ValuePair(this, refValue))) { - return true; - } - visitedValues.add(new ValuePair(this, refValue)); - return this.equals(refValue, visitedValues); - } - return o.equals(this); - } - Iterator iterator = children.iterator(); @Override @@ -638,6 +622,11 @@ public boolean hasNext() { public Object next() { return iterator.next(); } + + @Override + public boolean equals(Object o, Set visitedValues) { + return o.equals(this); + } }; } @@ -677,11 +666,6 @@ public Type getIteratorNextReturnType() { return iteratorNextReturnType; } - /** - * @param o - * @param visitedValues - * @return - */ @Override public boolean equals(Object o, Set visitedValues) { if (o == this) { diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlText.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlText.java index aac0d06a75f6..10aea8b6a35f 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlText.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlText.java @@ -128,6 +128,11 @@ public boolean equals(Object obj) { return this == obj; } + @Override + public boolean equals(Object o, Set visitedValues) { + return o.equals(this); + } + @Override public int hashCode() { return Objects.hash(data); @@ -137,14 +142,4 @@ public int hashCode() { public Type getType() { return this.type; } - - /** - * @param o - * @param visitedValues - * @return - */ - @Override - public boolean equals(Object o, Set visitedValues) { - return o.equals(this); - } } From 4e47d52f01884320d8e134f5867ab019541548cf Mon Sep 17 00:00:00 2001 From: gabilang Date: Wed, 29 Nov 2023 16:54:04 +0530 Subject: [PATCH 07/15] Add tests for table values with circular references --- .../equal_and_not_equal_operation.bal | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/tests/jballerina-unit-test/src/test/resources/test-src/expressions/binaryoperations/equal_and_not_equal_operation.bal b/tests/jballerina-unit-test/src/test/resources/test-src/expressions/binaryoperations/equal_and_not_equal_operation.bal index 4253400647ee..b98cf9aa172f 100644 --- a/tests/jballerina-unit-test/src/test/resources/test-src/expressions/binaryoperations/equal_and_not_equal_operation.bal +++ b/tests/jballerina-unit-test/src/test/resources/test-src/expressions/binaryoperations/equal_and_not_equal_operation.bal @@ -1793,4 +1793,19 @@ function testEqualityWithCyclicReferences() { yin[0] = yang; yang[0] = yin; test:assertTrue(yin == yang); + + table> t1 = table []; + table> t2 = table []; + t1.add({loop: t2}); + t2.add({loop: t1}); + test:assertTrue(t1 == t2); + + table> t3 = table []; + table> t4 = table []; + table> t5 = table []; + t3.add({loop: t4}); + t4.add({loop: t5}); + t5.add({loop: t3}); + test:assertTrue(t3 == t4); + test:assertTrue(t3 == t5); } From ed749383ab223b925885e8501f58385a5cf769f6 Mon Sep 17 00:00:00 2001 From: gabilang Date: Wed, 29 Nov 2023 17:08:31 +0530 Subject: [PATCH 08/15] Fix license header and doc comments --- .../internal/values/TableValueImpl.java | 19 ------------------- .../runtime/internal/values/ValuePair.java | 2 +- 2 files changed, 1 insertion(+), 20 deletions(-) diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/TableValueImpl.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/TableValueImpl.java index c11a54d54b22..b4a660162cd5 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/TableValueImpl.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/TableValueImpl.java @@ -549,27 +549,8 @@ public boolean hasNext() { return cursor < noOfAddedEntries && values.size() != 0; } - /** - * Check whether the given value is equal to the current value. - * - * @param o the value to check equality with - * @param visitedValues the values that have already been visited - * @return true if the current value is equal to the given value - */ @Override public boolean equals(Object o, Set visitedValues) { - if (o == this) { - return true; - } - - if (o instanceof RefValue refValue) { - ValuePair valuePair = new ValuePair(this, refValue); - if (visitedValues.contains(valuePair)) { - return true; - } - visitedValues.add(valuePair); - return refValue.equals(this, visitedValues); - } return o.equals(this); } } diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/ValuePair.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/ValuePair.java index 418b0c7ae41a..3d875fc0c885 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/ValuePair.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/ValuePair.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. + * Copyright (c) 2023, WSO2 LLC. (https://www.wso2.com). * * WSO2 LLC. licenses this file to you under the Apache License, * Version 2.0 (the "License"); you may not use this file except From 25142ab60ff07f03518e38d74380a21ea2e7f56d Mon Sep 17 00:00:00 2001 From: gabilang Date: Wed, 29 Nov 2023 20:37:11 +0530 Subject: [PATCH 09/15] Fix checkstyle issue --- .../io/ballerina/runtime/internal/values/ArrayValueImpl.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/ArrayValueImpl.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/ArrayValueImpl.java index 49f790c03539..d5213daa74bb 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/ArrayValueImpl.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/ArrayValueImpl.java @@ -47,12 +47,9 @@ import java.nio.charset.Charset; import java.util.ArrayList; import java.util.Arrays; -import java.util.HashMap; -import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Objects; -import java.util.Set; import java.util.StringJoiner; import java.util.stream.IntStream; From ca191ff070d47bfef1aa00f1e846de53c4bead7a Mon Sep 17 00:00:00 2001 From: gabilang Date: Thu, 30 Nov 2023 11:06:20 +0530 Subject: [PATCH 10/15] Refactor code --- .../runtime/internal/TypeChecker.java | 204 +++--------------- .../runtime/internal/values/ErrorValue.java | 21 +- .../internal/values/RegExpAssertion.java | 7 - .../internal/values/RegExpAtomQuantifier.java | 9 +- .../internal/values/RegExpCapturingGroup.java | 15 +- .../internal/values/RegExpCharSet.java | 6 - .../internal/values/RegExpCharSetRange.java | 7 - .../internal/values/RegExpCharacterClass.java | 7 - .../internal/values/RegExpCommonValue.java | 6 + .../internal/values/RegExpDisjunction.java | 6 - .../internal/values/RegExpFlagExpression.java | 13 +- .../internal/values/RegExpFlagOnOff.java | 7 - .../values/RegExpLiteralCharOrEscape.java | 7 - .../internal/values/RegExpQuantifier.java | 7 - .../internal/values/RegExpSequence.java | 8 +- .../runtime/internal/values/RegExpValue.java | 12 +- .../runtime/internal/values/XmlComment.java | 14 +- .../runtime/internal/values/XmlItem.java | 23 +- .../runtime/internal/values/XmlPi.java | 27 ++- .../runtime/internal/values/XmlSequence.java | 35 ++- .../runtime/internal/values/XmlText.java | 28 ++- 21 files changed, 169 insertions(+), 300 deletions(-) diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/TypeChecker.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/TypeChecker.java index b6ed8d17e63f..15edd817275c 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/TypeChecker.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/TypeChecker.java @@ -30,7 +30,6 @@ import io.ballerina.runtime.api.types.UnionType; import io.ballerina.runtime.api.types.XmlNodeType; import io.ballerina.runtime.api.utils.StringUtils; -import io.ballerina.runtime.api.utils.TypeUtils; import io.ballerina.runtime.api.values.BDecimal; import io.ballerina.runtime.api.values.BError; import io.ballerina.runtime.api.values.BObject; @@ -473,7 +472,7 @@ public static boolean isReferenceEqual(Object lhsValue, Object rhsValue) { lhsType.getName().equals(rhsType.getName()) && rhsType.equals(lhsType); default: if (lhsValue instanceof RegExpValue && rhsValue instanceof RegExpValue) { - return isEqual((RegExpValue) lhsValue, (RegExpValue) rhsValue); + return ((RegExpValue) lhsValue).equals(rhsValue, new HashSet<>()); } return false; } @@ -2982,17 +2981,17 @@ private static boolean checkValueEquals(Object lhsValue, Object rhsValue, Set checkedValues) { - ValuePair compValuePair = new ValuePair(lhsError, rhsError); - if (checkedValues.contains(compValuePair)) { - return true; - } - checkedValues.add(compValuePair); - - return isEqual(lhsError.getMessage(), rhsError.getMessage(), checkedValues) && - ((MapValueImpl) lhsError.getDetails()).equals(rhsError.getDetails(), checkedValues) && - isEqual(lhsError.getCause(), rhsError.getCause(), checkedValues); - } - - /** - * Deep equality check for XML Sequence. - * - * @param lhsXMLSequence The XML sequence on the left hand side - * @param rhsXml The XML on the right hand side - * @return True if the XML values are equal, else false. - */ - private static boolean isEqual(XmlSequence lhsXMLSequence, XmlValue rhsXml) { - if (rhsXml instanceof XmlSequence) { - XmlSequence rhsXMLSequence = (XmlSequence) rhsXml; - return isXMLSequenceChildrenEqual(lhsXMLSequence.getChildrenList(), rhsXMLSequence.getChildrenList()); - } - if (rhsXml instanceof XmlItem) { - return lhsXMLSequence.getChildrenList().size() == 1 && - isEqual(lhsXMLSequence.getChildrenList().get(0), rhsXml); - } - return lhsXMLSequence.getChildrenList().isEmpty() && - TypeUtils.getType(rhsXml) == PredefinedTypes.TYPE_XML_NEVER; - } - - /** - * Deep equality check for XML item. - * - * @param lhsXMLItem The XML item on the left hand side - * @param rhsXml The XML on the right hand side - * @return True if the XML values are equal, else false. - */ - private static boolean isEqual(XmlItem lhsXMLItem, XmlValue rhsXml) { - if (rhsXml instanceof XmlItem) { - XmlItem rhsXMLItem = (XmlItem) rhsXml; - if (!(rhsXMLItem.getQName().equals(lhsXMLItem.getQName()))) { - return false; - } - if (!(rhsXMLItem.getAttributesMap().entrySet().equals(lhsXMLItem.getAttributesMap().entrySet()))) { - return false; - } - return isEqual(rhsXMLItem.getChildrenSeq(), lhsXMLItem.getChildrenSeq()); - } - if (rhsXml instanceof XmlSequence) { - XmlSequence rhsXMLSequence = (XmlSequence) rhsXml; - return rhsXMLSequence.getChildrenList().size() == 1 && - isEqual(lhsXMLItem, rhsXMLSequence.getChildrenList().get(0)); - } - return false; - } - - /** - * Deep equality check for XML Text. - * - * @param lhsXMLText The XML text on the left hand side - * @param rhsXml The XML on the right hand side - * @return True if the XML values are equal, else false. - */ - private static boolean isEqual(XmlText lhsXMLText, XmlValue rhsXml) { - if (rhsXml instanceof XmlText) { - XmlText rhsXMLText = (XmlText) rhsXml; - return lhsXMLText.getTextValue().equals(rhsXMLText.getTextValue()); - } - return lhsXMLText.getType() == PredefinedTypes.TYPE_XML_NEVER && rhsXml instanceof XmlSequence && - ((XmlSequence) rhsXml).getChildrenList().isEmpty(); - } - - /** - * Deep equality check for XML Comment. - * - * @param lhsXMLComment The XML comment on the left hand side - * @param rhsXml The XML on the right hand side - * @return True if the XML values are equal, else false. - */ - private static boolean isEqual(XmlComment lhsXMLComment, XmlValue rhsXml) { - if (!(rhsXml instanceof XmlComment)) { - return false; - } - XmlComment rhXMLComment = (XmlComment) rhsXml; - return lhsXMLComment.getTextValue().equals(rhXMLComment.getTextValue()); - } - - /** - * Deep equality check for XML Processing Instruction. - * - * @param lhsXMLPi The XML processing instruction on the left hand side - * @param rhsXml The XML on the right hand side - * @return True if the XML values are equal, else false. - */ - private static boolean isEqual(XmlPi lhsXMLPi, XmlValue rhsXml) { - if (!(rhsXml instanceof XmlPi)) { - return false; - } - XmlPi rhsXMLPi = (XmlPi) rhsXml; - return lhsXMLPi.getData().equals(rhsXMLPi.getData()) && lhsXMLPi.getTarget().equals(rhsXMLPi.getTarget()); - } - - private static boolean isXMLSequenceChildrenEqual(List lhsList, List rhsList) { - if (lhsList.size() != rhsList.size()) { - return false; - } - - for (int i = 0; i < lhsList.size(); i++) { - if (!isEqual(lhsList.get(i), rhsList.get(i))) { - return false; - } - } - return true; - } - static boolean isRegExpType(Type targetType) { if (targetType.getTag() == TypeTags.TYPE_REFERENCED_TYPE_TAG) { Type referredType = ((BTypeReferenceType) targetType).getReferredType(); @@ -3178,16 +3040,15 @@ static boolean isRegExpType(Type targetType) { static boolean isStructuredType(Type type) { Type referredType = getImpliedType(type); - switch (referredType.getTag()) { - case TypeTags.ARRAY_TAG: - case TypeTags.TUPLE_TAG: - case TypeTags.MAP_TAG: - case TypeTags.RECORD_TYPE_TAG: - case TypeTags.TABLE_TAG: - return true; - default: - return false; - } + return switch (referredType.getTag()) { + case TypeTags.ARRAY_TAG, + TypeTags.TUPLE_TAG, + TypeTags.MAP_TAG, + TypeTags.RECORD_TYPE_TAG, + TypeTags.TABLE_TAG -> + true; + default -> false; + }; } /** @@ -3206,11 +3067,9 @@ public TypePair(Type sourceType, Type targetType) { @Override public boolean equals(Object obj) { - if (!(obj instanceof TypePair)) { + if (!(obj instanceof TypePair other)) { return false; } - - TypePair other = (TypePair) obj; return this.sourceType.equals(other.sourceType) && this.targetType.equals(other.targetType); } } @@ -3306,7 +3165,7 @@ private static boolean checkFillerValue(BUnionType type, List unAnalyzedT private static boolean isSameBasicTypeWithFillerValue(List memberTypes) { - // here finite types and non finite types are separated + // here finite types and non-finite types are separated // for finite types only all their value space items are collected List nonFiniteTypes = new ArrayList<>(); Set combinedValueSpace = new HashSet<>(); @@ -3323,11 +3182,11 @@ private static boolean isSameBasicTypeWithFillerValue(List memberTypes) { // only finite types are there, so the check narrows to one finite type like case return hasFillerValueInValueSpace(combinedValueSpace); } else { - // non finite types are available + // non-finite types are available Iterator iterator = nonFiniteTypes.iterator(); Type firstMember = iterator.next(); - // non finite types are checked whether they are the same type + // non-finite types are checked whether they are the same type Type nextMember; while (iterator.hasNext()) { nextMember = iterator.next(); @@ -3341,8 +3200,8 @@ private static boolean isSameBasicTypeWithFillerValue(List memberTypes) { return hasFillerValue(firstMember); } - // both finite and non finite types are available - // finite types are checked whether they are the type of non finite types + // both finite and non-finite types are available + // finite types are checked whether they are the type of non-finite types if (!containsSameBasicType(firstMember, combinedValueSpace)) { return false; } @@ -3378,15 +3237,10 @@ private static boolean isIntegerSubTypeTag(int typeTag) { } private static boolean isFillerValueOfFiniteTypeBasicType(Object value) { - switch (value.toString()) { - case "0": - case "0.0": - case "false": - case "": - return true; - default: - return false; - } + return switch (value.toString()) { + case "0", "0.0", "false", "" -> true; + default -> false; + }; } private static boolean containsSameBasicType (Type nonFiniteType, Set finiteTypeValueSpace) { diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/ErrorValue.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/ErrorValue.java index 1d5dd6bc0810..58b15502436b 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/ErrorValue.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/ErrorValue.java @@ -50,6 +50,7 @@ import static io.ballerina.runtime.api.constants.RuntimeConstants.BLANG_SRC_FILE_SUFFIX; import static io.ballerina.runtime.api.constants.RuntimeConstants.DOT; import static io.ballerina.runtime.api.constants.RuntimeConstants.MODULE_INIT_CLASS_NAME; +import static io.ballerina.runtime.internal.TypeChecker.isEqual; import static io.ballerina.runtime.internal.util.StringUtils.getExpressionStringVal; import static io.ballerina.runtime.internal.util.StringUtils.getStringVal; @@ -449,8 +450,26 @@ private boolean isCompilerAddedName(String name) { return name != null && name.startsWith("$") && name.endsWith("$"); } + /** + * Deep equality check for error values. + * + * @param o The error value to be compared + * @param visitedValues Visited values due to circular references + * @return True if the error values are equal, false otherwise + */ @Override public boolean equals(Object o, Set visitedValues) { - return o.equals(this); + ValuePair compValuePair = new ValuePair(this, o); + if (visitedValues.contains(compValuePair)) { + return true; + } + visitedValues.add(compValuePair); + + if (!(o instanceof ErrorValue errorValue)) { + return false; + } + return isEqual(this.getMessage(), errorValue.getMessage(), visitedValues) && + ((MapValueImpl) this.getDetails()).equals(errorValue.getDetails(), visitedValues) && + isEqual(this.getCause(), errorValue.getCause(), visitedValues); } } diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpAssertion.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpAssertion.java index da3d0216f0fa..e223d6d76d40 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpAssertion.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpAssertion.java @@ -19,8 +19,6 @@ import io.ballerina.runtime.api.values.BLink; -import java.util.Set; - /** *

* Represents an ReAssertion in a regular expression. @@ -42,9 +40,4 @@ public RegExpAssertion(String assertion) { public String stringValue(BLink parent) { return this.assertion; } - - @Override - public boolean equals(Object o, Set visitedValues) { - return o.equals(this); - } } diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpAtomQuantifier.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpAtomQuantifier.java index fdc377d2b932..2ca954b78553 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpAtomQuantifier.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpAtomQuantifier.java @@ -21,8 +21,6 @@ import io.ballerina.runtime.api.values.BString; import io.ballerina.runtime.internal.regexp.RegExpFactory; -import java.util.Set; - import static io.ballerina.runtime.internal.util.StringUtils.getStringVal; /** @@ -61,7 +59,7 @@ public void setReQuantifier(RegExpQuantifier reQuantifier) { } private Object getValidReAtom(Object reAtom) { - // If reAtom is an instance of BString it's an insertion. Hence we need to parse it and check whether it's a + // If reAtom is an instance of BString it's an insertion. Hence, we need to parse it and check whether it's a // valid insertion. if (reAtom instanceof BString) { validateInsertion((BString) reAtom); @@ -77,9 +75,4 @@ private void validateInsertion(BString insertion) { public String stringValue(BLink parent) { return getStringVal(this.reAtom, parent) + this.reQuantifier.stringValue(parent); } - - @Override - public boolean equals(Object o, Set visitedValues) { - return o.equals(this); - } } diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpCapturingGroup.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpCapturingGroup.java index ebeb4ecef64c..0d55d18ef7a3 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpCapturingGroup.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpCapturingGroup.java @@ -19,8 +19,6 @@ import io.ballerina.runtime.api.values.BLink; -import java.util.Set; - /** *

* Represents a capturing group, "(" ["?" ReFlagsOnOff ":"] ReDisjunction ")" in a regular expression. @@ -32,10 +30,10 @@ * @since 2201.3.0 */ public class RegExpCapturingGroup extends RegExpCommonValue implements RegExpAtom { - private String openParen; - private RegExpFlagExpression flagExpr; - private RegExpDisjunction reDisjunction; - private String closeParen; + private final String openParen; + private final RegExpFlagExpression flagExpr; + private final RegExpDisjunction reDisjunction; + private final String closeParen; public RegExpCapturingGroup(String openParen, RegExpFlagExpression flagExpr, RegExpDisjunction reDisjunction, String closeParen) { @@ -50,9 +48,4 @@ public String stringValue(BLink parent) { return this.openParen + this.flagExpr.stringValue(parent) + this.reDisjunction.stringValue(parent) + this.closeParen; } - - @Override - public boolean equals(Object o, Set visitedValues) { - return o.equals(this); - } } diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpCharSet.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpCharSet.java index 03efa8a00793..79d1e2612697 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpCharSet.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpCharSet.java @@ -21,7 +21,6 @@ import io.ballerina.runtime.api.values.BString; import io.ballerina.runtime.api.values.BValue; -import java.util.Set; import java.util.StringJoiner; /** @@ -80,9 +79,4 @@ public String stringValue(BLink parent) { } return atoms.toString(); } - - @Override - public boolean equals(Object o, Set visitedValues) { - return o.equals(this); - } } diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpCharSetRange.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpCharSetRange.java index 5625b77a652d..9a25df276e46 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpCharSetRange.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpCharSetRange.java @@ -19,8 +19,6 @@ import io.ballerina.runtime.api.values.BLink; -import java.util.Set; - /** *

* Represents an ReCharSetRange or ReCharSetRangeNoDash in regular expression. @@ -62,9 +60,4 @@ public void setRhsCharSetAom(String rhsCharSetAom) { public String stringValue(BLink parent) { return this.lhsCharSetAtom + this.dash + this.rhsCharSetAom; } - - @Override - public boolean equals(Object o, Set visitedValues) { - return o.equals(this); - } } diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpCharacterClass.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpCharacterClass.java index 2a68a6571f25..057cab178ffe 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpCharacterClass.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpCharacterClass.java @@ -19,8 +19,6 @@ import io.ballerina.runtime.api.values.BLink; -import java.util.Set; - /** *

* Represents a character class, "[" ["^"] [ReCharSet] "]" in a regular expression. @@ -65,9 +63,4 @@ public void setCharacterClassEnd(String characterClassEnd) { public String stringValue(BLink parent) { return this.characterClassStart + this.negation + this.reCharSet.stringValue(parent) + this.characterClassEnd; } - - @Override - public boolean equals(Object o, Set visitedValues) { - return o.equals(this); - } } diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpCommonValue.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpCommonValue.java index 1b460f8e276d..15e65a8cc8c4 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpCommonValue.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpCommonValue.java @@ -23,6 +23,7 @@ import io.ballerina.runtime.api.values.BTypedesc; import java.util.Map; +import java.util.Set; /** *

@@ -65,4 +66,9 @@ public Object frozenCopy(Map refs) { public BTypedesc getTypedesc() { throw new UnsupportedOperationException(); } + + @Override + public boolean equals(Object o, Set unresolvedValues) { + return o.equals(this); + } } diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpDisjunction.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpDisjunction.java index 3cb1d2a7c372..96f0cbfb0cf5 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpDisjunction.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpDisjunction.java @@ -19,7 +19,6 @@ import io.ballerina.runtime.api.values.BLink; -import java.util.Set; import java.util.StringJoiner; import static io.ballerina.runtime.internal.util.StringUtils.getStringVal; @@ -64,9 +63,4 @@ public String stringValue(BLink parent) { } return terms.toString(); } - - @Override - public boolean equals(Object o, Set visitedValues) { - return o.equals(this); - } } diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpFlagExpression.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpFlagExpression.java index 3a19846ec874..8278b55fb487 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpFlagExpression.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpFlagExpression.java @@ -19,8 +19,6 @@ import io.ballerina.runtime.api.values.BLink; -import java.util.Set; - /** *

* Represents a flag expression, "?" ReFlagsOnOff ":" in regular expression. @@ -32,9 +30,9 @@ * @since 2201.3.0 */ public class RegExpFlagExpression extends RegExpCommonValue { - private String questionMark; - private RegExpFlagOnOff flagsOnOff; - private String colon; + private final String questionMark; + private final RegExpFlagOnOff flagsOnOff; + private final String colon; public RegExpFlagExpression(String questionMark, RegExpFlagOnOff flagsOnOff, String colon) { this.questionMark = questionMark; @@ -46,9 +44,4 @@ public RegExpFlagExpression(String questionMark, RegExpFlagOnOff flagsOnOff, Str public String stringValue(BLink parent) { return this.questionMark + this.flagsOnOff.stringValue(parent) + this.colon; } - - @Override - public boolean equals(Object o, Set visitedValues) { - return o.equals(this); - } } diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpFlagOnOff.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpFlagOnOff.java index b8b5229c40f3..35ae37ce4bb6 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpFlagOnOff.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpFlagOnOff.java @@ -19,8 +19,6 @@ import io.ballerina.runtime.api.values.BLink; -import java.util.Set; - /** *

* Represents an ReFlagsOnOff in regular expression. @@ -42,9 +40,4 @@ public RegExpFlagOnOff(String flags) { public String stringValue(BLink parent) { return this.flags; } - - @Override - public boolean equals(Object o, Set visitedValues) { - return o.equals(this); - } } diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpLiteralCharOrEscape.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpLiteralCharOrEscape.java index 72bc068b65d3..83ff241bf249 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpLiteralCharOrEscape.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpLiteralCharOrEscape.java @@ -19,8 +19,6 @@ import io.ballerina.runtime.api.values.BLink; -import java.util.Set; - /** *

* Represents a ReLiteralChar, ReEscape or "." in a regular expression. @@ -50,9 +48,4 @@ public void setCharOrEscape(String charOrEscape) { public String stringValue(BLink parent) { return this.charOrEscape; } - - @Override - public boolean equals(Object o, Set visitedValues) { - return o.equals(this); - } } diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpQuantifier.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpQuantifier.java index 48827f9c63e8..79881805a700 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpQuantifier.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpQuantifier.java @@ -19,8 +19,6 @@ import io.ballerina.runtime.api.values.BLink; -import java.util.Set; - /** *

* Represents an ReQuantifier in regular expression. @@ -44,9 +42,4 @@ public RegExpQuantifier(String quantifier, String nonGreedyChar) { public String stringValue(BLink parent) { return this.quantifier + this.nonGreedyChar; } - - @Override - public boolean equals(Object o, Set visitedValues) { - return o.equals(this); - } } diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpSequence.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpSequence.java index 9128d07e49d4..303c6ee56336 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpSequence.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpSequence.java @@ -19,7 +19,6 @@ import io.ballerina.runtime.api.values.BLink; -import java.util.Set; import java.util.StringJoiner; /** @@ -33,7 +32,7 @@ * @since 2201.3.0 */ public class RegExpSequence extends RegExpCommonValue { - private RegExpTerm[] termsList; + private final RegExpTerm[] termsList; public RegExpSequence(ArrayValue termsList) { this.termsList = getRegExpSeqList(termsList); @@ -64,9 +63,4 @@ public String stringValue(BLink parent) { } return terms.toString(); } - - @Override - public boolean equals(Object o, Set visitedValues) { - return o.equals(this); - } } diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpValue.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpValue.java index 017927bb8169..7c8df5ed7130 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpValue.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpValue.java @@ -108,8 +108,18 @@ public String toString() { return this.stringValue(null); } + /** + * Deep equality check for regular expression. + * + * @param o The regular expression on the right hand side + * @param visitedValues Visited values in order to break cyclic references. + * @return True if the regular expressions are equal, else false. + */ @Override public boolean equals(Object o, Set visitedValues) { - return o.equals(this); + if (!(o instanceof RegExpValue rhsRegExpValue)) { + return false; + } + return this.stringValue(null).equals(rhsRegExpValue.stringValue(null)); } } diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlComment.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlComment.java index c000c4ca431b..bbaeac29041a 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlComment.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlComment.java @@ -34,7 +34,7 @@ */ public class XmlComment extends XmlNonElementItem { - private String data; + private final String data; public XmlComment(String data) { this.data = data; @@ -126,8 +126,18 @@ public boolean equals(Object obj) { return this == obj; } + /** + * Deep equality check for xml comment. + * + * @param o The xml comment on the right hand side + * @param visitedValues Visited values in order to break cyclic references. + * @return True if the xml comments are equal, else false. + */ @Override public boolean equals(Object o, Set visitedValues) { - return o.equals(this); + if (!(o instanceof XmlComment rhXMLComment)) { + return false; + } + return this.getTextValue().equals(rhXMLComment.getTextValue()); } } diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlItem.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlItem.java index f149235d43aa..22cf23493e6b 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlItem.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlItem.java @@ -58,6 +58,7 @@ import static io.ballerina.runtime.api.constants.RuntimeConstants.XML_LANG_LIB; import static io.ballerina.runtime.api.types.XmlNodeType.ELEMENT; import static io.ballerina.runtime.api.types.XmlNodeType.TEXT; +import static io.ballerina.runtime.internal.TypeChecker.isEqual; /** * {@code XMLItem} represents a single XML element in Ballerina. @@ -689,9 +690,29 @@ public int hashCode() { return Objects.hash(name, children, attributes, probableParents); } + /** + * Deep equality check for XML Item. + * + * @param o The XML Item to be compared + * @param visitedValues Visited values due to circular references + * @return True if the XML Items are equal; False otherwise + */ @Override public boolean equals(Object o, Set visitedValues) { - return o.equals(this); + if (o instanceof XmlItem rhsXMLItem) { + if (!(rhsXMLItem.getQName().equals(this.getQName()))) { + return false; + } + if (!(rhsXMLItem.getAttributesMap().entrySet().equals(this.getAttributesMap().entrySet()))) { + return false; + } + return isEqual(rhsXMLItem.getChildrenSeq(), this.getChildrenSeq()); + } + if (o instanceof XmlSequence rhsXMLSequence) { + return rhsXMLSequence.getChildrenList().size() == 1 && + isEqual(this, rhsXMLSequence.getChildrenList().get(0)); + } + return false; } private interface SetAttributeFunction { diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlPi.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlPi.java index cec4a7804df6..1695f42b62f5 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlPi.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlPi.java @@ -54,16 +54,6 @@ public XmlPi(String data, String target, boolean readonly) { public IteratorValue getIterator() { XmlPi that = this; return new IteratorValue() { - /** - * @param o - * @param visitedValues - * @return - */ - @Override - public boolean equals(Object o, Set visitedValues) { - return o.equals(that); - } - boolean read = false; @Override public boolean hasNext() { @@ -79,6 +69,11 @@ public Object next() { throw new NoSuchElementException(); } } + + @Override + public boolean equals(Object o, Set visitedValues) { + return o.equals(that); + } }; } @@ -129,9 +124,19 @@ public boolean equals(Object obj) { return this == obj; } + /** + * Deep equality check for XML Processing Instruction. + * + * @param o The XML on the right hand side + * @param visitedValues Visited values in order to break cyclic references. + * @return True if the XML values are equal, else false. + */ @Override public boolean equals(Object o, Set visitedValues) { - return o.equals(this); + if (!(o instanceof XmlPi rhsXMLPi)) { + return false; + } + return this.getData().equals(rhsXMLPi.getData()) && this.getTarget().equals(rhsXMLPi.getTarget()); } @Override diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlSequence.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlSequence.java index 5428e91b249b..e2525d9701bc 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlSequence.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlSequence.java @@ -23,6 +23,7 @@ import io.ballerina.runtime.api.types.Type; import io.ballerina.runtime.api.types.XmlNodeType; import io.ballerina.runtime.api.utils.StringUtils; +import io.ballerina.runtime.api.utils.TypeUtils; import io.ballerina.runtime.api.values.BLink; import io.ballerina.runtime.api.values.BMap; import io.ballerina.runtime.api.values.BString; @@ -46,6 +47,7 @@ import static io.ballerina.runtime.api.constants.RuntimeConstants.STRING_EMPTY_VALUE; import static io.ballerina.runtime.api.constants.RuntimeConstants.XML_LANG_LIB; +import static io.ballerina.runtime.internal.TypeChecker.isEqual; /** *

@@ -666,18 +668,35 @@ public Type getIteratorNextReturnType() { return iteratorNextReturnType; } + /** + * Deep equality check for XML Sequence. + * + * @param o The XML Sequence to be compared + * @param visitedValues Visited values in previous recursive calls + * @return True if the XML Sequences are equal; False otherwise + */ @Override public boolean equals(Object o, Set visitedValues) { - if (o == this) { - return true; + if (o instanceof XmlSequence rhsXMLSequence) { + return isXMLSequenceChildrenEqual(this.getChildrenList(), rhsXMLSequence.getChildrenList()); + } + if (o instanceof XmlItem) { + return this.getChildrenList().size() == 1 && + isEqual(this.getChildrenList().get(0), o); + } + return this.getChildrenList().isEmpty() && TypeUtils.getType(o) == PredefinedTypes.TYPE_XML_NEVER; + } + + private static boolean isXMLSequenceChildrenEqual(List lhsList, List rhsList) { + if (lhsList.size() != rhsList.size()) { + return false; } - if (o instanceof XmlSequence) { - if (visitedValues.contains(new ValuePair(this, o))) { - return true; + + for (int i = 0; i < lhsList.size(); i++) { + if (!isEqual(lhsList.get(i), rhsList.get(i))) { + return false; } - visitedValues.add(new ValuePair(this, o)); - return ((XmlSequence) o).equals(o, visitedValues); } - return false; + return true; } } diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlText.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlText.java index 10aea8b6a35f..f163d86fe152 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlText.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlText.java @@ -95,16 +95,6 @@ public OMNode value() { public IteratorValue getIterator() { XmlText that = this; return new IteratorValue() { - /** - * @param o - * @param visitedValues - * @return - */ - @Override - public boolean equals(Object o, Set visitedValues) { - return o.equals(this); - } - boolean read = false; @Override public boolean hasNext() { @@ -120,6 +110,11 @@ public Object next() { throw new NoSuchElementException(); } } + + @Override + public boolean equals(Object o, Set visitedValues) { + return o.equals(this); + } }; } @@ -128,9 +123,20 @@ public boolean equals(Object obj) { return this == obj; } + /** + * Deep equality check for XML Text. + * + * @param o The XML Text to be compared + * @param visitedValues Visited values in previous recursive calls + * @return True if the XML Texts are equal; False otherwise + */ @Override public boolean equals(Object o, Set visitedValues) { - return o.equals(this); + if (o instanceof XmlText rhsXMLText) { + return this.getTextValue().equals(rhsXMLText.getTextValue()); + } + return this.getType() == PredefinedTypes.TYPE_XML_NEVER && (o instanceof XmlSequence) && + ((XmlSequence) o).getChildrenList().isEmpty(); } @Override From 44bcef84f15da21247ec1ec667017eb6eb23ebd3 Mon Sep 17 00:00:00 2001 From: gabilang Date: Thu, 30 Nov 2023 15:24:41 +0530 Subject: [PATCH 11/15] Make the equals method as default in RefValue --- .../internal/values/AbstractArrayValue.java | 5 ---- .../runtime/internal/values/CharIterator.java | 5 ---- .../runtime/internal/values/FPValue.java | 6 ----- .../runtime/internal/values/FutureValue.java | 6 ----- .../runtime/internal/values/HandleValue.java | 5 ---- .../runtime/internal/values/MapValueImpl.java | 5 ---- .../runtime/internal/values/RefValue.java | 4 ++- .../internal/values/RegExpCommonValue.java | 6 ----- .../runtime/internal/values/StreamValue.java | 6 ----- .../internal/values/StreamingJsonValue.java | 6 ----- .../internal/values/TableValueImpl.java | 5 ---- .../internal/values/TypedescValueImpl.java | 25 ------------------- .../runtime/internal/values/XmlComment.java | 5 ---- .../runtime/internal/values/XmlItem.java | 5 ---- .../internal/values/XmlNonElementItem.java | 5 ---- .../runtime/internal/values/XmlPi.java | 5 ---- .../runtime/internal/values/XmlQName.java | 6 ----- .../runtime/internal/values/XmlSequence.java | 5 ---- .../runtime/internal/values/XmlText.java | 5 ---- 19 files changed, 3 insertions(+), 117 deletions(-) diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/AbstractArrayValue.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/AbstractArrayValue.java index 4919390014ab..1585d0120483 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/AbstractArrayValue.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/AbstractArrayValue.java @@ -294,10 +294,5 @@ public Object next() { public boolean hasNext() { return cursor < length; } - - @Override - public boolean equals(Object o, Set visitedValues) { - return o.equals(this); - } } } diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/CharIterator.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/CharIterator.java index a7228079ef54..086234bc52af 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/CharIterator.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/CharIterator.java @@ -65,9 +65,4 @@ private String getNonBmpCharWithSurrogates(long currentIndex) { public boolean hasNext() { return cursor < length; } - - @Override - public boolean equals(Object o, Set visitedValues) { - return o.equals(this); - } } diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/FPValue.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/FPValue.java index 00e68c065f46..e2c28fb225c0 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/FPValue.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/FPValue.java @@ -28,7 +28,6 @@ import io.ballerina.runtime.internal.scheduling.Scheduler; import java.util.Map; -import java.util.Set; import java.util.function.Consumer; import java.util.function.Function; @@ -126,9 +125,4 @@ public BTypedesc getTypedesc() { public String toString() { return RuntimeConstants.EMPTY; } - - @Override - public boolean equals(Object o, Set visitedValues) { - return o.equals(this); - } } diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/FutureValue.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/FutureValue.java index e0576038f4f2..a9c26ee2bcbb 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/FutureValue.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/FutureValue.java @@ -26,7 +26,6 @@ import io.ballerina.runtime.internal.types.BFutureType; import java.util.Map; - import java.util.Set; import java.util.StringJoiner; /** @@ -161,9 +160,4 @@ public boolean hasWaited() { public void setWaited(boolean waited) { this.waited = waited; } - - @Override - public boolean equals(Object o, Set visitedValues) { - return this.equals(o); - } } diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/HandleValue.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/HandleValue.java index ccc9e3ef86f8..28357c22dbba 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/HandleValue.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/HandleValue.java @@ -100,9 +100,4 @@ public Object frozenCopy(Map refs) { public static HandleValue valueOfJ(Object value) { return new HandleValue(value); } - - @Override - public boolean equals(Object o, Set visitedValues) { - return o.equals(this); - } } diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/MapValueImpl.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/MapValueImpl.java index 6a4da4a66128..dc463dbc6880 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/MapValueImpl.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/MapValueImpl.java @@ -598,11 +598,6 @@ public Object next() { public boolean hasNext() { return iterator.hasNext(); } - - @Override - public boolean equals(Object o, Set visitedValues) { - return o.equals(this); - } } /** diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RefValue.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RefValue.java index d25417950444..6d90197bd231 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RefValue.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RefValue.java @@ -33,5 +33,7 @@ */ public interface RefValue extends SimpleValue, BRefValue { - boolean equals(Object o, Set visitedValues); + default boolean equals(Object o, Set visitedValues) { + return o.equals(this); + } } diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpCommonValue.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpCommonValue.java index 15e65a8cc8c4..1b460f8e276d 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpCommonValue.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/RegExpCommonValue.java @@ -23,7 +23,6 @@ import io.ballerina.runtime.api.values.BTypedesc; import java.util.Map; -import java.util.Set; /** *

@@ -66,9 +65,4 @@ public Object frozenCopy(Map refs) { public BTypedesc getTypedesc() { throw new UnsupportedOperationException(); } - - @Override - public boolean equals(Object o, Set unresolvedValues) { - return o.equals(this); - } } diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/StreamValue.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/StreamValue.java index 9116a9d68830..a0cb54eb1ff6 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/StreamValue.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/StreamValue.java @@ -27,7 +27,6 @@ import io.ballerina.runtime.internal.types.BStreamType; import java.util.Map; -import java.util.Set; import java.util.UUID; /** @@ -141,9 +140,4 @@ public Type getCompletionType() { public String toString() { return stringValue(null); } - - @Override - public boolean equals(Object o, Set visitedValues) { - return o.equals(this); - } } diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/StreamingJsonValue.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/StreamingJsonValue.java index 41029012f257..944d7ed19579 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/StreamingJsonValue.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/StreamingJsonValue.java @@ -30,7 +30,6 @@ import java.io.OutputStream; import java.io.Writer; import java.util.Map; -import java.util.Set; /** *

@@ -241,10 +240,5 @@ public boolean hasNext() { return array.datasource.hasNext(); } - - @Override - public boolean equals(Object o, Set visitedValues) { - return o.equals(this); - } } } diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/TableValueImpl.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/TableValueImpl.java index b4a660162cd5..e29dc3af038a 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/TableValueImpl.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/TableValueImpl.java @@ -548,11 +548,6 @@ public Object next() { public boolean hasNext() { return cursor < noOfAddedEntries && values.size() != 0; } - - @Override - public boolean equals(Object o, Set visitedValues) { - return o.equals(this); - } } private class ValueHolder { diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/TypedescValueImpl.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/TypedescValueImpl.java index 4195a5fe35b4..6d014bcf16ed 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/TypedescValueImpl.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/TypedescValueImpl.java @@ -31,7 +31,6 @@ import io.ballerina.runtime.internal.types.BTypedescType; import java.util.Map; -import java.util.Set; import static io.ballerina.runtime.api.utils.TypeUtils.getImpliedType; @@ -153,28 +152,4 @@ public BTypedesc getTypedesc() { public Object frozenCopy(Map refs) { return this; } - - /** - * @param o - * @param visitedValues - * @return - */ - @Override - public boolean equals(Object o, Set visitedValues) { - ValuePair compValuePair = new ValuePair(this, o); - for (ValuePair valuePair : visitedValues) { - if (valuePair.equals(compValuePair, visitedValues)) { - return true; - } - } - visitedValues.add(compValuePair); - - if (o == this) { - return true; - } - if (!(o instanceof TypedescValueImpl other)) { - return false; - } - return other.equals(this); - } } diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlComment.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlComment.java index bbaeac29041a..24725ac7bca8 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlComment.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlComment.java @@ -65,11 +65,6 @@ public Object next() { throw new NoSuchElementException(); } } - - @Override - public boolean equals(Object o, Set visitedValues) { - return o.equals(this); - } }; } diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlItem.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlItem.java index 22cf23493e6b..1a0be8782758 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlItem.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlItem.java @@ -677,11 +677,6 @@ public Object next() { read = true; return that; } - - @Override - public boolean equals(Object o, Set visitedValues) { - return o.equals(this); - } }; } diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlNonElementItem.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlNonElementItem.java index a923a93e912c..0c4424ee792f 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlNonElementItem.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlNonElementItem.java @@ -188,11 +188,6 @@ public boolean hasNext() { public Object next() { throw new NoSuchElementException(); } - - @Override - public boolean equals(Object o, Set visitedValues) { - return o.equals(this); - } }; } diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlPi.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlPi.java index 1695f42b62f5..764b4e88d460 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlPi.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlPi.java @@ -69,11 +69,6 @@ public Object next() { throw new NoSuchElementException(); } } - - @Override - public boolean equals(Object o, Set visitedValues) { - return o.equals(that); - } }; } diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlQName.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlQName.java index 82260d7c5587..6ef15a47244b 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlQName.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlQName.java @@ -26,7 +26,6 @@ import java.util.Map; import java.util.Objects; -import java.util.Set; import static io.ballerina.runtime.internal.ValueUtils.getTypedescValue; @@ -186,9 +185,4 @@ public String getPrefix() { public void setPrefix(String prefix) { this.prefix = prefix; } - - @Override - public boolean equals(Object o, Set visitedValues) { - return o.equals(this); - } } diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlSequence.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlSequence.java index e2525d9701bc..97294f69be1d 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlSequence.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlSequence.java @@ -624,11 +624,6 @@ public boolean hasNext() { public Object next() { return iterator.next(); } - - @Override - public boolean equals(Object o, Set visitedValues) { - return o.equals(this); - } }; } diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlText.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlText.java index f163d86fe152..396d9807abb0 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlText.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlText.java @@ -110,11 +110,6 @@ public Object next() { throw new NoSuchElementException(); } } - - @Override - public boolean equals(Object o, Set visitedValues) { - return o.equals(this); - } }; } From cd544515dfaa446fef8059658a69c95814bc78e5 Mon Sep 17 00:00:00 2001 From: gabilang Date: Thu, 30 Nov 2023 17:06:37 +0530 Subject: [PATCH 12/15] Remove unused imports --- .../java/io/ballerina/runtime/internal/values/CharIterator.java | 2 -- .../java/io/ballerina/runtime/internal/values/HandleValue.java | 1 - .../io/ballerina/runtime/internal/values/XmlNonElementItem.java | 1 - 3 files changed, 4 deletions(-) diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/CharIterator.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/CharIterator.java index 086234bc52af..9e5c4cea6bf1 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/CharIterator.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/CharIterator.java @@ -18,8 +18,6 @@ package io.ballerina.runtime.internal.values; -import java.util.Set; - /** * {@code {@link CharIterator }} provides iterator implementation for Ballerina string values. * diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/HandleValue.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/HandleValue.java index 28357c22dbba..f41b50630709 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/HandleValue.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/HandleValue.java @@ -24,7 +24,6 @@ import io.ballerina.runtime.api.values.BTypedesc; import java.util.Map; -import java.util.Set; /** *

diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlNonElementItem.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlNonElementItem.java index 0c4424ee792f..0a40cc982b3c 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlNonElementItem.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlNonElementItem.java @@ -35,7 +35,6 @@ import java.nio.charset.StandardCharsets; import java.util.List; import java.util.NoSuchElementException; -import java.util.Set; import static io.ballerina.runtime.api.constants.RuntimeConstants.STRING_NULL_VALUE; From 35f82c06b3de5a838c9654b86a41df59b3a62034 Mon Sep 17 00:00:00 2001 From: gabilang Date: Fri, 1 Dec 2023 09:38:39 +0530 Subject: [PATCH 13/15] Improve ValuePair class equality checks --- .../runtime/internal/TypeChecker.java | 3 +- .../internal/values/AbstractArrayValue.java | 2 +- .../runtime/internal/values/MapValueImpl.java | 2 +- .../internal/values/TableValueImpl.java | 2 +- .../runtime/internal/values/ValuePair.java | 48 ++----------------- 5 files changed, 8 insertions(+), 49 deletions(-) diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/TypeChecker.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/TypeChecker.java index 15edd817275c..1a68e9d8dc61 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/TypeChecker.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/TypeChecker.java @@ -88,7 +88,6 @@ import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; -import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Objects; @@ -377,7 +376,7 @@ public static Type getType(Object value) { * @return True if values are equal, else false. */ public static boolean isEqual(Object lhsValue, Object rhsValue) { - return isEqual(lhsValue, rhsValue, new LinkedHashSet<>()); + return isEqual(lhsValue, rhsValue, new HashSet<>()); } /** diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/AbstractArrayValue.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/AbstractArrayValue.java index 1585d0120483..a50db6fe6ce7 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/AbstractArrayValue.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/AbstractArrayValue.java @@ -79,7 +79,7 @@ public void append(Object value) { public boolean equals(Object o, Set visitedValues) { ValuePair compValuePair = new ValuePair(this, o); for (ValuePair valuePair : visitedValues) { - if (valuePair.equals(compValuePair, visitedValues)) { + if (valuePair.equals(compValuePair)) { return true; } } diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/MapValueImpl.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/MapValueImpl.java index dc463dbc6880..9decbd3adbef 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/MapValueImpl.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/MapValueImpl.java @@ -341,7 +341,7 @@ public boolean containsKey(Object key) { public boolean equals(Object o, Set visitedValues) { ValuePair compValuePair = new ValuePair(this, o); for (ValuePair valuePair : visitedValues) { - if (valuePair.equals(compValuePair, visitedValues)) { + if (valuePair.equals(compValuePair)) { return true; } } diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/TableValueImpl.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/TableValueImpl.java index 59bd1be14210..518c74834e79 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/TableValueImpl.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/TableValueImpl.java @@ -482,7 +482,7 @@ public Type getIteratorNextReturnType() { public boolean equals(Object o, Set visitedValues) { ValuePair compValuePair = new ValuePair(this, o); for (ValuePair valuePair : visitedValues) { - if (valuePair.equals(compValuePair, visitedValues)) { + if (valuePair.equals(compValuePair)) { return true; } } diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/ValuePair.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/ValuePair.java index 3d875fc0c885..7be09a6eb686 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/ValuePair.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/ValuePair.java @@ -18,12 +18,7 @@ package io.ballerina.runtime.internal.values; -import io.ballerina.runtime.api.types.Type; -import io.ballerina.runtime.api.values.BLink; -import io.ballerina.runtime.api.values.BTypedesc; - -import java.util.LinkedHashSet; -import java.util.Map; +import java.util.HashSet; import java.util.Set; /** @@ -32,27 +27,22 @@ * @since 2201.9.0 */ -public class ValuePair implements RefValue { +public class ValuePair { - Set valuePairSet = new LinkedHashSet<>(2); + Set valuePairSet = new HashSet<>(2); public ValuePair(Object obj1, Object obj2) { valuePairSet.add(obj1); valuePairSet.add(obj2); } - @Override - public boolean equals(Object o, Set visitedValues) { + public boolean equals(Object o) { if (!(o instanceof ValuePair valuePair)) { return false; } Set otherSet = valuePair.valuePairSet; Set currentSet = this.valuePairSet; - if (otherSet.size() != currentSet.size()) { - return false; - } - for (Object otherObj : otherSet) { if (!currentSet.contains(otherObj)) { return false; @@ -60,34 +50,4 @@ public boolean equals(Object o, Set visitedValues) { } return true; } - - @Override - public BTypedesc getTypedesc() { - return null; - } - - @Override - public Object copy(Map refs) { - return null; - } - - @Override - public Object frozenCopy(Map refs) { - return null; - } - - @Override - public String stringValue(BLink parent) { - return null; - } - - @Override - public String expressionStringValue(BLink parent) { - return null; - } - - @Override - public Type getType() { - return null; - } } From c023ca5bc7d3b5fd3f83a05efebf696379a25aa6 Mon Sep 17 00:00:00 2001 From: gabilang Date: Tue, 12 Dec 2023 08:57:22 +0530 Subject: [PATCH 14/15] Remove unnecessary and repeated checks --- .../ballerina/runtime/internal/values/ErrorValue.java | 10 +--------- .../runtime/internal/values/MapValueImpl.java | 4 ---- .../runtime/internal/values/TableValueImpl.java | 3 --- .../ballerina/runtime/internal/values/ValuePair.java | 1 - 4 files changed, 1 insertion(+), 17 deletions(-) diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/ErrorValue.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/ErrorValue.java index 80806ce2b465..66733b0fe907 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/ErrorValue.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/ErrorValue.java @@ -460,15 +460,7 @@ private boolean isCompilerAddedName(String name) { */ @Override public boolean equals(Object o, Set visitedValues) { - ValuePair compValuePair = new ValuePair(this, o); - if (visitedValues.contains(compValuePair)) { - return true; - } - visitedValues.add(compValuePair); - - if (!(o instanceof ErrorValue errorValue)) { - return false; - } + ErrorValue errorValue = (ErrorValue) o; return isEqual(this.getMessage(), errorValue.getMessage(), visitedValues) && ((MapValueImpl) this.getDetails()).equals(errorValue.getDetails(), visitedValues) && isEqual(this.getCause(), errorValue.getCause(), visitedValues); diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/MapValueImpl.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/MapValueImpl.java index 9decbd3adbef..7ab29572ea41 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/MapValueImpl.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/MapValueImpl.java @@ -347,10 +347,6 @@ public boolean equals(Object o, Set visitedValues) { } visitedValues.add(compValuePair); - if (this == o) { - return true; - } - if (!(o instanceof MapValueImpl mapValue)) { return false; } diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/TableValueImpl.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/TableValueImpl.java index 518c74834e79..f5bb700cebd4 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/TableValueImpl.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/TableValueImpl.java @@ -488,9 +488,6 @@ public boolean equals(Object o, Set visitedValues) { } visitedValues.add(compValuePair); - if (o == this) { - return true; - } if (!(o instanceof TableValueImpl table)) { return false; } diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/ValuePair.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/ValuePair.java index 7be09a6eb686..2c7edbe3f8cb 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/ValuePair.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/ValuePair.java @@ -40,7 +40,6 @@ public boolean equals(Object o) { if (!(o instanceof ValuePair valuePair)) { return false; } - Set otherSet = valuePair.valuePairSet; Set currentSet = this.valuePairSet; for (Object otherObj : otherSet) { From 41b1748d77ee3222a9fe7756e2491135ac8abc72 Mon Sep 17 00:00:00 2001 From: gabilang Date: Tue, 2 Jan 2024 13:26:11 +0530 Subject: [PATCH 15/15] Remove additional white spaces --- .../io/ballerina/runtime/internal/values/AbstractArrayValue.java | 1 - .../java/io/ballerina/runtime/internal/values/XmlSequence.java | 1 - 2 files changed, 2 deletions(-) diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/AbstractArrayValue.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/AbstractArrayValue.java index a50db6fe6ce7..6cbb87ab09ef 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/AbstractArrayValue.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/AbstractArrayValue.java @@ -89,7 +89,6 @@ public boolean equals(Object o, Set visitedValues) { if (arrayValue.size() != this.size()) { return false; } - for (int i = 0; i < this.size(); i++) { if (!isEqual(this.get(i), arrayValue.get(i), visitedValues)) { return false; diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlSequence.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlSequence.java index 97294f69be1d..8c7dd1e628f3 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlSequence.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/values/XmlSequence.java @@ -686,7 +686,6 @@ private static boolean isXMLSequenceChildrenEqual(List lhsList, List if (lhsList.size() != rhsList.size()) { return false; } - for (int i = 0; i < lhsList.size(); i++) { if (!isEqual(lhsList.get(i), rhsList.get(i))) { return false;