Skip to content

Commit 34678e2

Browse files
authored
Reduce inlined bytecode size (#86)
move most of the implementation code to the SimpleTableState class, addition of 1 new public method: `SimpleTableState#metadata`
1 parent 1dcf618 commit 34678e2

File tree

1 file changed

+41
-39
lines changed

1 file changed

+41
-39
lines changed

scalasql/namedtuples/src/SimpleTableMacros.scala

Lines changed: 41 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -128,12 +128,12 @@ object SimpleTableMacros {
128128
queryable: Table.Metadata.QueryableProxy
129129
)(e: SimpleTable.Record[?, ?]): IndexedSeq[Expr[?]] = {
130130
var i = 0
131-
val fields = e.productIterator
132131
val buf = IndexedSeq.newBuilder[Seq[Expr[?]]]
133-
while fields.hasNext do
132+
val size = e.productArity
133+
while i < size do
134134
type T
135135
type Field
136-
val field = fields.next().asInstanceOf[Field]
136+
val field = e(i).asInstanceOf[Field]
137137
val row = queryable[Field, T](i)
138138
buf += row.walkExprs(field)
139139
i += 1
@@ -159,11 +159,11 @@ object SimpleTableMacros {
159159
)(c: Product): R = {
160160
var i = 0
161161
val buf = IArray.newBuilder[AnyRef]
162-
val fields = c.productIterator
163-
while fields.hasNext do
162+
val size = c.productArity
163+
while i < size do
164164
type T
165165
type Field
166-
val field = fields.next().asInstanceOf[T]
166+
val field = c.productElement(i).asInstanceOf[T]
167167
val row = queryable[Field, T](i)
168168
buf += row.deconstruct(field).asInstanceOf[AnyRef]
169169
i += 1
@@ -187,6 +187,7 @@ trait SimpleTableMacros {
187187
colsRef0: => Tuple,
188188
labelsRef0: => Tuple
189189
):
190+
private type Impl[T[_]] = SimpleTable.MapOver[C, T]
190191
private lazy val mirrorPair =
191192
val (names0, mirror0) = mirrorPair0
192193
(
@@ -202,9 +203,40 @@ trait SimpleTableMacros {
202203
lazy val labelsRef: IndexedSeq[String] =
203204
SimpleTableMacros.unwrapLabels(labelsRef0, labels)
204205

206+
private def queryables(mappers: DialectTypeMappers, idx: Int): Queryable.Row[?, ?] =
207+
rowsRef(idx)(mappers)
208+
209+
private def walkLabels0(): Seq[String] = labelsRef
210+
211+
private def queryable(
212+
walkLabels0: () => Seq[String],
213+
@nowarn("msg=unused") mappers: DialectTypeMappers,
214+
queryable: Table.Metadata.QueryableProxy
215+
): Queryable[Impl[Expr], Impl[Sc]] = Table.Internal.TableQueryable(
216+
walkLabels0,
217+
walkExprs0 = SimpleTableMacros.walkAllExprs(queryable),
218+
construct0 = args =>
219+
SimpleTableMacros.construct(queryable)(
220+
size = labels.size,
221+
args = args,
222+
factory = SimpleTableMacros.make(mirror, _)
223+
),
224+
deconstruct0 = SimpleTableMacros.deconstruct[Impl[Expr]](queryable)
225+
)
226+
227+
private def vExpr0(
228+
tableRef: TableRef,
229+
mappers: DialectTypeMappers,
230+
@nowarn("msg=unused") queryable: Table.Metadata.QueryableProxy
231+
): Impl[Column] =
232+
val columns = colsRef.map(_(mappers, tableRef))
233+
SimpleTable.Record.fromIArray(columns).asInstanceOf[Impl[Column]]
234+
235+
def metadata: Table.Metadata[Impl] =
236+
Table.Metadata[Impl](queryables, walkLabels0, queryable, vExpr0)
237+
205238
inline given initTableMetadata[C <: Product]
206239
: Table.Metadata[[T[_]] =>> SimpleTable.MapOver[C, T]] =
207-
type Impl[T[_]] = SimpleTable.MapOver[C, T]
208240
type Labels = NamedTuple.Names[NamedTuple.From[C]]
209241
type Values = NamedTuple.DropNames[NamedTuple.From[C]]
210242
type Pairs[F[_, _]] = Tuple.Map[
@@ -221,41 +253,11 @@ trait SimpleTableMacros {
221253
[T] =>> SimpleTableMacros.ContraMapper[SimpleTableMacros.BaseRowExpr[T]]
222254
]
223255

224-
val state = new SimpleTableState[C](
256+
val state = SimpleTableState[C](
225257
mirrorPair0 = SimpleTableMacros.getMirror[C],
226258
rowsRef0 = compiletime.summonAll[Rows],
227259
colsRef0 = compiletime.summonAll[Columns],
228260
labelsRef0 = compiletime.summonAll[FlatLabels]
229261
)
230-
231-
def queryables(mappers: DialectTypeMappers, idx: Int): Queryable.Row[?, ?] =
232-
state.rowsRef(idx)(mappers)
233-
234-
def walkLabels0(): Seq[String] = state.labelsRef
235-
236-
def queryable(
237-
walkLabels0: () => Seq[String],
238-
@nowarn("msg=unused") mappers: DialectTypeMappers,
239-
queryable: Table.Metadata.QueryableProxy
240-
): Queryable[Impl[Expr], Impl[Sc]] = Table.Internal.TableQueryable(
241-
walkLabels0,
242-
walkExprs0 = SimpleTableMacros.walkAllExprs(queryable),
243-
construct0 = args =>
244-
SimpleTableMacros.construct(queryable)(
245-
size = state.labels.size,
246-
args = args,
247-
factory = SimpleTableMacros.make(state.mirror, _)
248-
),
249-
deconstruct0 = values => SimpleTableMacros.deconstruct[Impl[Expr]](queryable)(values)
250-
)
251-
252-
def vExpr0(
253-
tableRef: TableRef,
254-
mappers: DialectTypeMappers,
255-
@nowarn("msg=unused") queryable: Table.Metadata.QueryableProxy
256-
): Impl[Column] =
257-
val columns = state.colsRef.map(_(mappers, tableRef))
258-
SimpleTable.Record.fromIArray(columns).asInstanceOf[Impl[Column]]
259-
260-
Table.Metadata[Impl](queryables, walkLabels0, queryable, vExpr0)
262+
state.metadata
261263
}

0 commit comments

Comments
 (0)