Skip to content

Commit 71c596a

Browse files
committed
Merge pull request scala#3433 from rjolly/si-7933
SI-7933 REPL javax.script eval is cached result
2 parents 6724890 + 9dfac45 commit 71c596a

File tree

7 files changed

+43
-36
lines changed

7 files changed

+43
-36
lines changed

src/compiler/scala/tools/nsc/util/package.scala

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ package scala
77
package tools
88
package nsc
99

10-
import java.io.{ OutputStream, PrintStream, ByteArrayOutputStream, PrintWriter, StringWriter }
10+
import java.io.{ OutputStream, PrintStream, ByteArrayOutputStream, PrintWriter, StringWriter, Reader }
1111

1212
package object util {
1313
// forwarder for old code that builds against 2.9 and 2.10
@@ -46,6 +46,17 @@ package object util {
4646
(result, ts2 filterNot (ts1 contains _))
4747
}
4848

49+
def stringFromReader(reader: Reader) = {
50+
val writer = new StringWriter()
51+
var c = reader.read()
52+
while(c != -1) {
53+
writer.write(c)
54+
c = reader.read()
55+
}
56+
reader.close()
57+
writer.toString()
58+
}
59+
4960
/** Generate a string using a routine that wants to write on a stream. */
5061
def stringFromWriter(writer: PrintWriter => Unit): String = {
5162
val stringWriter = new StringWriter()

src/repl/scala/tools/nsc/interpreter/IMain.scala

Lines changed: 10 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import scala.reflect.internal.util.{ BatchSourceFile, SourceFile }
1818
import scala.tools.util.PathResolver
1919
import scala.tools.nsc.io.AbstractFile
2020
import scala.tools.nsc.typechecker.{ TypeStrings, StructuredTypeStrings }
21-
import scala.tools.nsc.util.{ ScalaClassLoader, stringFromWriter, StackTraceOps }
21+
import scala.tools.nsc.util.{ ScalaClassLoader, stringFromReader, stringFromWriter, StackTraceOps }
2222
import scala.tools.nsc.util.Exceptional.unwrap
2323
import javax.script.{AbstractScriptEngine, Bindings, ScriptContext, ScriptEngine, ScriptEngineFactory, ScriptException, CompiledScript, Compilable}
2424

@@ -534,8 +534,7 @@ class IMain(@BeanProperty val factory: ScriptEngineFactory, initialSettings: Set
534534

535535
var code = ""
536536
var bound = false
537-
@throws[ScriptException]
538-
def compile(script: String): CompiledScript = {
537+
def compiled(script: String): CompiledScript = {
539538
if (!bound) {
540539
quietBind("engine" -> this.asInstanceOf[ScriptEngine])
541540
bound = true
@@ -562,18 +561,6 @@ class IMain(@BeanProperty val factory: ScriptEngineFactory, initialSettings: Set
562561
}
563562
}
564563

565-
@throws[ScriptException]
566-
def compile(reader: java.io.Reader): CompiledScript = {
567-
val writer = new java.io.StringWriter()
568-
var c = reader.read()
569-
while(c != -1) {
570-
writer.write(c)
571-
c = reader.read()
572-
}
573-
reader.close()
574-
compile(writer.toString())
575-
}
576-
577564
private class WrappedRequest(val req: Request) extends CompiledScript {
578565
var recorded = false
579566

@@ -1014,10 +1001,16 @@ class IMain(@BeanProperty val factory: ScriptEngineFactory, initialSettings: Set
10141001
}
10151002

10161003
@throws[ScriptException]
1017-
def eval(script: String, context: ScriptContext): Object = compile(script).eval(context)
1004+
def compile(script: String): CompiledScript = eval("new javax.script.CompiledScript { def eval(context: javax.script.ScriptContext): Object = { " + script + " }.asInstanceOf[Object]; def getEngine: javax.script.ScriptEngine = engine }").asInstanceOf[CompiledScript]
1005+
1006+
@throws[ScriptException]
1007+
def compile(reader: java.io.Reader): CompiledScript = compile(stringFromReader(reader))
1008+
1009+
@throws[ScriptException]
1010+
def eval(script: String, context: ScriptContext): Object = compiled(script).eval(context)
10181011

10191012
@throws[ScriptException]
1020-
def eval(reader: java.io.Reader, context: ScriptContext): Object = compile(reader).eval(context)
1013+
def eval(reader: java.io.Reader, context: ScriptContext): Object = eval(stringFromReader(reader), context)
10211014

10221015
override def finalize = close
10231016

test/disabled/run/t7843-jsr223-service.scala

Lines changed: 0 additions & 18 deletions
This file was deleted.
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import scala.tools.nsc.interpreter.IMain
2+
3+
object Test extends App {
4+
val engine = new IMain.Factory getScriptEngine()
5+
engine.asInstanceOf[IMain].settings.usejavacp.value = true
6+
engine put ("n", 10)
7+
engine eval "1 to n.asInstanceOf[Int] foreach print"
8+
}

test/files/run/t7933.check

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
hello
2+
hello

test/files/run/t7933.scala

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import scala.tools.nsc.interpreter.IMain
2+
3+
object Test extends App {
4+
val engine = new IMain.Factory getScriptEngine()
5+
engine.asInstanceOf[IMain].settings.usejavacp.value = true
6+
val res2 = engine.asInstanceOf[javax.script.Compilable]
7+
res2 compile "8" eval()
8+
val res5 = res2 compile """println("hello") ; 8"""
9+
res5 eval()
10+
res5 eval()
11+
}

0 commit comments

Comments
 (0)