Skip to content

Commit

Permalink
Merge pull request #10601 from som-snytt/tweak/nonfatal
Browse files Browse the repository at this point in the history
Improve performance of Boolean extractors such as `NonFatal`
  • Loading branch information
lrytz committed Dec 19, 2023
2 parents c80c0ff + 4ee1800 commit 343b85b
Show file tree
Hide file tree
Showing 4 changed files with 36 additions and 2 deletions.
Expand Up @@ -66,6 +66,14 @@ trait PatternMatching extends Transform

class MatchTransformer(unit: CompilationUnit) extends TypingTransformer(unit) {
override def transform(tree: Tree): Tree = tree match {
case CaseDef(UnApply(Apply(Select(qual, nme.unapply), Ident(nme.SELECTOR_DUMMY) :: Nil), (bind@Bind(b, Ident(nme.WILDCARD))) :: Nil), guard, body)
if guard.isEmpty && qual.symbol == definitions.NonFatalModule =>
transform(treeCopy.CaseDef(
tree,
bind,
localTyper.typed(atPos(tree.pos)(Apply(gen.mkAttributedRef(definitions.NonFatal_apply), List(Ident(bind.symbol))))),
body))

case Match(sel, cases) =>
val origTp = tree.tpe

Expand Down
4 changes: 3 additions & 1 deletion src/reflect/scala/reflect/internal/Definitions.scala
Expand Up @@ -711,7 +711,9 @@ trait Definitions extends api.StandardDefinitions {
lazy val SuccessClass = requiredClass[scala.util.Success[_]]
lazy val FutureClass = requiredClass[scala.concurrent.Future[_]]
lazy val PromiseClass = requiredClass[scala.concurrent.Promise[_]]
lazy val NonFatalClass = requiredClass[scala.util.control.NonFatal.type]

lazy val NonFatalModule = requiredModule[scala.util.control.NonFatal.type]
lazy val NonFatal_apply = getMemberMethod(NonFatalModule, nme.apply)

def unspecializedSymbol(sym: Symbol): Symbol = {
if (sym hasFlag SPECIALIZED) {
Expand Down
3 changes: 2 additions & 1 deletion src/reflect/scala/reflect/runtime/JavaUniverseForce.scala
Expand Up @@ -396,7 +396,8 @@ trait JavaUniverseForce { self: runtime.JavaUniverse =>
definitions.SuccessClass
definitions.FutureClass
definitions.PromiseClass
definitions.NonFatalClass
definitions.NonFatalModule
definitions.NonFatal_apply
definitions.MacroContextType
definitions.ProductRootClass
definitions.Any_$eq$eq
Expand Down
23 changes: 23 additions & 0 deletions test/files/run/nonfatal.scala
@@ -0,0 +1,23 @@

//> using options -opt:none
//
import scala.tools.partest.BytecodeTest
import scala.tools.testkit.ASMConverters.instructionsFromMethod
import org.junit.Assert.assertEquals

object Test extends BytecodeTest {
def show(): Unit = {
val classNode = loadClassNode("C")
val f = getMethod(classNode, "f")
val g = getMethod(classNode, "g")
assertEquals(instructionsFromMethod(f), instructionsFromMethod(g))
//sameBytecode(f, g) // prints
}
}

class C {
import scala.util.control.NonFatal
def x = 42
def f = try x catch { case NonFatal(e) => e.printStackTrace(); -1 }
def g = try x catch { case e if NonFatal(e) => e.printStackTrace(); -1 }
}

0 comments on commit 343b85b

Please sign in to comment.