Fix corner case bug with handling constants with unsigned ints
diff --git a/units/src/main/java/org/apache/tuweni/units/bigints/BaseUInt256Value.java b/units/src/main/java/org/apache/tuweni/units/bigints/BaseUInt256Value.java
index 490434d..f0bd282 100644
--- a/units/src/main/java/org/apache/tuweni/units/bigints/BaseUInt256Value.java
+++ b/units/src/main/java/org/apache/tuweni/units/bigints/BaseUInt256Value.java
@@ -198,6 +198,9 @@
if (value.equals(UInt256.ONE)) {
return copy();
}
+ if (this.value.equals(UInt256.ONE)) {
+ return ctor.apply(value);
+ }
return ctor.apply(this.value.multiply(value));
}
@@ -209,6 +212,9 @@
if (value == 1) {
return copy();
}
+ if (this.value.equals(UInt256.ONE)) {
+ return ctor.apply(UInt256.valueOf(value));
+ }
return ctor.apply(this.value.multiply(value));
}
diff --git a/units/src/main/java/org/apache/tuweni/units/bigints/UInt256.java b/units/src/main/java/org/apache/tuweni/units/bigints/UInt256.java
index eb0899f..4ade4ac 100644
--- a/units/src/main/java/org/apache/tuweni/units/bigints/UInt256.java
+++ b/units/src/main/java/org/apache/tuweni/units/bigints/UInt256.java
@@ -191,7 +191,7 @@
result[INTS_SIZE - 2] = (int) (sum & LONG_MASK);
constant &= result[INTS_SIZE - 2] == 0;
long signExtent = (value >> 63) & LONG_MASK;
- for (int i = INTS_SIZE - 3; i >= 0; --i) {
+ for (int i = INTS_SIZE - 2; i >= 0; --i) {
sum = (this.ints[i] & LONG_MASK) + signExtent + (sum >>> 32);
result[i] = (int) (sum & LONG_MASK);
constant &= result[i] == 0;
@@ -295,7 +295,7 @@
}
boolean constant = true;
- for (int i = INTS_SIZE; i < (INTS_SIZE + INTS_SIZE) - 2; ++i) {
+ for (int i = INTS_SIZE; i < (INTS_SIZE + INTS_SIZE) - 1; ++i) {
constant &= (result[i] == 0);
}
if (constant && result[INTS_SIZE + INTS_SIZE - 1] >= 0 && result[INTS_SIZE + INTS_SIZE - 1] <= MAX_CONSTANT) {
diff --git a/units/src/test/java/org/apache/tuweni/units/bigints/BaseUInt256ValueTest.java b/units/src/test/java/org/apache/tuweni/units/bigints/BaseUInt256ValueTest.java
index bec3bb9..728785a 100644
--- a/units/src/test/java/org/apache/tuweni/units/bigints/BaseUInt256ValueTest.java
+++ b/units/src/test/java/org/apache/tuweni/units/bigints/BaseUInt256ValueTest.java
@@ -389,6 +389,7 @@
Arguments.of(v(20), 1L, v(20)),
Arguments.of(hv("0x0a0000000000"), 1L, hv("0x0a0000000000")),
Arguments.of(v(1), 10995116277760L, hv("0x0a0000000000")),
+ Arguments.of(v(7), 1152921504606846976L, hv("0x07000000000000000")),
Arguments.of(v(0), 2L, v(0)),
Arguments.of(v(1), 2L, v(2)),
Arguments.of(v(2), 2L, v(4)),