From f262ab507ecf80c36cde4b5fb186f778911d916f Mon Sep 17 00:00:00 2001 From: Martin Odersky Date: Fri, 21 Oct 2011 16:05:48 +0000 Subject: Towards runtime code generation. No review. --- src/compiler/scala/reflect/runtime/ToolBoxes.scala | 24 ++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) (limited to 'src/compiler') diff --git a/src/compiler/scala/reflect/runtime/ToolBoxes.scala b/src/compiler/scala/reflect/runtime/ToolBoxes.scala index 9b0f8a33b4..8713ef01b7 100644 --- a/src/compiler/scala/reflect/runtime/ToolBoxes.scala +++ b/src/compiler/scala/reflect/runtime/ToolBoxes.scala @@ -14,6 +14,7 @@ import scala.tools.nsc.util.FreshNameCreator import scala.reflect.internal.Flags import scala.tools.nsc.util.NoSourceFile import java.lang.{Class => jClass} +import scala.tools.nsc.util.trace trait ToolBoxes extends { self: Universe => @@ -46,7 +47,7 @@ trait ToolBoxes extends { self: Universe => } def compileExpr(expr: Tree, fvs: List[Symbol]): String = { - val cdef = wrapInClass(expr, fvs) + val cdef = trace("wrapped: ")(wrapInClass(expr, fvs)) val unit = wrapInCompilationUnit(cdef) val run = new Run run.compileUnits(List(unit), run.namerPhase) @@ -78,14 +79,18 @@ trait ToolBoxes extends { self: Universe => lazy val classLoader = new AbstractFileClassLoader(virtualDirectory, getClass.getClassLoader) - - def typeCheck(tree: rm.Tree, expectedType: rm.Type): rm.Tree = { - if (compiler.settings.verbose.value) println("typing "+tree+", pt = "+expectedType) - val run = new compiler.Run - compiler.phase = run.refchecksPhase + private def importAndTypeCheck(tree: rm.Tree, expectedType: rm.Type): compiler.Tree = { val ctree: compiler.Tree = importer.importTree(tree.asInstanceOf[Tree]) val pt: compiler.Type = importer.importType(expectedType.asInstanceOf[Type]) + val run = new compiler.Run + compiler.phase = run.refchecksPhase val ttree: compiler.Tree = compiler.typer.typed(ctree, compiler.analyzer.EXPRmode, pt) + ttree + } + + def typeCheck(tree: rm.Tree, expectedType: rm.Type): rm.Tree = { + if (compiler.settings.verbose.value) println("typing "+tree+", pt = "+expectedType) + val ttree = importAndTypeCheck(tree, expectedType) exporter.importTree(ttree).asInstanceOf[rm.Tree] } @@ -100,5 +105,12 @@ trait ToolBoxes extends { self: Universe => } finally compiler.settings.printtypes.value = saved } + + def runExpr(tree: rm.Tree, expectedType: rm.Type): Any = { + val ttree = importAndTypeCheck(tree, expectedType) + compiler.runExpr(ttree) + } + + def runExpr(tree: rm.Tree): Any = runExpr(tree, WildcardType.asInstanceOf[rm.Type]) } } \ No newline at end of file -- cgit v1.2.3