Skip to content

Commit e4d8092

Browse files
nicolasstuckibiboudis
authored andcommitted
Create interpretValGet
1 parent fbc2ca2 commit e4d8092

File tree

2 files changed

+40
-35
lines changed

2 files changed

+40
-35
lines changed

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

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -30,18 +30,17 @@ abstract class TreeInterpreter[R <: Reflection & Singleton](val reflect: R) {
3030
implicitly[Env] // FIXME add pre to the env as `this`
3131
case _ => implicitly[Env]
3232
}
33-
fn.symbol match {
34-
case IsDefSymbol(sym) =>
35-
val evaluatedArgs = argss.flatten.map(arg => LocalValue.valFrom(eval(arg)))
36-
val syms = sym.tree.paramss.headOption.getOrElse(Nil).map(_.symbol)
37-
withLocalValues(syms, evaluatedArgs) {
38-
eval(sym.tree.rhs.get)
39-
}
40-
case _ =>
41-
localValue(fn.symbol)(env0).get
33+
val evaluatedArgs = argss.flatten.map(arg => LocalValue.valFrom(eval(arg)))
34+
val IsDefSymbol(sym) = fn.symbol
35+
val syms = sym.tree.paramss.headOption.getOrElse(Nil).map(_.symbol)
36+
withLocalValues(syms, evaluatedArgs) {
37+
eval(sym.tree.rhs.get)
4238
}
4339
}
4440

41+
def interpretValGet(fn: Term): Result =
42+
localValue(fn.symbol).get
43+
4544
def interpretNew(fn: Tree, argss: List[List[Term]]): Result
4645

4746
def interpretIf(cond: Term, thenp: Term, elsep: Term): Result =
@@ -121,7 +120,14 @@ abstract class TreeInterpreter[R <: Reflection & Singleton](val reflect: R) {
121120
def lhs = eval(prefix)
122121
def rhs = eval(argss.head.head)
123122
log("interpretPrivitiveDiv", tree)(interpretPrivitiveDiv(lhs, rhs))
124-
case _ => log("interpretCall", tree)(interpretCall(fn, argss))
123+
case _ =>
124+
fn.symbol match {
125+
case IsDefSymbol(sym) => log("interpretCall", tree)(interpretCall(fn, argss))
126+
case _ =>
127+
assert(argss.isEmpty)
128+
log("interpretValGet", tree)(interpretValGet(fn))
129+
130+
}
125131
}
126132

127133
case Term.Assign(lhs, rhs) =>

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

Lines changed: 24 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ class Interpreter[R <: Reflection & Singleton](reflect0: R) extends TreeInterpre
3131
val symbol = sym.methods.find(_.name == method.getName).get
3232

3333
if (symbol.isDefinedInCurrentRun) {
34+
// TODO use `super.interpretCall(...)`
3435
symbol match {
3536
case IsDefSymbol(symbol) =>
3637
val args1 = if (args == null) Nil else args.toList
@@ -57,36 +58,34 @@ class Interpreter[R <: Reflection & Singleton](reflect0: R) extends TreeInterpre
5758

5859
override def interpretCall(fn: Term, argss: List[List[Term]]): Result = {
5960
if (fn.symbol.isDefinedInCurrentRun) super.interpretCall(fn, argss)
61+
else {
62+
fn match {
63+
case Term.Select(prefix, _) =>
64+
val IsDefSymbol(sym) = fn.symbol
65+
val pre = eval(prefix).asInstanceOf[Object]
66+
val argss2 = evaluatedArgss(argss)
67+
jvmReflection.interpretMethodCall(pre, fn.symbol, argss2)
68+
case _ =>
69+
val IsDefSymbol(sym) = fn.symbol
70+
val argss2 = evaluatedArgss(argss)
71+
jvmReflection.interpretStaticMethodCall(fn.symbol.owner, fn.symbol, argss2)
72+
}
73+
}
74+
}
75+
76+
override def interpretValGet(fn: Term): Result = {
77+
if (fn.symbol.isDefinedInCurrentRun) super.interpretValGet(fn)
6078
else {
6179
import Term._
6280
fn match {
6381
case Select(prefix, _) =>
64-
fn.symbol match {
65-
case IsDefSymbol(sym) =>
66-
val pre = eval(prefix).asInstanceOf[Object]
67-
val argss2 = evaluatedArgss(argss)
68-
jvmReflection.interpretMethodCall(pre, fn.symbol, argss2)
69-
case _ =>
70-
// TODO not necesarly static?
71-
jvmReflection.interpretStaticVal(fn.symbol.owner, fn.symbol)
72-
}
82+
// FIXME not necesarly static
83+
jvmReflection.interpretStaticVal(fn.symbol.owner, fn.symbol)
7384
case _ =>
74-
// println(fn.show)
75-
fn.symbol match {
76-
// TODO: obviously
77-
case IsDefSymbol(sym) =>
78-
val argss2 = evaluatedArgss(argss)
79-
// argss2.foreach(println)
80-
jvmReflection.interpretStaticMethodCall(fn.symbol.owner, fn.symbol, argss2)
81-
case _ =>
82-
if (fn.symbol.flags.isObject) {
83-
jvmReflection.loadModule(fn.symbol.asVal.moduleClass.get)
84-
}
85-
// call to a static val
86-
else {
87-
jvmReflection.interpretStaticVal(fn.symbol.owner, fn.symbol)
88-
}
89-
}
85+
if (fn.symbol.flags.isObject)
86+
jvmReflection.loadModule(fn.symbol.asVal.moduleClass.get)
87+
else
88+
jvmReflection.interpretStaticVal(fn.symbol.owner, fn.symbol)
9089
}
9190
}
9291
}

0 commit comments

Comments
 (0)