Skip to content

Commit

Permalink
avoid allocating a objectAttributeKeyWriteMap lambda when writing cas…
Browse files Browse the repository at this point in the history
…e classes
  • Loading branch information
lihaoyi committed Mar 19, 2023
1 parent 0b37e95 commit 6329d73
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 10 deletions.
5 changes: 2 additions & 3 deletions implicits/src-2/upickle/implicits/internal/Macros.scala
Original file line number Diff line number Diff line change
Expand Up @@ -345,10 +345,9 @@ object Macros {

def write(i: Int) = {
val snippet = q"""
this.writeSnippet[R, ${argTypes(i)}](
${c.prefix}.objectAttributeKeyWriteMap,
this.writeSnippetMappedName[R, ${argTypes(i)}](
ctx,
${mappedArgs(i)},
${c.prefix}.objectAttributeKeyWriteMap(${mappedArgs(i)}),
implicitly[${c.prefix}.Writer[${argTypes(i)}]],
v.${TermName(rawArgs(i))}
)
Expand Down
3 changes: 1 addition & 2 deletions implicits/src-3/upickle/implicits/macros.scala
Original file line number Diff line number Diff line change
Expand Up @@ -144,9 +144,8 @@ def writeSnippetsImpl[R, T, WS <: Tuple](thisOuter: Expr[upickle.core.Types with
val select = Select.unique(v.asTerm, rawLabel.name).asExprOf[Any]
val snippet = '{
${self}.writeSnippet[R, tpe](
${thisOuter}.objectAttributeKeyWriteMap,
${ctx},
${Expr(label)},
${thisOuter}.objectAttributeKeyWriteMap(${Expr(label)}),
summonInline[Tuple.Elem[WS, index]],
${select},
)
Expand Down
19 changes: 14 additions & 5 deletions implicits/src/upickle/implicits/CaseClassReadWriters.scala
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ trait CaseClassReadWriters extends upickle.core.Types{
@deprecated("Not used, left for binary compatibility")
def writeToObject[R](ctx: ObjVisitor[_, R], v: V): Unit

@scala.annotation.nowarn
def write0[R](out: Visitor[_, R], v: V): R = {
if (v == null) out.visitNull(-1)
else {
Expand All @@ -33,16 +34,24 @@ trait CaseClassReadWriters extends upickle.core.Types{
}
}

def writeSnippetMappedName[R, V](ctx: _root_.upickle.core.ObjVisitor[_, R],
mappedArgsI: CharSequence,
w: Any,
value: Any) = {
val keyVisitor = ctx.visitKey(-1)
ctx.visitKeyValue(
keyVisitor.visitString(mappedArgsI, -1)
)
ctx.narrow.visitValue(w.asInstanceOf[Writer[Any]].write(ctx.subVisitor, value), -1)
}

@deprecated("Not used, left for binary compatibility")
def writeSnippet[R, V](objectAttributeKeyWriteMap: CharSequence => CharSequence,
ctx: _root_.upickle.core.ObjVisitor[_, R],
mappedArgsI: String,
w: Any,
value: Any) = {
val keyVisitor = ctx.visitKey(-1)
ctx.visitKeyValue(
keyVisitor.visitString(objectAttributeKeyWriteMap(mappedArgsI), -1)
)
ctx.narrow.visitValue(w.asInstanceOf[Writer[Any]].write(ctx.subVisitor, value), -1)
writeSnippetMappedName(ctx, objectAttributeKeyWriteMap(mappedArgsI), w, value)
}
}

Expand Down

0 comments on commit 6329d73

Please sign in to comment.