@@ -40,12 +40,9 @@ class StaticOptimizer(
4040
4141 case BinaryOp (pos, lhs, BinaryOp .OP_in , ValidSuper (_, selfIdx)) =>
4242 InSuper (pos, lhs, selfIdx)
43- case BinaryOp (pos, Val .Str (_, key), BinaryOp .OP_in , obj : Val .Obj ) if obj.staticSafe =>
44- Val .bool(pos, obj.containsKey(key))
4543 case b2 @ BinaryOp (pos, lhs : Val .Str , BinaryOp .OP_% , rhs) =>
4644 try ApplyBuiltin1 (pos, new Format .PartialApplyFmt (lhs.value), rhs, tailstrict = false )
4745 catch { case _ : Exception => b2 }
48- // optimize booleans
4946 case Or (_, Val .False (_), rhs) => transform(rhs)
5047 case Or (pos, Val .True (_), _) => Val .True (pos)
5148 case Or (pos, _, Val .True (_)) => Val .True (pos)
@@ -55,61 +52,6 @@ class StaticOptimizer(
5552 case UnaryOp (pos, UnaryOp .OP_! , Val .True (_)) => Val .False (pos)
5653 case UnaryOp (pos, UnaryOp .OP_! , Val .False (_)) => Val .True (pos)
5754 case UnaryOp (_, UnaryOp .OP_! , UnaryOp (_, UnaryOp .OP_! , expr)) => expr
58- // optimize for numbers
59- case BinaryOp (pos, Val .Num (_, l), BinaryOp .OP_+ , Val .Num (_, r)) => Val .Num (pos, l + r)
60- case BinaryOp (pos, Val .Num (_, l), BinaryOp .OP_- , Val .Num (_, r)) => Val .Num (pos, l - r)
61- case BinaryOp (pos, Val .Num (_, l), BinaryOp .OP_* , Val .Num (_, r)) => Val .Num (pos, l * r)
62- case BinaryOp (pos, Val .Num (_, l), BinaryOp .OP_/ , Val .Num (_, r)) if r != 0 => Val .Num (pos, l / r)
63- case BinaryOp (pos, Val .Num (_, l), BinaryOp .OP_% , Val .Num (_, r)) if r != 0 => Val .Num (pos, l % r)
64- case UnaryOp (pos, UnaryOp .OP_+ , Val .Num (_, v)) => Val .Num (pos, v)
65- case UnaryOp (pos, UnaryOp .OP_- , Val .Num (_, v)) => Val .Num (pos, - v)
66- case UnaryOp (pos, UnaryOp .OP_~ , Val .Num (_, v)) => Val .Num (pos, ~ v.toLong)
67- // optimize for bitwise
68- case BinaryOp (pos, Val .Num (_, l), BinaryOp .OP_& , Val .Num (_, r)) =>
69- Val .Num (pos, l.toLong & r.toLong)
70- case BinaryOp (pos, Val .Num (_, l), BinaryOp .OP_^ , Val .Num (_, r)) =>
71- Val .Num (pos, l.toLong ^ r.toLong)
72- case BinaryOp (pos, Val .Num (_, l), BinaryOp .OP_| , Val .Num (_, r)) =>
73- Val .Num (pos, l.toLong | r.toLong)
74- case BinaryOp (pos, Val .Num (_, l), BinaryOp .OP_<< , Val .Num (_, r)) if r.isValidInt =>
75- Val .Num (pos, l.toLong << r.toInt)
76- case BinaryOp (pos, Val .Num (_, l), BinaryOp .OP_>> , Val .Num (_, r)) if r.isValidInt =>
77- Val .Num (pos, l.toLong >> r.toInt)
78- // optimize for strings
79- case BinaryOp (pos, Val .Str (_, l), BinaryOp .OP_+ , Val .Str (_, r)) => Val .Str (pos, l + r)
80- // optimize for comparing
81- case BinaryOp (pos, Val .Num (_, l), BinaryOp .OP_== , Val .Num (_, r)) => Val .bool(pos, l == r)
82- case BinaryOp (pos, Val .Str (_, l), BinaryOp .OP_== , Val .Str (_, r)) => Val .bool(pos, l == r)
83- case BinaryOp (pos, Val .Num (_, l), BinaryOp .OP_!= , Val .Num (_, r)) => Val .bool(pos, l != r)
84- case BinaryOp (pos, Val .Str (_, l), BinaryOp .OP_!= , Val .Str (_, r)) => Val .bool(pos, l != r)
85- case BinaryOp (pos, Val .Num (_, l), BinaryOp .OP_< , Val .Num (_, r)) => Val .bool(pos, l < r)
86- case BinaryOp (pos, Val .Str (_, l), BinaryOp .OP_< , Val .Str (_, r)) => Val .bool(pos, l < r)
87- case BinaryOp (pos, Val .Num (_, l), BinaryOp .OP_> , Val .Num (_, r)) => Val .bool(pos, l > r)
88- case BinaryOp (pos, Val .Str (_, l), BinaryOp .OP_> , Val .Str (_, r)) => Val .bool(pos, l > r)
89- case BinaryOp (pos, Val .Num (_, l), BinaryOp .OP_<= , Val .Num (_, r)) => Val .bool(pos, l <= r)
90- case BinaryOp (pos, Val .Str (_, l), BinaryOp .OP_<= , Val .Str (_, r)) => Val .bool(pos, l <= r)
91- case BinaryOp (pos, Val .Num (_, l), BinaryOp .OP_>= , Val .Num (_, r)) => Val .bool(pos, l >= r)
92- case BinaryOp (pos, Val .Str (_, l), BinaryOp .OP_>= , Val .Str (_, r)) => Val .bool(pos, l >= r)
93- // optimize for if else
94- case IfElse (_, Val .True (_), thenExpr, _) => transform(thenExpr)
95- case IfElse (pos, Val .False (_), _, elseExpr) => `elseExpr` match {
96- case null => Val .Null (pos)
97- case _ => transform(elseExpr)
98- }
99- // optimize for obj
100- case b3@ BinaryOp (_, lhs : Val .Obj , BinaryOp .OP_+ , rhs : Val .Obj ) if lhs.staticSafe && rhs.staticSafe =>
101- if (lhs.allKeyNames.isEmpty) {
102- rhs
103- } else if (rhs.allKeyNames.isEmpty) {
104- lhs
105- } else b3
106- // optimize for arr
107- case b4@ BinaryOp (pos, lhs : Val .Arr , BinaryOp .OP_+ , rhs : Val .Arr ) =>
108- if (lhs.length == 0 ) {
109- new Val .Arr (pos, rhs.asLazyArray)
110- } else if (rhs.length == 0 ) {
111- new Val .Arr (pos, lhs.asLazyArray)
112- } else b4
11355
11456 case e @ Id (pos, name) =>
11557 scope.get(name) match {
0 commit comments