Skip to content

Commit 2b50366

Browse files
committed
More efficient reading of BigDecimal, BigInt, Double, Float and java.time.Duration values with Scala.js
1 parent 9e2439e commit 2b50366

File tree

1 file changed

+23
-22
lines changed
  • jsoniter-scala-core/js/src/main/scala/com/github/plokhotnyuk/jsoniter_scala/core

1 file changed

+23
-22
lines changed

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

Lines changed: 23 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2244,7 +2244,7 @@ final class JsonReader private[jsoniter_scala](
22442244
b >= '0' && b <= '9'
22452245
}) {
22462246
if (m10 < 922337203685477580L) {
2247-
m10 = m10 * 10 + (b - '0')
2247+
m10 = (m10 << 3) + (m10 << 1) + (b - '0')
22482248
digits += 1
22492249
} else e10 += 1
22502250
pos += 1
@@ -2263,7 +2263,7 @@ final class JsonReader private[jsoniter_scala](
22632263
b >= '0' && b <= '9'
22642264
}) {
22652265
if (m10 < 922337203685477580L) {
2266-
m10 = m10 * 10 + (b - '0')
2266+
m10 = (m10 << 3) + (m10 << 1) + (b - '0')
22672267
digits += 1
22682268
}
22692269
noFracDigits = false
@@ -2392,7 +2392,7 @@ final class JsonReader private[jsoniter_scala](
23922392
b >= '0' && b <= '9'
23932393
}) {
23942394
if (m10 < 922337203685477580L) {
2395-
m10 = m10 * 10 + (b - '0')
2395+
m10 = (m10 << 3) + (m10 << 1) + (b - '0')
23962396
digits += 1
23972397
} else e10 += 1
23982398
pos += 1
@@ -2411,7 +2411,7 @@ final class JsonReader private[jsoniter_scala](
24112411
b >= '0' && b <= '9'
24122412
}) {
24132413
if (m10 < 922337203685477580L) {
2414-
m10 = m10 * 10 + (b - '0')
2414+
m10 = (m10 << 3) + (m10 << 1) + (b - '0')
24152415
digits += 1
24162416
}
24172417
noFracDigits = false
@@ -2665,12 +2665,12 @@ final class JsonReader private[jsoniter_scala](
26652665
var x = (buf(from) - '0').toLong
26662666
from += 1
26672667
while (from < fracLimit) {
2668-
x = x * 10 + (buf(from) - '0')
2668+
x = (x << 3) + (x << 1) + (buf(from) - '0')
26692669
from += 1
26702670
}
26712671
from += 1
26722672
while (from < limit) {
2673-
x = x * 10 + (buf(from) - '0')
2673+
x = (x << 3) + (x << 1) + (buf(from) - '0')
26742674
from += 1
26752675
}
26762676
if (s != 0) x = -x
@@ -2697,7 +2697,7 @@ final class JsonReader private[jsoniter_scala](
26972697
}
26982698
var x1 = x.toLong
26992699
while (pos < limit) {
2700-
x1 = x1 * 10 + (buf(pos) - '0')
2700+
x1 = (x1 << 3) + (x1 << 1) + (buf(pos) - '0')
27012701
pos += 1
27022702
}
27032703
if (s != 0) x1 = -x1
@@ -2729,7 +2729,7 @@ final class JsonReader private[jsoniter_scala](
27292729
}
27302730
var x1 = x.toLong
27312731
while (pos < limit) {
2732-
x1 = x1 * 10 + (buf(pos) - '0')
2732+
x1 = (x1 << 3) + (x1 << 1) + (buf(pos) - '0')
27332733
pos += 1
27342734
}
27352735
if (s != 0) x1 = -x1
@@ -2758,19 +2758,20 @@ final class JsonReader private[jsoniter_scala](
27582758
var x1 = x.toLong
27592759
val limit2 = limit - 18
27602760
while (pos < limit2) {
2761-
x1 = x1 * 10 + (buf(pos) - '0')
2761+
x1 = (x1 << 3) + (x1 << 1) + (buf(pos) - '0')
27622762
pos += 1
27632763
}
27642764
var x2 =
2765-
(buf(pos) * 10 + buf(pos + 1)) * 10000000000000000L +
2766-
((buf(pos + 2) * 10 + buf(pos + 3)) * 1000000 +
2767-
(buf(pos + 4) * 10 + buf(pos + 5)) * 10000 +
2768-
(buf(pos + 6) * 10 + buf(pos + 7)) * 100 +
2769-
(buf(pos + 8) * 10 + buf(pos + 9))) * 100000000L +
2770-
((buf(pos + 10) * 10 + buf(pos + 11)) * 1000000 +
2771-
(buf(pos + 12) * 10 + buf(pos + 13)) * 10000 +
2772-
(buf(pos + 14) * 10 + buf(pos + 15)) * 100 +
2773-
buf(pos + 16) * 10 + buf(pos + 17)) - 5333333333333333328L // 5333333333333333328L == '0' * 111111111111111111L
2765+
((buf(pos) * 10 + buf(pos + 1) - 528) * 10000000 + // 528 == '0' * 11
2766+
((buf(pos + 2) * 10 + buf(pos + 3)) * 100000 +
2767+
(buf(pos + 4) * 10 + buf(pos + 5)) * 1000 +
2768+
(buf(pos + 6) * 10 + buf(pos + 7)) * 10 +
2769+
buf(pos + 8) - 53333328)) * 1000000000L + // 53333328 == '0' * 1111111
2770+
((buf(pos + 9) * 10 + buf(pos + 10) - 528) * 10000000 + // 528 == '0' * 11
2771+
((buf(pos + 11) * 10 + buf(pos + 12)) * 100000 +
2772+
(buf(pos + 13) * 10 + buf(pos + 14)) * 1000 +
2773+
(buf(pos + 15) * 10 + buf(pos + 16)) * 10 +
2774+
buf(pos + 17) - 53333328)) // 53333328 == '0' * 1111111
27742775
if (s != 0) {
27752776
x1 = -x1
27762777
x2 = -x2
@@ -2796,18 +2797,18 @@ final class JsonReader private[jsoniter_scala](
27962797
val firstBlockLimit = len % 9 + p
27972798
var pos = p
27982799
while (pos < firstBlockLimit) {
2799-
x = x * 10 + (buf(pos) - '0')
2800+
x = (x << 3) + (x << 1) + (buf(pos) - '0')
28002801
pos += 1
28012802
}
28022803
magnitude(last) = x.toInt
28032804
var first = last
28042805
while (pos < limit) {
28052806
x =
2806-
(buf(pos) * 10 + buf(pos + 1)) * 10000000L +
2807+
(buf(pos) * 10 + buf(pos + 1) - 528) * 10000000 + // 528 == '0' * 11
28072808
((buf(pos + 2) * 10 + buf(pos + 3)) * 100000 +
28082809
(buf(pos + 4) * 10 + buf(pos + 5)) * 1000 +
28092810
(buf(pos + 6) * 10 + buf(pos + 7)) * 10 +
2810-
buf(pos + 8)) - 5333333328L // 5333333328L == '0' * 111111111L
2811+
buf(pos + 8) - 53333328) // 53333328 == '0' * 1111111
28112812
pos += 9
28122813
first = Math.max(first - 1, 0)
28132814
var i = last
@@ -2901,7 +2902,7 @@ final class JsonReader private[jsoniter_scala](
29012902
b >= '0' && b <= '9'
29022903
}) {
29032904
if (x < -922337203685477580L || {
2904-
x = x * 10 + ('0' - b)
2905+
x = (x << 3) + (x << 1) + ('0' - b)
29052906
x > 0
29062907
}) durationError(pos)
29072908
pos += 1

0 commit comments

Comments
 (0)