From ba6babd829c267e763ede206acd2950c3c0cc5d0 Mon Sep 17 00:00:00 2001 From: t-mangoe Date: Sun, 7 Apr 2019 17:37:18 +0900 Subject: [PATCH 1/3] fix checking a surrogate pair --- src/main/java/com/jsoniter/output/StreamImplString.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/jsoniter/output/StreamImplString.java b/src/main/java/com/jsoniter/output/StreamImplString.java index 7116f359..4d6e5952 100644 --- a/src/main/java/com/jsoniter/output/StreamImplString.java +++ b/src/main/java/com/jsoniter/output/StreamImplString.java @@ -175,10 +175,11 @@ private static void writeStringSlowPathWithoutEscapeUnicode(JsonStream stream, S int firstPart = _surrogate; _surrogate = 0; // Ok, then, is the second part valid? - if (c < SURR2_FIRST || c > SURR2_LAST) { - throw new JsonException("Broken surrogate pair: first char 0x" + Integer.toHexString(firstPart) + ", second 0x" + Integer.toHexString(c) + "; illegal combination"); + int secondPart = val.charAt(++i); + if (secondPart < SURR2_FIRST || secondPart > SURR2_LAST) { + throw new JsonException("Broken surrogate pair: first char 0x" + Integer.toHexString(firstPart) + ", second 0x" + Integer.toHexString(secondPart) + "; illegal combination"); } - c = 0x10000 + ((firstPart - SURR1_FIRST) << 10) + (c - SURR2_FIRST); + c = 0x10000 + ((firstPart - SURR1_FIRST) << 10) + (secondPart - SURR2_FIRST); if (c > 0x10FFFF) { // illegal in JSON as well as in XML throw new JsonException("illegalSurrogate"); } From ec7bb60c459efa1f6e3195c7efbf19dea17683fd Mon Sep 17 00:00:00 2001 From: t-mangoe Date: Sat, 13 Apr 2019 13:35:00 +0900 Subject: [PATCH 2/3] read double value by BigDecimal --- src/main/java/com/jsoniter/IterImpl.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/jsoniter/IterImpl.java b/src/main/java/com/jsoniter/IterImpl.java index 1cd9515e..962d6737 100644 --- a/src/main/java/com/jsoniter/IterImpl.java +++ b/src/main/java/com/jsoniter/IterImpl.java @@ -1,12 +1,13 @@ package com.jsoniter; +import java.io.IOException; +import java.math.BigDecimal; +import java.math.BigInteger; + import com.jsoniter.any.Any; import com.jsoniter.spi.JsonException; import com.jsoniter.spi.Slice; -import java.io.IOException; -import java.math.BigInteger; - class IterImpl { private static BigInteger maxLong = BigInteger.valueOf(Long.MAX_VALUE); @@ -469,7 +470,10 @@ static final double readDouble(final JsonIterator iter) throws IOException { decimalPart = -decimalPart; int decimalPlaces = iter.head - start; if (decimalPlaces > 0 && decimalPlaces < IterImplNumber.POW10.length && (iter.head - oldHead) < 10) { - return value + (decimalPart / (double) IterImplNumber.POW10[decimalPlaces]); + BigDecimal integerPart = new BigDecimal(value); + BigDecimal fractionalPart = new BigDecimal((decimalPart / (double) IterImplNumber.POW10[decimalPlaces])); + BigDecimal result = integerPart.add(fractionalPart).setScale(decimalPlaces,BigDecimal.ROUND_HALF_UP); + return result.doubleValue(); } else { iter.head = oldHead; return IterImplForStreaming.readDoubleSlowPath(iter); From 24f9551387c4bb0daf813f537867bfadb542bb35 Mon Sep 17 00:00:00 2001 From: t-mangoe Date: Sat, 13 Apr 2019 13:57:46 +0900 Subject: [PATCH 3/3] Revert "read double value by BigDecimal" This reverts commit ec7bb60c459efa1f6e3195c7efbf19dea17683fd. --- src/main/java/com/jsoniter/IterImpl.java | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/jsoniter/IterImpl.java b/src/main/java/com/jsoniter/IterImpl.java index 962d6737..1cd9515e 100644 --- a/src/main/java/com/jsoniter/IterImpl.java +++ b/src/main/java/com/jsoniter/IterImpl.java @@ -1,13 +1,12 @@ package com.jsoniter; -import java.io.IOException; -import java.math.BigDecimal; -import java.math.BigInteger; - import com.jsoniter.any.Any; import com.jsoniter.spi.JsonException; import com.jsoniter.spi.Slice; +import java.io.IOException; +import java.math.BigInteger; + class IterImpl { private static BigInteger maxLong = BigInteger.valueOf(Long.MAX_VALUE); @@ -470,10 +469,7 @@ static final double readDouble(final JsonIterator iter) throws IOException { decimalPart = -decimalPart; int decimalPlaces = iter.head - start; if (decimalPlaces > 0 && decimalPlaces < IterImplNumber.POW10.length && (iter.head - oldHead) < 10) { - BigDecimal integerPart = new BigDecimal(value); - BigDecimal fractionalPart = new BigDecimal((decimalPart / (double) IterImplNumber.POW10[decimalPlaces])); - BigDecimal result = integerPart.add(fractionalPart).setScale(decimalPlaces,BigDecimal.ROUND_HALF_UP); - return result.doubleValue(); + return value + (decimalPart / (double) IterImplNumber.POW10[decimalPlaces]); } else { iter.head = oldHead; return IterImplForStreaming.readDoubleSlowPath(iter);