This is an automated email from the ASF dual-hosted git repository.

toulmean pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-tuweni.git


The following commit(s) were added to refs/heads/master by this push:
     new bcd94f6  Fix corner case bug with handling constants with unsigned ints
bcd94f6 is described below

commit bcd94f6661d904d70a5715784301ae0010ac958c
Author: Antoine Toulme <[email protected]>
AuthorDate: Sat Nov 30 14:25:57 2019 -0800

    Fix corner case bug with handling constants with unsigned ints
---
 .../main/java/org/apache/tuweni/units/bigints/BaseUInt256Value.java | 6 ++++++
 units/src/main/java/org/apache/tuweni/units/bigints/UInt256.java    | 4 ++--
 .../java/org/apache/tuweni/units/bigints/BaseUInt256ValueTest.java  | 1 +
 3 files changed, 9 insertions(+), 2 deletions(-)

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 @@ public abstract class BaseUInt256Value<T extends 
UInt256Value<T>> implements UIn
     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 @@ public abstract class BaseUInt256Value<T extends 
UInt256Value<T>> implements UIn
     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 @@ public final class UInt256 implements UInt256Value<UInt256> 
{
     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 @@ public final class UInt256 implements UInt256Value<UInt256> 
{
     }
 
     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 @@ class BaseUInt256ValueTest {
         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)),


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to