Skip to content

Commit 075a61e

Browse files
committed
Code clean up
1 parent 8f50d4a commit 075a61e

File tree

2 files changed

+53
-80
lines changed
  • jsoniter-scala-core
    • js/src/main/scala/com/github/plokhotnyuk/jsoniter_scala/core
    • jvm-native/src/main/scala/com/github/plokhotnyuk/jsoniter_scala/core

2 files changed

+53
-80
lines changed

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

Lines changed: 25 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import java.util.UUID
99
import com.github.plokhotnyuk.jsoniter_scala.core.JsonWriter._
1010
import scala.annotation.tailrec
1111
import scala.{specialized => sp}
12+
import java.lang.Long.compareUnsigned
1213

1314
/**
1415
* A writer for iterative serialization of JSON keys and values.
@@ -2539,24 +2540,22 @@ final class JsonWriter private[jsoniter_scala](
25392540
m2 = m2IEEE
25402541
e2 = -149
25412542
} else if (e2 == 105) illegalNumberError(x)
2542-
e10 =
2543-
if (m2IEEE == 0) (e2 * 315653 - 131237) >> 20
2544-
else (e2 * 315653) >> 20
2543+
if (m2IEEE == 0) e10 = (e2 * 315653 - 131237) >> 20
2544+
else e10 = (e2 * 315653) >> 20
25452545
val h = (((e10 + 1) * -217707) >> 16) + e2
25462546
val pow10 = floatPow10s(31 - e10)
25472547
val hi64 = unsignedMultiplyHigh(pow10, m2.toLong << (h + 37)) // TODO: when dropping JDK 17 support replace by Math.unsignedMultiplyHigh(pow10, m2.toLong << (h + 37))
25482548
m10 = (hi64 >>> 36).toInt * 10
2549-
val dotOne = hi64 & 0xFFFFFFFFFL
25502549
val halfUlpPlusEven = (pow10 >>> (28 - h)) + ((m2IEEE + 1) & 1)
2551-
var m10Corr =
2552-
if ({
2553-
if (m2IEEE == 0) halfUlpPlusEven >>> 1
2554-
else halfUlpPlusEven
2555-
} > dotOne) 0
2556-
else if (halfUlpPlusEven > 0xFFFFFFFFFL - dotOne) 10
2557-
else (((dotOne << 4) + (dotOne << 2) + 0xFFFFFFFF9L + ((hi64 >>> 32) & 0xF)) >>> 37).toInt
2558-
if (m2IEEE == 0 && ((e2 == -119) | (e2 == 64) | (e2 == 67))) m10Corr += 1
2559-
m10 += m10Corr
2550+
val dotOne = hi64 & 0xFFFFFFFFFL
2551+
if ({
2552+
if (m2IEEE == 0) halfUlpPlusEven >>> 1
2553+
else halfUlpPlusEven
2554+
} <= dotOne) {
2555+
if (halfUlpPlusEven > 0xFFFFFFFFFL - dotOne) m10 += 10
2556+
else m10 += (((dotOne << 4) + (dotOne << 2) + ((hi64 >>> 32).toInt & 0xF) + 0xFFFFFFFF9L) >>> 37).toInt
2557+
}
2558+
if (m2IEEE == 0 && ((e2 == -119) | (e2 == 64) | (e2 == 67))) m10 += 1
25602559
}
25612560
val len = digitCount(m10)
25622561
e10 += len - 1
@@ -2643,9 +2642,8 @@ final class JsonWriter private[jsoniter_scala](
26432642
m2 = m2IEEE
26442643
e2 = -1074
26452644
} else if (e2 == 972) illegalNumberError(x)
2646-
e10 =
2647-
if (m2IEEE == 0) (e2 * 315653 - 131237) >> 20
2648-
else (e2 * 315653) >> 20
2645+
if (m2IEEE == 0) e10 = (e2 * 315653 - 131237) >> 20
2646+
else e10 = (e2 * 315653) >> 20
26492647
val h = (((e10 + 1) * -217707) >> 16) + e2
26502648
val pow10s = doublePow10s
26512649
val i = 292 - e10 << 1
@@ -2656,34 +2654,21 @@ final class JsonWriter private[jsoniter_scala](
26562654
val lo64_2 = pow10_1 * cb
26572655
var hi64 = unsignedMultiplyHigh(pow10_1, cb) // TODO: when dropping JDK 17 support replace by Math.unsignedMultiplyHigh(pow10_1, cb)
26582656
val lo64 = lo64_1 + lo64_2
2659-
hi64 += java.lang.Long.compareUnsigned(lo64, lo64_1) >>> 31
2657+
hi64 += compareUnsigned(lo64, lo64_1) >>> 31
2658+
m10 = hi64 >>> 6
2659+
m10 = (m10 << 3) + (m10 << 1)
2660+
val halfUlpPlusEven = (pow10_1 >>> -h) + ((m2.toInt + 1) & 1)
26602661
val dotOne = (hi64 << 58) | (lo64 >>> 6)
2661-
val halfUlp = pow10_1 >>> -h
2662-
val even = (m2.toInt + 1) & 1
2663-
if (java.lang.Long.compareUnsigned(halfUlp + even, -1 - dotOne) > 0) {
2664-
m10 = hi64 >>> 6
2665-
m10 = (m10 << 3) + (m10 << 1) + 10L
2666-
} else if (m2IEEE != 0) {
2667-
if (java.lang.Long.compareUnsigned(halfUlp + even, dotOne) > 0) {
2668-
m10 = hi64 >>> 6
2669-
m10 = (m10 << 3) + (m10 << 1)
2670-
} else {
2671-
m10 = calculateM10(hi64, lo64, dotOne)
2672-
}
2662+
if (compareUnsigned(halfUlpPlusEven, -1 - dotOne) > 0) m10 += 10L
2663+
else if (m2IEEE != 0) {
2664+
if (compareUnsigned(halfUlpPlusEven, dotOne) <= 0) m10 = calculateM10(hi64, lo64, dotOne)
26732665
} else {
26742666
var tmp1 = dotOne >>> 4
26752667
tmp1 = (tmp1 << 3) + (tmp1 << 1)
2676-
var tmp2 = halfUlp >>> 4
2668+
var tmp2 = halfUlpPlusEven >>> 4
26772669
tmp2 += tmp2 << 2
2678-
if (java.lang.Long.compareUnsigned((tmp1 << 4) >>> 4, tmp2) > 0) {
2679-
m10 = hi64 >>> 6
2680-
m10 = (m10 << 3) + (m10 << 1) + ((tmp1 >>> 60).toInt + 1)
2681-
} else if (java.lang.Long.compareUnsigned(halfUlp >>> 1, dotOne) > 0) {
2682-
m10 = hi64 >>> 6
2683-
m10 = (m10 << 3) + (m10 << 1)
2684-
} else {
2685-
m10 = calculateM10(hi64, lo64, dotOne)
2686-
}
2670+
if (compareUnsigned((tmp1 << 4) >>> 4, tmp2) > 0) m10 += (tmp1 >>> 60).toInt + 1
2671+
else if (compareUnsigned(halfUlpPlusEven >>> 1, dotOne) <= 0) m10 = calculateM10(hi64, lo64, dotOne)
26872672
}
26882673
}
26892674
val len = digitCount(m10)
@@ -2756,7 +2741,7 @@ final class JsonWriter private[jsoniter_scala](
27562741

27572742
@inline
27582743
private[this] def calculateM10(hi: Long, lo: Long, dotOne: Long): Long = ((hi << 3) + (hi << 1) +
2759-
((lo >>> 61).toInt + (lo >>> 63).toInt + (java.lang.Long.compareUnsigned((lo << 3) + (lo << 1), lo << 1) >>> 31) + {
2744+
((lo >>> 61).toInt + (lo >>> 63).toInt + (compareUnsigned((lo << 3) + (lo << 1), lo << 1) >>> 31) + {
27602745
if (dotOne == 0x4000000000000000L) 0x1F
27612746
else 0x20
27622747
})) >>> 6

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

Lines changed: 28 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import java.util.UUID
99
import com.github.plokhotnyuk.jsoniter_scala.core.JsonWriter._
1010
import scala.annotation.tailrec
1111
import scala.{specialized => sp}
12+
import java.lang.Long.compareUnsigned
1213

1314
/**
1415
* A writer for iterative serialization of JSON keys and values.
@@ -2262,24 +2263,22 @@ final class JsonWriter private[jsoniter_scala](
22622263
m2 = m2IEEE
22632264
e2 = -149
22642265
} else if (e2 == 105) illegalNumberError(x)
2265-
e10 =
2266-
if (m2IEEE == 0) (e2 * 315653 - 131237) >> 20
2267-
else (e2 * 315653) >> 20
2266+
if (m2IEEE == 0) e10 = (e2 * 315653 - 131237) >> 20
2267+
else e10 = (e2 * 315653) >> 20
22682268
val h = (((e10 + 1) * -217707) >> 16) + e2
22692269
val pow10 = floatPow10s(31 - e10)
22702270
val hi64 = unsignedMultiplyHigh1(pow10, m2.toLong << (h + 37)) // TODO: when dropping JDK 17 support replace by Math.unsignedMultiplyHigh(pow10, m2.toLong << (h + 37))
22712271
m10 = (hi64 >>> 36).toInt * 10
2272-
val dotOne = hi64 & 0xFFFFFFFFFL
22732272
val halfUlpPlusEven = (pow10 >>> (28 - h)) + ((m2IEEE + 1) & 1)
2274-
var m10Corr =
2275-
if ({
2276-
if (m2IEEE == 0) halfUlpPlusEven >>> 1
2277-
else halfUlpPlusEven
2278-
} > dotOne) 0
2279-
else if (halfUlpPlusEven > 0xFFFFFFFFFL - dotOne) 10
2280-
else (((dotOne << 4) + (dotOne << 2) + 0xFFFFFFFF9L + ((hi64 >>> 32) & 0xF)) >>> 37).toInt
2281-
if (m2IEEE == 0 && ((e2 == -119) | (e2 == 64) | (e2 == 67))) m10Corr += 1
2282-
m10 += m10Corr
2273+
val dotOne = hi64 & 0xFFFFFFFFFL
2274+
if ({
2275+
if (m2IEEE == 0) halfUlpPlusEven >>> 1
2276+
else halfUlpPlusEven
2277+
} <= dotOne) {
2278+
if (halfUlpPlusEven > 0xFFFFFFFFFL - dotOne) m10 += 10
2279+
else m10 += ((dotOne * 20 + ((hi64 >>> 32).toInt & 0xF) + 0xFFFFFFFF9L) >>> 37).toInt
2280+
}
2281+
if (m2IEEE == 0 && ((e2 == -119) | (e2 == 64) | (e2 == 67))) m10 += 1
22832282
}
22842283
val len = digitCount(m10.toLong)
22852284
e10 += len - 1
@@ -2361,9 +2360,8 @@ final class JsonWriter private[jsoniter_scala](
23612360
m2 = m2IEEE
23622361
e2 = -1074
23632362
} else if (e2 == 972) illegalNumberError(x)
2364-
e10 =
2365-
if (m2IEEE == 0) (e2 * 315653 - 131237) >> 20
2366-
else (e2 * 315653) >> 20
2363+
if (m2IEEE == 0) e10 = (e2 * 315653 - 131237) >> 20
2364+
else e10 = (e2 * 315653) >> 20
23672365
val h = (((e10 + 1) * -217707) >> 16) + e2
23682366
val pow10s = doublePow10s
23692367
val i = 292 - e10 << 1
@@ -2374,33 +2372,17 @@ final class JsonWriter private[jsoniter_scala](
23742372
val lo64_2 = pow10_1 * cb
23752373
var hi64 = unsignedMultiplyHigh2(pow10_1, cb) // TODO: when dropping JDK 17 support replace by Math.unsignedMultiplyHigh(pow10_1, cb)
23762374
val lo64 = lo64_1 + lo64_2
2377-
hi64 += java.lang.Long.compareUnsigned(lo64, lo64_1) >>> 31
2375+
hi64 += compareUnsigned(lo64, lo64_1) >>> 31
2376+
m10 = (hi64 >>> 6) * 10L
2377+
val halfUlpPlusEven = (pow10_1 >>> -h) + ((m2.toInt + 1) & 1)
23782378
val dotOne = (hi64 << 58) | (lo64 >>> 6)
2379-
val halfUlp = pow10_1 >>> -h
2380-
val even = (m2.toInt + 1) & 1
2381-
if (java.lang.Long.compareUnsigned(halfUlp + even, -1 - dotOne) > 0) {
2382-
m10 = (hi64 >>> 6) * 10L + 10L
2383-
} else if (m2IEEE != 0) {
2384-
if (java.lang.Long.compareUnsigned(halfUlp + even, dotOne) > 0) {
2385-
m10 = (hi64 >>> 6) * 10L
2386-
} else {
2387-
m10 = (hi64 * 10L + unsignedMultiplyHigh2(lo64, 10L) + { // TODO: when dropping JDK 17 support replace by Math.unsignedMultiplyHigh(lo64, 10L)
2388-
if (dotOne == 0x4000000000000000L) 0x1FL
2389-
else 0x20L
2390-
}) >>> 6
2391-
}
2379+
if (compareUnsigned(halfUlpPlusEven, -1 - dotOne) > 0) m10 += 10L
2380+
else if (m2IEEE != 0) {
2381+
if (compareUnsigned(halfUlpPlusEven, dotOne) <= 0) m10 = calculateM10(hi64, lo64, dotOne)
23922382
} else {
23932383
val tmp = (dotOne >>> 4) * 10L
2394-
if (java.lang.Long.compareUnsigned((tmp << 4) >>> 4, (halfUlp >>> 4) * 5L) > 0) {
2395-
m10 = (hi64 >>> 6) * 10L + ((tmp >>> 60).toInt + 1)
2396-
} else if (java.lang.Long.compareUnsigned(halfUlp >>> 1, dotOne) > 0) {
2397-
m10 = (hi64 >>> 6) * 10L
2398-
} else {
2399-
m10 = (hi64 * 10L + unsignedMultiplyHigh2(lo64, 10L) + { // TODO: when dropping JDK 17 support replace by Math.unsignedMultiplyHigh(lo64, 10L)
2400-
if (dotOne == 0x4000000000000000L) 0x1FL
2401-
else 0x20L
2402-
}) >>> 6
2403-
}
2384+
if (compareUnsigned((tmp << 4) >>> 4, (halfUlpPlusEven >>> 4) * 5L) > 0) m10 += (tmp >>> 60).toInt + 1
2385+
else if (compareUnsigned(halfUlpPlusEven >>> 1, dotOne) <= 0) m10 = calculateM10(hi64, lo64, dotOne)
24042386
}
24052387
}
24062388
val len = digitCount(m10)
@@ -2452,6 +2434,12 @@ final class JsonWriter private[jsoniter_scala](
24522434
count = pos
24532435
}
24542436

2437+
private[this] def calculateM10(hi: Long, lo: Long, dotOne: Long): Long =
2438+
(hi * 10L + unsignedMultiplyHigh2(lo, 10L) + { // TODO: when dropping JDK 17 support replace by Math.unsignedMultiplyHigh(lo64, 10L)
2439+
if (dotOne == 0x4000000000000000L) 0x1FL
2440+
else 0x20L
2441+
}) >>> 6
2442+
24552443
private[this] def unsignedMultiplyHigh2(x: Long, y: Long): Long =
24562444
Math.multiplyHigh(x, y) + (y & (x >> 63)) // Use implementation that works only when y is positive
24572445

0 commit comments

Comments
 (0)