Skip to content

Commit c68591b

Browse files
committed
More efficient parsing of Scala 3 tuples with arity greater than 22
1 parent 7bd6e79 commit c68591b

File tree

1 file changed

+31
-4
lines changed
  • jsoniter-scala-macros/shared/src/main/scala-3/com/github/plokhotnyuk/jsoniter_scala/macros

1 file changed

+31
-4
lines changed

jsoniter-scala-macros/shared/src/main/scala-3/com/github/plokhotnyuk/jsoniter_scala/macros/JsonCodecMaker.scala

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -997,8 +997,24 @@ object JsonCodecMaker {
997997

998998
def genNew(argss: List[List[Term]]): Term = {
999999
val args = argss.flatten
1000-
if (isGeneric) Expr.ofTupleFromSeq(args.map(_.asExpr)).asTerm
1001-
else {
1000+
if (isGeneric) {
1001+
if (typeArgs.isEmpty) Expr(EmptyTuple).asTerm
1002+
else {
1003+
val arraySym = symbol("as", TypeRepr.of[Array[Any]])
1004+
val arrayRef = Ref(arraySym).asExprOf[Array[Any]]
1005+
val arrayValDef = ValDef(arraySym, Some('{ new Array[Any](${Expr(typeArgs.size)}) }.asTerm))
1006+
val assignments = args.map {
1007+
var i = - 1
1008+
term =>
1009+
i += 1
1010+
'{ $arrayRef(${Expr(i)}) = ${term.asExprOf[Any]} }.asTerm
1011+
}
1012+
val block = Block(arrayValDef :: assignments, arrayRef.asTerm).asExprOf[Array[Any]]
1013+
tupleType match
1014+
case '[tt] =>
1015+
'{ scala.runtime.TupleXXL.fromIArray($block.asInstanceOf[IArray[Object]]).asInstanceOf[tt] }.asTerm
1016+
}
1017+
} else {
10021018
val constructorNoTypes = Select(New(Inferred(tupleTpe)), tupleTpe.typeSymbol.primaryConstructor)
10031019
Apply(TypeApply(constructorNoTypes, typeArgs.map(Inferred(_))), args)
10041020
}
@@ -2706,8 +2722,19 @@ object JsonCodecMaker {
27062722
if ($in.isNextToken(']')) ${
27072723
val size = indexedTypes.size
27082724
if (size == 0) Expr(EmptyTuple)
2709-
else if (size > 22) Expr.ofTupleFromSeq(valDefs.map(x => Ref(x.symbol).asExprOf[Any]))
2710-
else {
2725+
else if (size > 22) {
2726+
val arraySym = symbol("as", TypeRepr.of[Array[Any]])
2727+
val arrayRef = Ref(arraySym).asExprOf[Array[Any]]
2728+
val arrayValDef = ValDef(arraySym, Some('{ new Array[Any](${Expr(size)}) }.asTerm))
2729+
val assignments = valDefs.map {
2730+
var i = - 1
2731+
valDef =>
2732+
i += 1
2733+
'{ $arrayRef(${Expr(i)}) = ${Ref(valDef.symbol).asExprOf[Any]} }.asTerm
2734+
}
2735+
val block = Block(arrayValDef :: assignments, arrayRef.asTerm).asExprOf[Array[Any]]
2736+
'{ scala.runtime.TupleXXL.fromIArray($block.asInstanceOf[IArray[Object]]).asInstanceOf[T] }
2737+
} else {
27112738
val constructorNoTypes = Select(New(Inferred(tTpe)), tTpe.typeSymbol.primaryConstructor)
27122739
Apply(TypeApply(constructorNoTypes, indexedTypes.map(Inferred(_))), valDefs.map(x => Ref(x.symbol))).asExpr
27132740
}

0 commit comments

Comments
 (0)