Skip to content

Commit 467d9af

Browse files
nicolasstuckibiboudis
authored andcommitted
Add eval log
1 parent 74ffc6e commit 467d9af

File tree

2 files changed

+37
-28
lines changed

2 files changed

+37
-28
lines changed

tests/run-with-compiler-custom-args/tasty-interpreter/Test.scala

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,10 @@ import scala.tasty.Reflection
1010
object Test {
1111
def main(args: Array[String]): Unit = {
1212
val ps = new ByteArrayOutputStream()
13-
scala.Console.withOut(ps) {
14-
ConsumeTasty("", List("IntepretedMain", "InterpretedBar"), new TastyInterpreter)
13+
try scala.Console.withOut(ps) {
14+
ConsumeTasty("", List("IntepretedMain", "InterpretedBar"), new TastyInterpreter)
15+
} catch {
16+
case e: Throwable => throw new Exception(ps.toString, e)
1517
}
1618
val expectedOutput =
1719
"""42

tests/run-with-compiler-custom-args/tasty-interpreter/interpreter/TreeInterpreter.scala

Lines changed: 33 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ import scala.tasty.Reflection
66
abstract class TreeInterpreter[R <: Reflection & Singleton](val reflect: R) {
77
import reflect._
88

9+
final val LOG = false
10+
911
type Env = Map[Symbol, LocalValue]
1012

1113
/** Representation of objects and values in the interpreter */
@@ -73,51 +75,56 @@ abstract class TreeInterpreter[R <: Reflection & Singleton](val reflect: R) {
7375
def interpretPrivitiveRem(x: AbstractAny, y: AbstractAny): AbstractAny
7476

7577
def eval(tree: Statement)(implicit env: Env): AbstractAny = {
76-
7778
tree match {
7879
case Call(fn, targs, argss) =>
7980
fn match {
80-
case Term.Select(_, "<init>") => interpretNew(fn, argss)
81-
case Term.Select(prefix, "isInstanceOf") => interpretIsInstanceOf(eval(prefix), targs.head)
82-
case Term.Select(prefix, "asInstanceOf") => interpretAsInstanceOf(eval(prefix), targs.head)
83-
case Term.Select(prefix, "==") => interpretEqEq(eval(prefix), eval(argss.head.head))
81+
case Term.Select(_, "<init>") => log("interpretNew", tree)(interpretNew(fn, argss))
82+
case Term.Select(prefix, "isInstanceOf") => log("interpretIsInstanceOf", tree)(interpretIsInstanceOf(eval(prefix), targs.head))
83+
case Term.Select(prefix, "asInstanceOf") => log("interpretAsInstanceOf", tree)(interpretAsInstanceOf(eval(prefix), targs.head))
84+
case Term.Select(prefix, "==") => log("interpretEqEq", tree)(interpretEqEq(eval(prefix), eval(argss.head.head)))
8485
case Term.Select(prefix, name @ ("+" | "-" | "*" | "<" | ">" | "<=" | "=>")) if isNumericPrimitive(prefix.tpe) =>
8586
val lhs = eval(prefix)
8687
val rhs = eval(argss.head.head)
8788
name match {
88-
case "+" => interpretPrivitivePlus(lhs, rhs)
89-
case "-" => interpretPrivitiveMinus(lhs, rhs)
90-
case "*" => interpretPrivitiveTimes(lhs, rhs)
91-
case "<" => interpretPrivitiveLt(lhs, rhs)
92-
case ">" => interpretPrivitiveGt(lhs, rhs)
93-
case "<=" => interpretPrivitiveLtEq(lhs, rhs)
94-
case ">=" => interpretPrivitiveGtEq(lhs, rhs)
89+
case "+" => log("interpretPrivitivePlus", tree)(interpretPrivitivePlus(lhs, rhs))
90+
case "-" => log("interpretPrivitiveMinus", tree)(interpretPrivitiveMinus(lhs, rhs))
91+
case "*" => log("interpretPrivitiveTimes", tree)(interpretPrivitiveTimes(lhs, rhs))
92+
case "<" => log("interpretPrivitiveLt", tree)(interpretPrivitiveLt(lhs, rhs))
93+
case ">" => log("interpretPrivitiveGt", tree)(interpretPrivitiveGt(lhs, rhs))
94+
case "<=" => log("interpretPrivitiveLtEq", tree)(interpretPrivitiveLtEq(lhs, rhs))
95+
case ">=" => log("interpretPrivitiveGtEq", tree)(interpretPrivitiveGtEq(lhs, rhs))
9596
}
9697
case Term.Select(prefix, name @ ("/" | "%")) if isIntegralPrimitive(prefix.tpe) =>
97-
val lhs = eval(prefix)
98-
val rhs = eval(argss.head.head)
99-
if (name == "/") interpretPrivitiveQuot(lhs, rhs)
100-
else interpretPrivitiveRem(lhs, rhs)
98+
def lhs = eval(prefix)
99+
def rhs = eval(argss.head.head)
100+
if (name == "/") log("interpretPrivitiveQuot", tree)(interpretPrivitiveQuot(lhs, rhs))
101+
else log("interpretPrivitiveRem", tree)(interpretPrivitiveRem(lhs, rhs))
101102
case Term.Select(prefix, name @ "/") if isFractionalPrimitive(prefix.tpe) =>
102-
val lhs = eval(prefix)
103-
val rhs = eval(argss.head.head)
104-
interpretPrivitiveDiv(lhs, rhs)
105-
case _ => interpretCall(fn, argss)
103+
def lhs = eval(prefix)
104+
def rhs = eval(argss.head.head)
105+
log("interpretPrivitiveDiv", tree)(interpretPrivitiveDiv(lhs, rhs))
106+
case _ => log("interpretCall", tree)(interpretCall(fn, argss))
106107
}
107108

108109
case Term.Assign(lhs, rhs) =>
109-
env(lhs.symbol).update(eval(rhs))
110+
log("<interpretAssing>", tree)(env(lhs.symbol).update(eval(rhs)))
110111

111-
case Term.If(cond, thenp, elsep) => interpretIf(cond, thenp, elsep)
112-
case Term.While(cond, body) => interpretWhile(cond, body)
113-
case Term.Block(stats, expr) => interpretBlock(stats, expr)
114-
case Term.Literal(const) => interpretLiteral(const)
115-
case Term.Typed(expr, _) => eval(expr)
112+
case Term.If(cond, thenp, elsep) => log("interpretIf", tree)(interpretIf(cond, thenp, elsep))
113+
case Term.While(cond, body) => log("interpretWhile", tree)(interpretWhile(cond, body))
114+
case Term.Block(stats, expr) => log("interpretBlock", tree)(interpretBlock(stats, expr))
115+
case Term.Literal(const) => log("interpretLiteral", tree)(interpretLiteral(const))
116+
case Term.Typed(expr, _) => log("<interpretTyped>", tree)(eval(expr))
116117

117118
case _ => throw new MatchError(tree.show)
118119
}
119120
}
120121

122+
inline def log[T](tag: => String, tree: => Statement)(thunk: => T): T = {
123+
if (LOG)
124+
println(s"#> $tag: ${tree.show}")
125+
thunk
126+
}
127+
121128
trait LocalValue {
122129
def get: AbstractAny
123130
def update(rhs: AbstractAny): AbstractAny = throw new UnsupportedOperationException

0 commit comments

Comments
 (0)