@@ -6,6 +6,8 @@ import scala.tasty.Reflection
6
6
abstract class TreeInterpreter [R <: Reflection & Singleton ](val reflect : R ) {
7
7
import reflect ._
8
8
9
+ final val LOG = false
10
+
9
11
type Env = Map [Symbol , LocalValue ]
10
12
11
13
/** Representation of objects and values in the interpreter */
@@ -73,51 +75,56 @@ abstract class TreeInterpreter[R <: Reflection & Singleton](val reflect: R) {
73
75
def interpretPrivitiveRem (x : AbstractAny , y : AbstractAny ): AbstractAny
74
76
75
77
def eval (tree : Statement )(implicit env : Env ): AbstractAny = {
76
-
77
78
tree match {
78
79
case Call (fn, targs, argss) =>
79
80
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) ))
84
85
case Term .Select (prefix, name @ (" +" | " -" | " *" | " <" | " >" | " <=" | " =>" )) if isNumericPrimitive(prefix.tpe) =>
85
86
val lhs = eval(prefix)
86
87
val rhs = eval(argss.head.head)
87
88
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) )
95
96
}
96
97
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) )
101
102
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) )
106
107
}
107
108
108
109
case Term .Assign (lhs, rhs) =>
109
- env(lhs.symbol).update(eval(rhs))
110
+ log( " <interpretAssing> " , tree)( env(lhs.symbol).update(eval(rhs) ))
110
111
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) )
116
117
117
118
case _ => throw new MatchError (tree.show)
118
119
}
119
120
}
120
121
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
+
121
128
trait LocalValue {
122
129
def get : AbstractAny
123
130
def update (rhs : AbstractAny ): AbstractAny = throw new UnsupportedOperationException
0 commit comments