Skip to content

Commit 63eb375

Browse files
committed
Code clean up
1 parent 8f50d4a commit 63eb375

File tree

2 files changed

+45
-68
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

+45
-68
lines changed

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

Lines changed: 21 additions & 34 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.
@@ -2546,17 +2547,16 @@ final class JsonWriter private[jsoniter_scala](
25462547
val pow10 = floatPow10s(31 - e10)
25472548
val hi64 = unsignedMultiplyHigh(pow10, m2.toLong << (h + 37)) // TODO: when dropping JDK 17 support replace by Math.unsignedMultiplyHigh(pow10, m2.toLong << (h + 37))
25482549
m10 = (hi64 >>> 36).toInt * 10
2549-
val dotOne = hi64 & 0xFFFFFFFFFL
25502550
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
2551+
val dotOne = hi64 & 0xFFFFFFFFFL
2552+
if ({
2553+
if (m2IEEE == 0) halfUlpPlusEven >>> 1
2554+
else halfUlpPlusEven
2555+
} <= dotOne) {
2556+
if (halfUlpPlusEven > 0xFFFFFFFFFL - dotOne) m10 += 10
2557+
else m10 += (((dotOne << 4) + (dotOne << 2) + ((hi64 >>> 32).toInt & 0xF) + 0xFFFFFFFF9L) >>> 37).toInt
2558+
}
2559+
if (m2IEEE == 0 && ((e2 == -119) | (e2 == 64) | (e2 == 67))) m10 += 1
25602560
}
25612561
val len = digitCount(m10)
25622562
e10 += len - 1
@@ -2656,34 +2656,21 @@ final class JsonWriter private[jsoniter_scala](
26562656
val lo64_2 = pow10_1 * cb
26572657
var hi64 = unsignedMultiplyHigh(pow10_1, cb) // TODO: when dropping JDK 17 support replace by Math.unsignedMultiplyHigh(pow10_1, cb)
26582658
val lo64 = lo64_1 + lo64_2
2659-
hi64 += java.lang.Long.compareUnsigned(lo64, lo64_1) >>> 31
2659+
hi64 += compareUnsigned(lo64, lo64_1) >>> 31
2660+
m10 = hi64 >>> 6
2661+
m10 = (m10 << 3) + (m10 << 1)
2662+
val halfUlpPlusEven = (pow10_1 >>> -h) + ((m2.toInt + 1) & 1)
26602663
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-
}
2664+
if (compareUnsigned(halfUlpPlusEven, -1 - dotOne) > 0) m10 += 10L
2665+
else if (m2IEEE != 0) {
2666+
if (compareUnsigned(halfUlpPlusEven, dotOne) <= 0) m10 = calculateM10(hi64, lo64, dotOne)
26732667
} else {
26742668
var tmp1 = dotOne >>> 4
26752669
tmp1 = (tmp1 << 3) + (tmp1 << 1)
2676-
var tmp2 = halfUlp >>> 4
2670+
var tmp2 = halfUlpPlusEven >>> 4
26772671
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-
}
2672+
if (compareUnsigned((tmp1 << 4) >>> 4, tmp2) > 0) m10 += (tmp1 >>> 60).toInt + 1
2673+
else if (compareUnsigned(halfUlpPlusEven >>> 1, dotOne) <= 0) m10 = calculateM10(hi64, lo64, dotOne)
26872674
}
26882675
}
26892676
val len = digitCount(m10)
@@ -2756,7 +2743,7 @@ final class JsonWriter private[jsoniter_scala](
27562743

27572744
@inline
27582745
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) + {
2746+
((lo >>> 61).toInt + (lo >>> 63).toInt + (compareUnsigned((lo << 3) + (lo << 1), lo << 1) >>> 31) + {
27602747
if (dotOne == 0x4000000000000000L) 0x1F
27612748
else 0x20
27622749
})) >>> 6

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

Lines changed: 24 additions & 34 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.
@@ -2269,17 +2270,16 @@ final class JsonWriter private[jsoniter_scala](
22692270
val pow10 = floatPow10s(31 - e10)
22702271
val hi64 = unsignedMultiplyHigh1(pow10, m2.toLong << (h + 37)) // TODO: when dropping JDK 17 support replace by Math.unsignedMultiplyHigh(pow10, m2.toLong << (h + 37))
22712272
m10 = (hi64 >>> 36).toInt * 10
2272-
val dotOne = hi64 & 0xFFFFFFFFFL
22732273
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
2274+
val dotOne = hi64 & 0xFFFFFFFFFL
2275+
if ({
2276+
if (m2IEEE == 0) halfUlpPlusEven >>> 1
2277+
else halfUlpPlusEven
2278+
} <= dotOne) {
2279+
if (halfUlpPlusEven > 0xFFFFFFFFFL - dotOne) m10 += 10
2280+
else m10 += ((dotOne * 20 + ((hi64 >>> 32).toInt & 0xF) + 0xFFFFFFFF9L) >>> 37).toInt
2281+
}
2282+
if (m2IEEE == 0 && ((e2 == -119) | (e2 == 64) | (e2 == 67))) m10 += 1
22832283
}
22842284
val len = digitCount(m10.toLong)
22852285
e10 += len - 1
@@ -2374,33 +2374,17 @@ final class JsonWriter private[jsoniter_scala](
23742374
val lo64_2 = pow10_1 * cb
23752375
var hi64 = unsignedMultiplyHigh2(pow10_1, cb) // TODO: when dropping JDK 17 support replace by Math.unsignedMultiplyHigh(pow10_1, cb)
23762376
val lo64 = lo64_1 + lo64_2
2377-
hi64 += java.lang.Long.compareUnsigned(lo64, lo64_1) >>> 31
2377+
hi64 += compareUnsigned(lo64, lo64_1) >>> 31
2378+
m10 = (hi64 >>> 6) * 10L
2379+
val halfUlpPlusEven = (pow10_1 >>> -h) + ((m2.toInt + 1) & 1)
23782380
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-
}
2381+
if (compareUnsigned(halfUlpPlusEven, -1 - dotOne) > 0) m10 += 10L
2382+
else if (m2IEEE != 0) {
2383+
if (compareUnsigned(halfUlpPlusEven, dotOne) <= 0) m10 = calculateM10(hi64, lo64, dotOne)
23922384
} else {
23932385
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-
}
2386+
if (compareUnsigned((tmp << 4) >>> 4, (halfUlpPlusEven >>> 4) * 5L) > 0) m10 += (tmp >>> 60).toInt + 1
2387+
else if (compareUnsigned(halfUlpPlusEven >>> 1, dotOne) <= 0) m10 = calculateM10(hi64, lo64, dotOne)
24042388
}
24052389
}
24062390
val len = digitCount(m10)
@@ -2452,6 +2436,12 @@ final class JsonWriter private[jsoniter_scala](
24522436
count = pos
24532437
}
24542438

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

0 commit comments

Comments
 (0)