Skip to content

Commit db0a14d

Browse files
committed
.
1 parent 07fb2b8 commit db0a14d

File tree

4 files changed

+9
-5
lines changed

4 files changed

+9
-5
lines changed

compiler/src/dotty/tools/dotc/config/ScalaSettings.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -325,6 +325,7 @@ private sealed trait XSettings:
325325
val XprintSuspension: Setting[Boolean] = BooleanSetting(AdvancedSetting, "Xprint-suspension", "Show when code is suspended until macros are compiled.")
326326
val Xprompt: Setting[Boolean] = BooleanSetting(AdvancedSetting, "Xprompt", "Display a prompt after each error (debugging option).")
327327
val XreplDisableDisplay: Setting[Boolean] = BooleanSetting(AdvancedSetting, "Xrepl-disable-display", "Do not display definitions in REPL.")
328+
val XreplDisableBytecodeInstrumentation: Setting[Boolean] = BooleanSetting(AdvancedSetting, "Xrepl-disable-bytecode-instrumentation", "Disable bytecode instrumentation for interrupt handling in REPL.")
328329
val XverifySignatures: Setting[Boolean] = BooleanSetting(AdvancedSetting, "Xverify-signatures", "Verify generic signatures in generated bytecode.")
329330
val XignoreScala2Macros: Setting[Boolean] = BooleanSetting(AdvancedSetting, "Xignore-scala2-macros", "Ignore errors when compiling code that calls Scala2 macros, these will fail at runtime.")
330331
val XimportSuggestionTimeout: Setting[Int] = IntSetting(AdvancedSetting, "Ximport-suggestion-timeout", "Timeout (in ms) for searching for import suggestions when errors are reported.", 8000)

compiler/src/dotty/tools/repl/AbstractFileClassLoader.scala

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import dotty.tools.repl.ReplBytecodeInstrumentation
2121
import java.net.{URL, URLConnection, URLStreamHandler}
2222
import java.util.Collections
2323

24-
class AbstractFileClassLoader(val root: AbstractFile, parent: ClassLoader) extends ClassLoader(parent):
24+
class AbstractFileClassLoader(val root: AbstractFile, parent: ClassLoader, instrumentBytecode: Boolean = true) extends ClassLoader(parent):
2525
private def findAbstractFile(name: String) = root.lookupPath(name.split('/').toIndexedSeq, directory = false)
2626

2727
// on JDK 20 the URL constructor we're using is deprecated,
@@ -58,7 +58,7 @@ class AbstractFileClassLoader(val root: AbstractFile, parent: ClassLoader) exten
5858

5959
// Instrument bytecode for everything except ReplCancel itself to avoid infinite recursion
6060
val bytes =
61-
if name == "dotty.tools.repl.ReplCancel" then originalBytes
61+
if !instrumentBytecode || name == "dotty.tools.repl.ReplCancel" then originalBytes
6262
else ReplBytecodeInstrumentation.instrument(originalBytes)
6363

6464
defineClass(name, bytes, 0, bytes.length)
@@ -72,7 +72,8 @@ class AbstractFileClassLoader(val root: AbstractFile, parent: ClassLoader) exten
7272
if (is == null) return super.loadClass(name)
7373

7474
try
75-
val instrumentedBytes = ReplBytecodeInstrumentation.instrument(is.readAllBytes())
75+
val bytes = is.readAllBytes()
76+
val instrumentedBytes = if instrumentBytecode then ReplBytecodeInstrumentation.instrument(bytes) else bytes
7677
defineClass(name, instrumentedBytes, 0, instrumentedBytes.length)
7778
finally
7879
is.close()

compiler/src/dotty/tools/repl/Rendering.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,8 @@ private[repl] class Rendering(parentClassLoader: Option[ClassLoader] = None):
7272
new java.net.URLClassLoader(compilerClasspath.toArray, baseClassLoader)
7373
}
7474

75-
myClassLoader = new AbstractFileClassLoader(ctx.settings.outputDir.value, parent)
75+
val instrumentBytecode = !ctx.settings.XreplDisableBytecodeInstrumentation.value
76+
myClassLoader = new AbstractFileClassLoader(ctx.settings.outputDir.value, parent, instrumentBytecode)
7677
myClassLoader
7778
}
7879

compiler/src/dotty/tools/repl/ReplDriver.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -599,8 +599,9 @@ class ReplDriver(settings: Array[String],
599599
val prevClassLoader = rendering.classLoader()
600600
val jarClassLoader = fromURLsParallelCapable(
601601
jarClassPath.asURLs, prevClassLoader)
602+
val instrumentBytecode = !ctx.settings.XreplDisableBytecodeInstrumentation.value
602603
rendering.myClassLoader = new AbstractFileClassLoader(
603-
prevOutputDir, jarClassLoader)
604+
prevOutputDir, jarClassLoader, instrumentBytecode)
604605

605606
out.println(s"Added '$path' to classpath.")
606607
} catch {

0 commit comments

Comments
 (0)