From 73975d7491bc413b5f19022ff1df92d6e0ce3c24 Mon Sep 17 00:00:00 2001
From: Matei Zaharia <matei@eecs.berkeley.edu>
Date: Tue, 31 May 2011 22:05:24 -0700
Subject: [PATCH] Further fixes to interpreter (adding in some code generation
 changes I missed before and setting SparkEnv properly on the threads that
 execute each line in the 2.9 interpreter).

---
 repl/src/main/scala/spark/repl/SparkILoop.scala   |  4 +++-
 repl/src/main/scala/spark/repl/SparkIMain.scala   | 11 ++++++++++-
 repl/src/main/scala/spark/repl/SparkImports.scala |  4 ++--
 3 files changed, 15 insertions(+), 4 deletions(-)

diff --git a/repl/src/main/scala/spark/repl/SparkILoop.scala b/repl/src/main/scala/spark/repl/SparkILoop.scala
index bfbc66ebdd..aec398b965 100644
--- a/repl/src/main/scala/spark/repl/SparkILoop.scala
+++ b/repl/src/main/scala/spark/repl/SparkILoop.scala
@@ -842,6 +842,9 @@ class SparkILoop(in0: Option[BufferedReader], val out: PrintWriter, val master:
   }
 
   def process(settings: Settings): Boolean = {
+    printWelcome()
+    echo("Initializing interpreter...")
+
     this.settings = settings
     createInterpreter()
     
@@ -856,7 +859,6 @@ class SparkILoop(in0: Option[BufferedReader], val out: PrintWriter, val master:
     if (intp.reporter.hasErrors)
       return false
     
-    printWelcome()
     try {      
       // this is about the illusion of snappiness.  We call initialize()
       // which spins off a separate thread, then print the prompt and try 
diff --git a/repl/src/main/scala/spark/repl/SparkIMain.scala b/repl/src/main/scala/spark/repl/SparkIMain.scala
index 49d0a27030..14e6eb3455 100644
--- a/repl/src/main/scala/spark/repl/SparkIMain.scala
+++ b/repl/src/main/scala/spark/repl/SparkIMain.scala
@@ -29,6 +29,7 @@ import SparkIMain._
 
 import spark.HttpServer
 import spark.Utils
+import spark.SparkEnv
 
 /** An interpreter for Scala code.
  *  
@@ -879,7 +880,15 @@ class SparkIMain(val settings: Settings, protected val out: PrintWriter) extends
       }
       
       try {
-        val execution = lineManager.set(originalLine)(lineRep call "$export")
+        val execution = lineManager.set(originalLine) {
+          // MATEI: set the right SparkEnv for our SparkContext, because
+          // this execution will happen in a separate thread
+          val sc = spark.repl.Main.interp.sparkContext
+          if (sc != null && sc.env != null)
+            SparkEnv.set(sc.env)
+          // Execute the line
+          lineRep call "$export"
+        }
         execution.await()
         
         execution.state match {
diff --git a/repl/src/main/scala/spark/repl/SparkImports.scala b/repl/src/main/scala/spark/repl/SparkImports.scala
index bd28395f2e..6ccd3cf1f0 100644
--- a/repl/src/main/scala/spark/repl/SparkImports.scala
+++ b/repl/src/main/scala/spark/repl/SparkImports.scala
@@ -144,8 +144,8 @@ trait SparkImports {
     // add code for a new object to hold some imports
     def addWrapper() {
       val impname = nme.INTERPRETER_IMPORT_WRAPPER
-      code append "object %s {\n".format(impname)
-      trailingBraces append "}\n"
+      code append "class %sC extends Serializable {\n".format(impname)
+      trailingBraces append "}\nval " + impname + " = new " + impname + "C;\n"
       accessPath append ("." + impname)
       
       currentImps.clear
-- 
GitLab