Skip to content

Commit b7b101c

Browse files
nicolasstuckibiboudis
authored andcommitted
Use implicit function types
1 parent 3f57db5 commit b7b101c

File tree

2 files changed

+21
-19
lines changed

2 files changed

+21
-19
lines changed

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

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,14 @@ abstract class TreeInterpreter[R <: Reflection & Singleton](val reflect: R) {
1313
/** Representation of objects and values in the interpreter */
1414
type AbstractAny
1515

16-
def interpretCall(fn: Term, argss: List[List[Term]])(implicit env: Env): AbstractAny = {
16+
type Result = implicit Env => AbstractAny
17+
18+
def interpretCall(fn: Term, argss: List[List[Term]]): Result = {
1719
val env0 = fn match {
1820
case Term.Select(prefix, _) =>
1921
val pre = eval(prefix)
20-
env // FIXME add pre to the env as `this`
21-
case _ => env
22+
implicitly[Env] // FIXME add pre to the env as `this`
23+
case _ => implicitly[Env]
2224
}
2325
fn.symbol match {
2426
case IsDefSymbol(sym) =>
@@ -30,19 +32,19 @@ abstract class TreeInterpreter[R <: Reflection & Singleton](val reflect: R) {
3032
}
3133
}
3234

33-
def interpretNew(fn: Tree, argss: List[List[Term]])(implicit env: Env): AbstractAny
35+
def interpretNew(fn: Tree, argss: List[List[Term]]): Result
3436

35-
def interpretIf(cond: Term, thenp: Term, elsep: Term)(implicit env: Env): AbstractAny =
37+
def interpretIf(cond: Term, thenp: Term, elsep: Term): Result =
3638
if (eval(cond).asInstanceOf[Boolean]) eval(thenp)
3739
else eval(elsep)
3840

39-
def interpretWhile(cond: Term, body: Term)(implicit env: Env): AbstractAny = {
41+
def interpretWhile(cond: Term, body: Term): Result = {
4042
while (eval(cond).asInstanceOf[Boolean]) eval(body)
4143
interpretUnit()
4244
}
4345

44-
def interpretBlock(stats: List[Statement], expr: Term)(implicit env: Env): AbstractAny = {
45-
val newEnv = stats.foldLeft(env)((accEnv, stat) => stat match {
46+
def interpretBlock(stats: List[Statement], expr: Term): Result = {
47+
val newEnv = stats.foldLeft(implicitly[Env])((accEnv, stat) => stat match {
4648
case ValDef(name, tpt, Some(rhs)) =>
4749
def evalRhs = eval(rhs)(accEnv)
4850
val evalRef: LocalValue =
@@ -62,10 +64,10 @@ abstract class TreeInterpreter[R <: Reflection & Singleton](val reflect: R) {
6264
}
6365

6466
def interpretUnit(): AbstractAny
65-
def interpretLiteral(const: Constant)(implicit env: Env): AbstractAny
67+
def interpretLiteral(const: Constant): Result
6668

67-
def interpretIsInstanceOf(o: AbstractAny, tpt: TypeTree)(implicit env: Env): AbstractAny
68-
def interpretAsInstanceOf(o: AbstractAny, tpt: TypeTree)(implicit env: Env): AbstractAny
69+
def interpretIsInstanceOf(o: AbstractAny, tpt: TypeTree): Result
70+
def interpretAsInstanceOf(o: AbstractAny, tpt: TypeTree): Result
6971

7072
def interpretEqEq(x: AbstractAny, y: AbstractAny): AbstractAny
7173

@@ -80,7 +82,7 @@ abstract class TreeInterpreter[R <: Reflection & Singleton](val reflect: R) {
8082
def interpretPrivitiveQuot(x: AbstractAny, y: AbstractAny): AbstractAny
8183
def interpretPrivitiveRem(x: AbstractAny, y: AbstractAny): AbstractAny
8284

83-
def eval(tree: Statement)(implicit env: Env): AbstractAny = {
85+
def eval(tree: Statement): Result = {
8486
tree match {
8587
case Call(fn, targs, argss) =>
8688
fn match {
@@ -113,7 +115,7 @@ abstract class TreeInterpreter[R <: Reflection & Singleton](val reflect: R) {
113115
}
114116

115117
case Term.Assign(lhs, rhs) =>
116-
log("<interpretAssing>", tree)(env(lhs.symbol).update(eval(rhs)))
118+
log("<interpretAssing>", tree)(implicitly[Env].apply(lhs.symbol).update(eval(rhs)))
117119

118120
case Term.If(cond, thenp, elsep) => log("interpretIf", tree)(interpretIf(cond, thenp, elsep))
119121
case Term.While(cond, body) => log("interpretWhile", tree)(interpretWhile(cond, body))

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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ class Interpreter[R <: Reflection & Singleton](reflect0: R) extends TreeInterpre
1212

1313
val jvmReflection = new JVMReflection(reflect)
1414

15-
def interpretNew(fn: Tree, argss: List[List[Term]])(implicit env: Env): Any = {
15+
def interpretNew(fn: Tree, argss: List[List[Term]]): Result = {
1616
if (fn.symbol.isDefinedInCurrentRun) {
1717
// Best effort to try to create a proxy
1818
fn.symbol.owner match {
@@ -36,7 +36,7 @@ class Interpreter[R <: Reflection & Singleton](reflect0: R) extends TreeInterpre
3636
val args1 = if (args == null) Nil else args.toList
3737
val evaluatedArgs = args1.map(arg => LocalValue.valFrom(arg))
3838

39-
val env1 = env ++ symbol.tree.paramss.headOption.getOrElse(Nil).map(_.symbol).zip(evaluatedArgs)
39+
val env1 = implicitly[Env] ++ symbol.tree.paramss.headOption.getOrElse(Nil).map(_.symbol).zip(evaluatedArgs)
4040
// println(symbol.tree)
4141
eval(symbol.tree.rhs.get)(env1).asInstanceOf[Object]
4242
}
@@ -55,7 +55,7 @@ class Interpreter[R <: Reflection & Singleton](reflect0: R) extends TreeInterpre
5555
else jvmReflection.interpretNew(fn.symbol, evaluatedArgss(argss))
5656
}
5757

58-
override def interpretCall(fn: Term, argss: List[List[Term]])(implicit env: Env): Any = {
58+
override def interpretCall(fn: Term, argss: List[List[Term]]): Result = {
5959
if (fn.symbol.isDefinedInCurrentRun) super.interpretCall(fn, argss)
6060
else {
6161
import Term._
@@ -95,12 +95,12 @@ class Interpreter[R <: Reflection & Singleton](reflect0: R) extends TreeInterpre
9595

9696
def interpretUnit(): AbstractAny = ().asInstanceOf[Object]
9797

98-
def interpretLiteral(const: Constant)(implicit env: Env): AbstractAny = const.value
98+
def interpretLiteral(const: Constant): Result = const.value
9999

100-
def interpretIsInstanceOf(o: AbstractAny, tpt: TypeTree)(implicit env: Env): AbstractAny =
100+
def interpretIsInstanceOf(o: AbstractAny, tpt: TypeTree): Result =
101101
jvmReflection.getClassOf(tpt.symbol).isInstance(o)
102102

103-
def interpretAsInstanceOf(o: AbstractAny, tpt: TypeTree)(implicit env: Env): AbstractAny =
103+
def interpretAsInstanceOf(o: AbstractAny, tpt: TypeTree): Result =
104104
jvmReflection.getClassOf(tpt.symbol).cast(o)
105105

106106
def interpretEqEq(x: AbstractAny, y: AbstractAny): AbstractAny = x == y

0 commit comments

Comments
 (0)