Skip to content

Commit 0850bc9

Browse files
committed
More efficient parsing of small BigInt and BigDecimal values using Scala.js
1 parent f2db979 commit 0850bc9

File tree

2 files changed

+15
-15
lines changed
  • jsoniter-scala-core

2 files changed

+15
-15
lines changed

jsoniter-scala-core/js/src/main/scala/com/github/plokhotnyuk/jsoniter_scala/core/JsonReader.scala

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2570,8 +2570,8 @@ final class JsonReader private[jsoniter_scala](
25702570
if (len < 19) {
25712571
var x = buf(from) - '0'
25722572
from += 1
2573-
val posM10 = pos - 10
2574-
while (from < posM10) {
2573+
val limit = Math.min(from + 8, pos)
2574+
while (from < limit) {
25752575
x = x * 10 + (buf(from) - '0')
25762576
from += 1
25772577
}
@@ -2737,7 +2737,7 @@ final class JsonReader private[jsoniter_scala](
27372737
var pos = p
27382738
var x = buf(pos) - '0'
27392739
pos += 1
2740-
val limit1 = limit - 10
2740+
val limit1 = Math.min(pos + 8, limit)
27412741
while (pos < limit1) {
27422742
x = x * 10 + (buf(pos) - '0')
27432743
pos += 1
@@ -2765,13 +2765,13 @@ final class JsonReader private[jsoniter_scala](
27652765
var pos = p
27662766
var x = buf(pos) - '0'
27672767
pos += 1
2768-
val limit1 = limit - 27
2768+
val limit2 = limit - 18
2769+
val limit1 = Math.min(pos + 8, limit2)
27692770
while (pos < limit1) {
27702771
x = x * 10 + (buf(pos) - '0')
27712772
pos += 1
27722773
}
27732774
var x1 = x.toLong
2774-
val limit2 = limit - 18
27752775
while (pos < limit2) {
27762776
x1 = (x1 << 3) + (x1 << 1) + (buf(pos) - '0')
27772777
pos += 1
@@ -2808,22 +2808,22 @@ final class JsonReader private[jsoniter_scala](
28082808
i += 1
28092809
}
28102810
}
2811-
var x = 0L
2812-
val firstBlockLimit = len % 9 + p
2811+
var x1 = 0
2812+
val limit1 = len % 9 + p
28132813
var pos = p
2814-
while (pos < firstBlockLimit) {
2815-
x = (x << 3) + (x << 1) + (buf(pos) - '0')
2814+
while (pos < limit1) {
2815+
x1 = x1 * 10 + (buf(pos) - '0')
28162816
pos += 1
28172817
}
2818-
magnitude(last) = x.toInt
2818+
magnitude(last) = x1
28192819
var first = last
28202820
while (pos < limit) {
2821-
x =
2822-
(buf(pos) * 10 + buf(pos + 1) - 528) * 10000000 + // 528 == '0' * 11
2821+
var x =
2822+
((buf(pos) * 10 + buf(pos + 1) - 528) * 10000000 + // 528 == '0' * 11
28232823
((buf(pos + 2) * 10 + buf(pos + 3)) * 100000 +
28242824
(buf(pos + 4) * 10 + buf(pos + 5)) * 1000 +
28252825
(buf(pos + 6) * 10 + buf(pos + 7)) * 10 +
2826-
buf(pos + 8) - 53333328) // 53333328 == '0' * 1111111
2826+
buf(pos + 8) - 53333328)).toLong // 53333328 == '0' * 1111111
28272827
pos += 9
28282828
first = Math.max(first - 1, 0)
28292829
var i = last

jsoniter-scala-core/native/src/main/scala/com/github/plokhotnyuk/jsoniter_scala/core/JsonReader.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2299,7 +2299,7 @@ final class JsonReader private[jsoniter_scala](
22992299
else if (e10 >= 310) Double.PositiveInfinity
23002300
else {
23012301
var shift = java.lang.Long.numberOfLeadingZeros(m10)
2302-
var m2 = NativeMath.unsignedMultiplyHigh(pow10Mantissas(e10 + 343), m10 << shift) // FIXME: Use Math.unsignedMultiplyHigh after dropping of JDK 17 support
2302+
var m2 = NativeMath.unsignedMultiplyHigh(pow10Mantissas(e10 + 343), m10 << shift)
23032303
var e2 = (e10 * 108853 >> 15) - shift + 1 // (e10 * Math.log(10) / Math.log(2)).toInt - shift + 1
23042304
shift = java.lang.Long.numberOfLeadingZeros(m2)
23052305
m2 <<= shift
@@ -2447,7 +2447,7 @@ final class JsonReader private[jsoniter_scala](
24472447
else if (e10 >= 39) Float.PositiveInfinity
24482448
else {
24492449
var shift = java.lang.Long.numberOfLeadingZeros(m10)
2450-
var m2 = NativeMath.unsignedMultiplyHigh(pow10Mantissas(e10 + 343), m10 << shift) // FIXME: Use Math.unsignedMultiplyHigh after dropping of JDK 17 support
2450+
var m2 = NativeMath.unsignedMultiplyHigh(pow10Mantissas(e10 + 343), m10 << shift)
24512451
var e2 = (e10 * 108853 >> 15) - shift + 1 // (e10 * Math.log(10) / Math.log(2)).toInt - shift + 1
24522452
shift = java.lang.Long.numberOfLeadingZeros(m2)
24532453
m2 <<= shift

0 commit comments

Comments
 (0)