Skip to content

Commit f339b1a

Browse files
committed
chore: Make aggressive optimization default
1 parent 725f287 commit f339b1a

9 files changed

Lines changed: 374 additions & 1088 deletions

File tree

sjsonnet/src/sjsonnet/Expr.scala

Lines changed: 49 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import scala.collection.immutable.IntMap
1212
* into the file that is later used to provide error messages.
1313
*/
1414
trait Expr {
15-
def pos: Position
15+
var pos: Position
1616
private[sjsonnet] def tag: Byte = ExprTags.UNTAGGED
1717

1818
/** The name of this expression type to be shown in error messages */
@@ -60,26 +60,26 @@ object Expr {
6060
if (a == null) "null" else a.mkString("[", ", ", "]")
6161
}
6262

63-
final case class Self(pos: Position) extends Expr {
63+
final case class Self(var pos: Position) extends Expr {
6464
final override private[sjsonnet] def tag = ExprTags.Self
6565
}
66-
final case class Super(pos: Position) extends Expr {
66+
final case class Super(var pos: Position) extends Expr {
6767
final override private[sjsonnet] def tag = ExprTags.Super
6868
}
69-
final case class $(pos: Position) extends Expr {
69+
final case class $(var pos: Position) extends Expr {
7070
final override private[sjsonnet] def tag = ExprTags.`$`
7171
}
7272

73-
final case class Id(pos: Position, name: String) extends Expr {
73+
final case class Id(var pos: Position, name: String) extends Expr {
7474
final override private[sjsonnet] def tag = ExprTags.Id
7575
override def exprErrorString: String = s"${super.exprErrorString} $name"
7676
}
7777

78-
final case class ValidId(pos: Position, name: String, nameIdx: Int) extends Expr {
78+
final case class ValidId(var pos: Position, name: String, nameIdx: Int) extends Expr {
7979
final override private[sjsonnet] def tag = ExprTags.ValidId
8080
override def exprErrorString: String = s"${super.exprErrorString} $name"
8181
}
82-
final case class Arr(pos: Position, value: Array[Expr]) extends Expr {
82+
final case class Arr(var pos: Position, value: Array[Expr]) extends Expr {
8383
final override private[sjsonnet] def tag = ExprTags.Arr
8484
override def toString: String = s"Arr($pos, ${arrStr(value)})"
8585
}
@@ -101,7 +101,7 @@ object Expr {
101101
case object Unhide extends Visibility
102102
}
103103
final case class Field(
104-
pos: Position,
104+
var pos: Position,
105105
fieldName: FieldName,
106106
plus: Boolean, // see https://jsonnet.org/ref/language.html#nested-field-inheritance
107107
args: Params,
@@ -120,7 +120,7 @@ object Expr {
120120
override def toString: String = s"Params(${arrStr(names)}, ${arrStr(defaultExprs)})"
121121
}
122122

123-
final case class UnaryOp(pos: Position, op: Int, value: Expr) extends Expr {
123+
final case class UnaryOp(var pos: Position, op: Int, value: Expr) extends Expr {
124124
final override private[sjsonnet] def tag = ExprTags.UnaryOp
125125
override def exprErrorString: String = s"${super.exprErrorString} ${UnaryOp.name(op)}"
126126
}
@@ -132,13 +132,13 @@ object Expr {
132132
private val names = IntMap(OP_! -> "!", OP_- -> "-", OP_~ -> "~", OP_+ -> "+")
133133
def name(op: Int): String = names.getOrElse(op, "<unknown>")
134134
}
135-
final case class And(pos: Position, lhs: Expr, rhs: Expr) extends Expr {
135+
final case class And(var pos: Position, lhs: Expr, rhs: Expr) extends Expr {
136136
final override private[sjsonnet] def tag = ExprTags.And
137137
}
138-
final case class Or(pos: Position, lhs: Expr, rhs: Expr) extends Expr {
138+
final case class Or(var pos: Position, lhs: Expr, rhs: Expr) extends Expr {
139139
final override private[sjsonnet] def tag = ExprTags.Or
140140
}
141-
final case class BinaryOp(pos: Position, lhs: Expr, op: Int, rhs: Expr) extends Expr {
141+
final case class BinaryOp(var pos: Position, lhs: Expr, op: Int, rhs: Expr) extends Expr {
142142
final override private[sjsonnet] def tag = ExprTags.BinaryOp
143143
override def exprErrorString: String = s"${super.exprErrorString} ${BinaryOp.name(op)}"
144144
}
@@ -185,11 +185,12 @@ object Expr {
185185
)
186186
def name(op: Int): String = names.getOrElse(op, "<unknown>")
187187
}
188-
final case class AssertExpr(pos: Position, asserted: Member.AssertStmt, returned: Expr)
188+
final case class AssertExpr(var pos: Position, asserted: Member.AssertStmt, returned: Expr)
189189
extends Expr {
190190
final override private[sjsonnet] def tag = ExprTags.AssertExpr
191191
}
192-
final case class LocalExpr(pos: Position, bindings: Array[Bind], returned: Expr) extends Expr {
192+
final case class LocalExpr(var pos: Position, bindings: Array[Bind], returned: Expr)
193+
extends Expr {
193194
final override private[sjsonnet] def tag = ExprTags.LocalExpr
194195
override def toString: String = s"LocalExpr($pos, ${arrStr(bindings)}, $returned)"
195196
override def equals(o: Any): Boolean = o match {
@@ -202,21 +203,21 @@ object Expr {
202203
}
203204
}
204205

205-
final case class Bind(pos: Position, name: String, args: Params, rhs: Expr) extends Member
206-
final case class Import(pos: Position, value: String) extends Expr {
206+
final case class Bind(var pos: Position, name: String, args: Params, rhs: Expr) extends Member
207+
final case class Import(var pos: Position, value: String) extends Expr {
207208
final override private[sjsonnet] def tag = ExprTags.Import
208209
}
209-
final case class ImportStr(pos: Position, value: String) extends Expr {
210+
final case class ImportStr(var pos: Position, value: String) extends Expr {
210211
final override private[sjsonnet] def tag = ExprTags.ImportStr
211212
}
212-
final case class ImportBin(pos: Position, value: String) extends Expr {
213+
final case class ImportBin(var pos: Position, value: String) extends Expr {
213214
final override private[sjsonnet] def tag = ExprTags.ImportBin
214215
}
215-
final case class Error(pos: Position, value: Expr) extends Expr {
216+
final case class Error(var pos: Position, value: Expr) extends Expr {
216217
final override private[sjsonnet] def tag = ExprTags.Error
217218
}
218219
final case class Apply(
219-
pos: Position,
220+
var pos: Position,
220221
value: Expr,
221222
args: Array[Expr],
222223
namedNames: Array[String],
@@ -225,23 +226,23 @@ object Expr {
225226
final override private[sjsonnet] def tag = ExprTags.Apply
226227
override def exprErrorString: String = Expr.callTargetName(value)
227228
}
228-
final case class Apply0(pos: Position, value: Expr, tailstrict: Boolean)
229+
final case class Apply0(var pos: Position, value: Expr, tailstrict: Boolean)
229230
extends TailstrictableExpr {
230231
final override private[sjsonnet] def tag = ExprTags.Apply0
231232
override def exprErrorString: String = Expr.callTargetName(value)
232233
}
233-
final case class Apply1(pos: Position, value: Expr, a1: Expr, tailstrict: Boolean)
234+
final case class Apply1(var pos: Position, value: Expr, a1: Expr, tailstrict: Boolean)
234235
extends TailstrictableExpr {
235236
final override private[sjsonnet] def tag = ExprTags.Apply1
236237
override def exprErrorString: String = Expr.callTargetName(value)
237238
}
238-
final case class Apply2(pos: Position, value: Expr, a1: Expr, a2: Expr, tailstrict: Boolean)
239+
final case class Apply2(var pos: Position, value: Expr, a1: Expr, a2: Expr, tailstrict: Boolean)
239240
extends TailstrictableExpr {
240241
final override private[sjsonnet] def tag = ExprTags.Apply2
241242
override def exprErrorString: String = Expr.callTargetName(value)
242243
}
243244
final case class Apply3(
244-
pos: Position,
245+
var pos: Position,
245246
value: Expr,
246247
a1: Expr,
247248
a2: Expr,
@@ -252,26 +253,30 @@ object Expr {
252253
override def exprErrorString: String = Expr.callTargetName(value)
253254
}
254255
final case class ApplyBuiltin(
255-
pos: Position,
256+
var pos: Position,
256257
func: Val.Builtin,
257258
argExprs: Array[Expr],
258259
tailstrict: Boolean)
259260
extends TailstrictableExpr {
260261
final override private[sjsonnet] def tag = ExprTags.ApplyBuiltin
261262
override def exprErrorString: String = func.qualifiedName
262263
}
263-
final case class ApplyBuiltin0(pos: Position, func: Val.Builtin0, tailstrict: Boolean)
264+
final case class ApplyBuiltin0(var pos: Position, func: Val.Builtin0, tailstrict: Boolean)
264265
extends TailstrictableExpr {
265266
final override private[sjsonnet] def tag = ExprTags.ApplyBuiltin0
266267
override def exprErrorString: String = func.qualifiedName
267268
}
268-
final case class ApplyBuiltin1(pos: Position, func: Val.Builtin1, a1: Expr, tailstrict: Boolean)
269+
final case class ApplyBuiltin1(
270+
var pos: Position,
271+
func: Val.Builtin1,
272+
a1: Expr,
273+
tailstrict: Boolean)
269274
extends TailstrictableExpr {
270275
final override private[sjsonnet] def tag = ExprTags.ApplyBuiltin1
271276
override def exprErrorString: String = func.qualifiedName
272277
}
273278
final case class ApplyBuiltin2(
274-
pos: Position,
279+
var pos: Position,
275280
func: Val.Builtin2,
276281
a1: Expr,
277282
a2: Expr,
@@ -281,7 +286,7 @@ object Expr {
281286
override def exprErrorString: String = func.qualifiedName
282287
}
283288
final case class ApplyBuiltin3(
284-
pos: Position,
289+
var pos: Position,
285290
func: Val.Builtin3,
286291
a1: Expr,
287292
a2: Expr,
@@ -292,7 +297,7 @@ object Expr {
292297
override def exprErrorString: String = func.qualifiedName
293298
}
294299
final case class ApplyBuiltin4(
295-
pos: Position,
300+
var pos: Position,
296301
func: Val.Builtin4,
297302
a1: Expr,
298303
a2: Expr,
@@ -303,56 +308,56 @@ object Expr {
303308
override private[sjsonnet] def tag = ExprTags.ApplyBuiltin4
304309
override def exprErrorString: String = func.qualifiedName
305310
}
306-
final case class Select(pos: Position, value: Expr, name: String) extends Expr {
311+
final case class Select(var pos: Position, value: Expr, name: String) extends Expr {
307312
final override private[sjsonnet] def tag = ExprTags.Select
308313
override def exprErrorString: String = s"${super.exprErrorString} $name"
309314
}
310-
final case class SelectSuper(pos: Position, selfIdx: Int, name: String) extends Expr {
315+
final case class SelectSuper(var pos: Position, selfIdx: Int, name: String) extends Expr {
311316
final override private[sjsonnet] def tag = ExprTags.SelectSuper
312317
override def exprErrorString: String = s"${super.exprErrorString} $name"
313318
}
314-
final case class InSuper(pos: Position, value: Expr, selfIdx: Int) extends Expr {
319+
final case class InSuper(var pos: Position, value: Expr, selfIdx: Int) extends Expr {
315320
final override private[sjsonnet] def tag = ExprTags.InSuper
316321
}
317-
final case class Lookup(pos: Position, value: Expr, index: Expr) extends Expr {
322+
final case class Lookup(var pos: Position, value: Expr, index: Expr) extends Expr {
318323
final override private[sjsonnet] def tag = ExprTags.Lookup
319324
}
320-
final case class LookupSuper(pos: Position, selfIdx: Int, index: Expr) extends Expr {
325+
final case class LookupSuper(var pos: Position, selfIdx: Int, index: Expr) extends Expr {
321326
final override private[sjsonnet] def tag = ExprTags.LookupSuper
322327
}
323328
final case class Slice(
324-
pos: Position,
329+
var pos: Position,
325330
value: Expr,
326331
start: Option[Expr],
327332
end: Option[Expr],
328333
stride: Option[Expr])
329334
extends Expr {
330335
final override private[sjsonnet] def tag = ExprTags.Slice
331336
}
332-
final case class Function(pos: Position, params: Params, body: Expr) extends Expr {
337+
final case class Function(var pos: Position, params: Params, body: Expr) extends Expr {
333338
final override private[sjsonnet] def tag = ExprTags.Function
334339
}
335-
final case class IfElse(pos: Position, cond: Expr, `then`: Expr, `else`: Expr) extends Expr {
340+
final case class IfElse(var pos: Position, cond: Expr, `then`: Expr, `else`: Expr) extends Expr {
336341
final override private[sjsonnet] def tag = ExprTags.IfElse
337342
}
338343

339344
sealed trait CompSpec extends Expr
340-
final case class IfSpec(pos: Position, cond: Expr) extends CompSpec
341-
final case class ForSpec(pos: Position, name: String, cond: Expr) extends CompSpec
345+
final case class IfSpec(var pos: Position, cond: Expr) extends CompSpec
346+
final case class ForSpec(var pos: Position, name: String, cond: Expr) extends CompSpec
342347

343-
final case class Comp(pos: Position, value: Expr, first: ForSpec, rest: Array[CompSpec])
348+
final case class Comp(var pos: Position, value: Expr, first: ForSpec, rest: Array[CompSpec])
344349
extends Expr {
345350
final override private[sjsonnet] def tag = ExprTags.Comp
346351
override def exprErrorString: String = "array comprehension"
347352
}
348-
final case class ObjExtend(pos: Position, base: Expr, ext: ObjBody) extends Expr {
353+
final case class ObjExtend(var pos: Position, base: Expr, ext: ObjBody) extends Expr {
349354
final override private[sjsonnet] def tag = ExprTags.ObjExtend
350355
}
351356

352357
trait ObjBody extends Expr
353358
object ObjBody {
354359
final case class MemberList(
355-
pos: Position,
360+
var pos: Position,
356361
binds: Array[Bind],
357362
fields: Array[Member.Field],
358363
asserts: Array[Member.AssertStmt])
@@ -362,7 +367,7 @@ object Expr {
362367
s"MemberList($pos, ${arrStr(binds)}, ${arrStr(fields)}, ${arrStr(asserts)})"
363368
}
364369
final case class ObjComp(
365-
pos: Position,
370+
var pos: Position,
366371
preLocals: Array[Bind],
367372
key: Expr,
368373
value: Expr,

sjsonnet/src/sjsonnet/ScopedExprTransform.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ class ScopedExprTransform extends ExprTransform {
1313

1414
// Marker for Exprs in the scope that should not be used because they need to be evaluated in a different scope
1515
val dynamicExpr: Expr = new Expr {
16-
def pos: Position = ???; override def toString = "dynamicExpr"
16+
var pos: Position = null; override def toString = "dynamicExpr"
1717
}
1818

1919
def transform(e: Expr): Expr = e match {

sjsonnet/src/sjsonnet/Settings.scala

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,7 @@ final case class Settings(
1313
brokenAssertionLogic: Boolean = false,
1414
maxMaterializeDepth: Int = 1000,
1515
materializeRecursiveDepthLimit: Int = 128,
16-
maxStack: Int = 500,
17-
/**
18-
* Enable aggressive static optimizations in the optimization phase, including: constant folding
19-
* for arithmetic, comparison, bitwise, and shift operators; branch elimination for if-else with
20-
* constant conditions; short-circuit elimination for And/Or with constant lhs. These reduce AST
21-
* node count, benefiting long-running Jsonnet programs.
22-
*/
23-
aggressiveStaticOptimization: Boolean = false
16+
maxStack: Int = 500
2417
)
2518

2619
object Settings {

0 commit comments

Comments
 (0)