Fix Uint64 cache lookup 73/84873/1
authorRobert Varga <robert.varga@pantheon.tech>
Wed, 2 Oct 2019 11:13:13 +0000 (13:13 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Wed, 2 Oct 2019 11:18:07 +0000 (13:18 +0200)
Looking up a value which has its 32 least significant bits set to
zero will lead to Uint64.ZERO being returned. This also affects other
values which have LSB bits set so that they match cache length.

Fix this by comparing the long value with cache length, so we get
an accurate check.

JIRA: YANGTOOLS-1028
Change-Id: I33bf061e5ff486beaf034cab7827f93e93003489
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
yang/yang-common/src/main/java/org/opendaylight/yangtools/yang/common/Uint64.java
yang/yang-common/src/test/java/org/opendaylight/yangtools/yang/common/Uint64Test.java

index 0b6797bd6617bc9ea7f0c60d6a61fb4db6a89e3f..1a80bd666f513e958c238e8499df3021b21d6850 100644 (file)
@@ -87,8 +87,7 @@ public class Uint64 extends Number implements CanonicalValue<Uint64> {
     }
 
     private static Uint64 instanceFor(final long value) {
-        final int slot = (int)value;
-        return slot >= 0 && slot < CACHE.length ? CACHE[slot] : new Uint64(value);
+        return value >= 0 && value < CACHE.length ? CACHE[(int) value] : new Uint64(value);
     }
 
     /**
index 707b27ea88bd000fcf318be74a66a1158ff5e0af..c4df482be1352b0bd4a3215a6955ca9f269363cc 100644 (file)
@@ -29,6 +29,8 @@ public class Uint64Test {
         assertEquals(2147483647, Uint64.valueOf(Integer.MAX_VALUE).intValue());
         assertEquals(9223372036854775807L, Uint64.valueOf(Long.MAX_VALUE).longValue());
         assertEquals(0, Uint64.valueOf("0").intValue());
+        assertEquals(2170205184637009920L, Uint64.valueOf(2170205184637009920L).longValue());
+        assertEquals(2170205184637009920L, Uint64.valueOf(new BigInteger("2170205184637009920")).longValue());
     }
 
     @Test