Skip to content

Commit 6e867e1

Browse files
committed
More efficient reading of exponents in float, double, and BigDecimal types for JVMs and Scala Native
1 parent 0841d0d commit 6e867e1

File tree

2 files changed

+42
-18
lines changed
  • jsoniter-scala-core

2 files changed

+42
-18
lines changed

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

+21-9
Original file line numberDiff line numberDiff line change
@@ -2239,8 +2239,11 @@ final class JsonReader private[jsoniter_scala](
22392239
}
22402240
if ((b | 0x20) == 'e') {
22412241
b = nextByte(pos + 1)
2242-
val sb = b
2243-
if (b == '-' || b == '+') b = nextByte(head)
2242+
var s = 0
2243+
if (b == '-' || b == '+') {
2244+
s = b << 29 >> 31
2245+
b = nextByte(head)
2246+
}
22442247
if (b < '0' || b > '9') numberError()
22452248
var exp = b - '0'
22462249
pos = head
@@ -2256,7 +2259,8 @@ final class JsonReader private[jsoniter_scala](
22562259
if (exp < 214748364) exp = exp * 10 + (b - '0')
22572260
pos += 1
22582261
}
2259-
if (sb == '-') exp = -exp
2262+
exp ^= s
2263+
exp -= s
22602264
e10 += exp
22612265
}
22622266
head = pos
@@ -2387,8 +2391,11 @@ final class JsonReader private[jsoniter_scala](
23872391
}
23882392
if ((b | 0x20) == 'e') {
23892393
b = nextByte(pos + 1)
2390-
val sb = b
2391-
if (b == '-' || b == '+') b = nextByte(head)
2394+
var s = 0
2395+
if (b == '-' || b == '+') {
2396+
s = b << 29 >> 31
2397+
b = nextByte(head)
2398+
}
23922399
if (b < '0' || b > '9') numberError()
23932400
var exp = b - '0'
23942401
pos = head
@@ -2404,7 +2411,8 @@ final class JsonReader private[jsoniter_scala](
24042411
if (exp < 214748364) exp = exp * 10 + (b - '0')
24052412
pos += 1
24062413
}
2407-
if (sb == '-') exp = -exp
2414+
exp ^= s
2415+
exp -= s
24082416
e10 += exp
24092417
}
24102418
head = pos
@@ -2625,8 +2633,11 @@ final class JsonReader private[jsoniter_scala](
26252633
}
26262634
if ((b | 0x20) == 'e') {
26272635
b = nextByte(pos + 1)
2628-
val sb = b
2629-
if (b == '-' || b == '+') b = nextByte(head)
2636+
var s = 0
2637+
if (b == '-' || b == '+') {
2638+
s = b << 29 >> 31
2639+
b = nextByte(head)
2640+
}
26302641
if (b < '0' || b > '9') numberError()
26312642
scale = '0' - b
26322643
pos = head
@@ -2645,7 +2656,8 @@ final class JsonReader private[jsoniter_scala](
26452656
}) numberError(pos)
26462657
pos += 1
26472658
}
2648-
if (sb == '-') scale = -scale
2659+
scale ^= s
2660+
scale -= s
26492661
if (scale == -2147483648) numberError(pos - 1)
26502662
}
26512663
head = pos

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

+21-9
Original file line numberDiff line numberDiff line change
@@ -2239,8 +2239,11 @@ final class JsonReader private[jsoniter_scala](
22392239
}
22402240
if ((b | 0x20) == 'e') {
22412241
b = nextByte(pos + 1)
2242-
val sb = b
2243-
if (b == '-' || b == '+') b = nextByte(head)
2242+
var s = 0
2243+
if (b == '-' || b == '+') {
2244+
s = b << 29 >> 31
2245+
b = nextByte(head)
2246+
}
22442247
if (b < '0' || b > '9') numberError()
22452248
var exp = b - '0'
22462249
pos = head
@@ -2256,7 +2259,8 @@ final class JsonReader private[jsoniter_scala](
22562259
if (exp < 214748364) exp = exp * 10 + (b - '0')
22572260
pos += 1
22582261
}
2259-
if (sb == '-') exp = -exp
2262+
exp ^= s
2263+
exp -= s
22602264
e10 += exp
22612265
}
22622266
head = pos
@@ -2387,8 +2391,11 @@ final class JsonReader private[jsoniter_scala](
23872391
}
23882392
if ((b | 0x20) == 'e') {
23892393
b = nextByte(pos + 1)
2390-
val sb = b
2391-
if (b == '-' || b == '+') b = nextByte(head)
2394+
var s = 0
2395+
if (b == '-' || b == '+') {
2396+
s = b << 29 >> 31
2397+
b = nextByte(head)
2398+
}
23922399
if (b < '0' || b > '9') numberError()
23932400
var exp = b - '0'
23942401
pos = head
@@ -2404,7 +2411,8 @@ final class JsonReader private[jsoniter_scala](
24042411
if (exp < 214748364) exp = exp * 10 + (b - '0')
24052412
pos += 1
24062413
}
2407-
if (sb == '-') exp = -exp
2414+
exp ^= s
2415+
exp -= s
24082416
e10 += exp
24092417
}
24102418
head = pos
@@ -2622,8 +2630,11 @@ final class JsonReader private[jsoniter_scala](
26222630
}
26232631
if ((b | 0x20) == 'e') {
26242632
b = nextByte(pos + 1)
2625-
val sb = b
2626-
if (b == '-' || b == '+') b = nextByte(head)
2633+
var s = 0
2634+
if (b == '-' || b == '+') {
2635+
s = b << 29 >> 31
2636+
b = nextByte(head)
2637+
}
26272638
if (b < '0' || b > '9') numberError()
26282639
scale = '0' - b
26292640
pos = head
@@ -2642,7 +2653,8 @@ final class JsonReader private[jsoniter_scala](
26422653
}) numberError(pos)
26432654
pos += 1
26442655
}
2645-
if (sb == '-') scale = -scale
2656+
scale ^= s
2657+
scale -= s
26462658
if (scale == -2147483648) numberError(pos - 1)
26472659
}
26482660
head = pos

0 commit comments

Comments
 (0)