From 0e1b3e36eef8c2956d012196e2a49e088b6e150a Mon Sep 17 00:00:00 2001 From: srowen Date: Fri, 13 Aug 2010 03:30:58 +0000 Subject: [PATCH] Workaround for Hotspot bug that lets tests run without -Xint, from Steven Parkes git-svn-id: http://zxing.googlecode.com/svn/trunk@1526 59b500cc-1b3d-0410-9834-0bbf25fbcc57 --- core/build.xml | 1 - .../zxing/common/reedsolomon/ReedSolomonDecoder.java | 9 +++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/core/build.xml b/core/build.xml index 05e43d7a..566ff8c6 100644 --- a/core/build.xml +++ b/core/build.xml @@ -148,7 +148,6 @@ - diff --git a/core/src/com/google/zxing/common/reedsolomon/ReedSolomonDecoder.java b/core/src/com/google/zxing/common/reedsolomon/ReedSolomonDecoder.java index b94a1ebd..e7d05de5 100644 --- a/core/src/com/google/zxing/common/reedsolomon/ReedSolomonDecoder.java +++ b/core/src/com/google/zxing/common/reedsolomon/ReedSolomonDecoder.java @@ -172,8 +172,13 @@ public final class ReedSolomonDecoder { int denominator = 1; for (int j = 0; j < s; j++) { if (i != j) { - denominator = field.multiply(denominator, - GF256.addOrSubtract(1, field.multiply(errorLocations[j], xiInverse))); + //denominator = field.multiply(denominator, + // GF256.addOrSubtract(1, field.multiply(errorLocations[j], xiInverse))); + // Above should work but fails on some Apple and Linux JDKs due to a Hotspot bug. + // Below is a funny-looking workaround from Steven Parkes + int term = field.multiply(errorLocations[j], xiInverse); + int termPlus1 = ((term & 0x1) == 0) ? (term | 1) : (term & ~1); + denominator = field.multiply(denominator, termPlus1); } } result[i] = field.multiply(errorEvaluator.evaluateAt(xiInverse), -- 2.20.1