Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ScalaTest check using <:< either throws an exception or deadlocks #8196

Closed
scabug opened this issue Jan 28, 2014 · 11 comments
Closed

ScalaTest check using <:< either throws an exception or deadlocks #8196

scabug opened this issue Jan 28, 2014 · 11 comments
Assignees
Milestone

Comments

@scabug
Copy link

scabug commented Jan 28, 2014

When the following ScalaTest is executed from within Intellij then an exception is throws (stacktrace see below) or it deadlocks if executed from within sbt (jstack output is attached).

package eu.swdev.play.form

import org.scalatest.FunSuite

import scala.reflect.runtime.{ universe => ru }

/**
  */
class ReflectionTest extends FunSuite {

  trait FormTrait {
    val runtimeMirror = ru.runtimeMirror(this.getClass.getClassLoader)
    val instanceMirror = runtimeMirror.reflect(this)
    val members = instanceMirror.symbol.typeSignature.members
    def fields = members.filter(_.typeSignature <:< ru.typeOf[Int])
  }

  test("reflection test 2") {

    class Form1 extends FormTrait {
      val f1 = 5
    }
    val form1 = new Form1

    println(form1.fields)

    val form2 = new FormTrait {
      val g1 = new Form1
    }

    val x = form2.g1.f1 // comment this line in order to make the test pass
  }
}

The really strange thing is that the check passes if the last line, i.e. the val x = ... assignment is commented.
Stacktrace when executing test using Intellij:

scala.reflect.internal.FatalError: no-symbol does not have an owner
	at scala.reflect.internal.SymbolTable.abort(SymbolTable.scala:49)
	at scala.reflect.internal.Symbols$NoSymbol.owner(Symbols.scala:3248)
	at scala.reflect.internal.Symbols$Symbol.newSyntheticValueParam(Symbols.scala:346)
	at scala.reflect.internal.Symbols$Symbol$$anonfun$newSyntheticValueParams$1.apply(Symbols.scala:340)
	at scala.reflect.internal.Symbols$Symbol$$anonfun$newSyntheticValueParams$1.apply(Symbols.scala:340)
	at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244)
	at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244)
	at scala.collection.immutable.List.foreach(List.scala:318)
	at scala.collection.TraversableLike$class.map(TraversableLike.scala:244)
	at scala.collection.AbstractTraversable.map(Traversable.scala:105)
	at scala.reflect.internal.Symbols$Symbol.newSyntheticValueParams(Symbols.scala:340)
	at scala.reflect.internal.Symbols$Symbol.newSyntheticValueParams(Symbols.scala:337)
	at scala.reflect.runtime.JavaMirrors$JavaMirror.setMethType(JavaMirrors.scala:1093)
	at scala.reflect.runtime.JavaMirrors$JavaMirror.scala$reflect$runtime$JavaMirrors$JavaMirror$$jmethodAsScala1(JavaMirrors.scala:1112)
	at scala.reflect.runtime.JavaMirrors$JavaMirror$$anonfun$scala$reflect$runtime$JavaMirrors$JavaMirror$$jmethodAsScala$1.apply(JavaMirrors.scala:1103)
	at scala.reflect.runtime.JavaMirrors$JavaMirror$$anonfun$scala$reflect$runtime$JavaMirrors$JavaMirror$$jmethodAsScala$1.apply(JavaMirrors.scala:1103)
	at scala.reflect.runtime.JavaMirrors$JavaMirror$$anonfun$toScala$1.apply(JavaMirrors.scala:104)
	at scala.reflect.runtime.TwoWayCache.toScala(TwoWayCache.scala:38)
	at scala.reflect.runtime.JavaMirrors$JavaMirror.toScala(JavaMirrors.scala:102)
	at scala.reflect.runtime.JavaMirrors$JavaMirror.scala$reflect$runtime$JavaMirrors$JavaMirror$$jmethodAsScala(JavaMirrors.scala:1103)
	at scala.reflect.runtime.JavaMirrors$JavaMirror$FromJavaClassCompleter$$anonfun$1$$anonfun$apply$mcV$sp$2.apply(JavaMirrors.scala:707)
	at scala.reflect.runtime.JavaMirrors$JavaMirror$FromJavaClassCompleter$$anonfun$1$$anonfun$apply$mcV$sp$2.apply(JavaMirrors.scala:706)
	at scala.collection.IndexedSeqOptimized$class.foreach(IndexedSeqOptimized.scala:33)
	at scala.collection.mutable.ArrayOps$ofRef.foreach(ArrayOps.scala:108)
	at scala.reflect.runtime.JavaMirrors$JavaMirror$FromJavaClassCompleter$$anonfun$1.apply$mcV$sp(JavaMirrors.scala:706)
	at scala.reflect.runtime.JavaMirrors$JavaMirror$FromJavaClassCompleter.completeRest(JavaMirrors.scala:720)
	at scala.reflect.runtime.JavaMirrors$JavaMirror$FromJavaClassCompleter$LazyPolyType.complete(JavaMirrors.scala:727)
	at scala.reflect.internal.Symbols$Symbol.info(Symbols.scala:1229)
	at scala.reflect.internal.Types$ClassTypeRef$class.baseType(Types.scala:2186)
	at scala.reflect.internal.Types$TypeRef$$anon$6.baseType(Types.scala:2544)
	at scala.reflect.internal.Types$class.firstTry$1(Types.scala:6058)
	at scala.reflect.internal.Types$class.isSubType2(Types.scala:6222)
	at scala.reflect.internal.Types$class.isSubType(Types.scala:5831)
	at scala.reflect.runtime.JavaUniverse.scala$reflect$runtime$SynchronizedTypes$$super$isSubType(JavaUniverse.scala:12)
	at scala.reflect.runtime.SynchronizedTypes$class.isSubType(SynchronizedTypes.scala:60)
	at scala.reflect.runtime.JavaUniverse.isSubType(JavaUniverse.scala:12)
	at scala.reflect.internal.Types$Type.$less$colon$less(Types.scala:872)
	at scala.reflect.internal.Types$Type.$less$colon$less(Types.scala:343)
	at eu.swdev.play.form.ReflectionTest$FormTrait$$anonfun$fields$1.apply(ReflectionTest.scala:15)
	at eu.swdev.play.form.ReflectionTest$FormTrait$$anonfun$fields$1.apply(ReflectionTest.scala:15)
	at scala.collection.TraversableLike$$anonfun$filter$1.apply(TraversableLike.scala:264)
	at scala.collection.immutable.List.foreach(List.scala:318)
	at scala.collection.TraversableLike$class.filter(TraversableLike.scala:263)
	at scala.collection.AbstractTraversable.filter(Traversable.scala:105)
	at scala.reflect.internal.Scopes$Scope.filter(Scopes.scala:318)
	at scala.reflect.internal.Scopes$Scope.filter(Scopes.scala:44)
	at eu.swdev.play.form.ReflectionTest$FormTrait$class.fields(ReflectionTest.scala:15)
	at eu.swdev.play.form.ReflectionTest$$anonfun$1$Form1$1.fields(ReflectionTest.scala:20)
	at eu.swdev.play.form.ReflectionTest$$anonfun$1.apply$mcV$sp(ReflectionTest.scala:25)
	at eu.swdev.play.form.ReflectionTest$$anonfun$1.apply(ReflectionTest.scala:18)
	at eu.swdev.play.form.ReflectionTest$$anonfun$1.apply(ReflectionTest.scala:18)
	at org.scalatest.Transformer$$anonfun$apply$1.apply(Transformer.scala:22)
	at org.scalatest.Transformer$$anonfun$apply$1.apply(Transformer.scala:22)
	at org.scalatest.OutcomeOf$class.outcomeOf(OutcomeOf.scala:85)
	at org.scalatest.OutcomeOf$.outcomeOf(OutcomeOf.scala:104)
	at org.scalatest.Transformer.apply(Transformer.scala:22)
	at org.scalatest.Transformer.apply(Transformer.scala:20)
	at org.scalatest.FunSuiteLike$$anon$1.apply(FunSuiteLike.scala:139)
	at org.scalatest.Suite$class.withFixture(Suite.scala:1121)
	at org.scalatest.FunSuite.withFixture(FunSuite.scala:1371)
	at org.scalatest.FunSuiteLike$class.invokeWithFixture$1(FunSuiteLike.scala:136)
	at org.scalatest.FunSuiteLike$$anonfun$runTest$1.apply(FunSuiteLike.scala:148)
	at org.scalatest.FunSuiteLike$$anonfun$runTest$1.apply(FunSuiteLike.scala:148)
	at org.scalatest.SuperEngine.runTestImpl(Engine.scala:306)
	at org.scalatest.FunSuiteLike$class.runTest(FunSuiteLike.scala:148)
	at org.scalatest.FunSuite.runTest(FunSuite.scala:1371)
	at org.scalatest.FunSuiteLike$$anonfun$runTests$1.apply(FunSuiteLike.scala:180)
	at org.scalatest.FunSuiteLike$$anonfun$runTests$1.apply(FunSuiteLike.scala:180)
	at org.scalatest.SuperEngine$$anonfun$traverseSubNodes$1$1.apply(Engine.scala:413)
	at org.scalatest.SuperEngine$$anonfun$traverseSubNodes$1$1.apply(Engine.scala:401)
	at scala.collection.immutable.List.foreach(List.scala:318)
	at org.scalatest.SuperEngine.traverseSubNodes$1(Engine.scala:401)
	at org.scalatest.SuperEngine.org$scalatest$SuperEngine$$runTestsInBranch(Engine.scala:396)
	at org.scalatest.SuperEngine.runTestsImpl(Engine.scala:483)
	at org.scalatest.FunSuiteLike$class.runTests(FunSuiteLike.scala:180)
	at org.scalatest.FunSuite.runTests(FunSuite.scala:1371)
	at org.scalatest.Suite$class.run(Suite.scala:1437)
	at org.scalatest.FunSuite.org$scalatest$FunSuiteLike$$super$run(FunSuite.scala:1371)
	at org.scalatest.FunSuiteLike$$anonfun$run$1.apply(FunSuiteLike.scala:184)
	at org.scalatest.FunSuiteLike$$anonfun$run$1.apply(FunSuiteLike.scala:184)
	at org.scalatest.SuperEngine.runImpl(Engine.scala:545)
	at org.scalatest.FunSuiteLike$class.run(FunSuiteLike.scala:184)
	at org.scalatest.FunSuite.run(FunSuite.scala:1371)
	at org.scalatest.tools.SuiteRunner.run(SuiteRunner.scala:55)
	at org.scalatest.tools.Runner$$anonfun$doRunRunRunDaDoRunRun$3.apply(Runner.scala:2518)
	at org.scalatest.tools.Runner$$anonfun$doRunRunRunDaDoRunRun$3.apply(Runner.scala:2512)
	at scala.collection.immutable.List.foreach(List.scala:318)
	at org.scalatest.tools.Runner$.doRunRunRunDaDoRunRun(Runner.scala:2512)
	at org.scalatest.tools.Runner$$anonfun$runOptionallyWithPassFailReporter$2.apply(Runner.scala:1006)
	at org.scalatest.tools.Runner$$anonfun$runOptionallyWithPassFailReporter$2.apply(Runner.scala:1005)
	at org.scalatest.tools.Runner$.withClassLoaderAndDispatchReporter(Runner.scala:2659)
	at org.scalatest.tools.Runner$.runOptionallyWithPassFailReporter(Runner.scala:1005)
	at org.scalatest.tools.Runner$.run(Runner.scala:845)
	at org.scalatest.tools.Runner.run(Runner.scala)
	at org.jetbrains.plugins.scala.testingSupport.scalaTest.ScalaTestRunner.runScalaTest2(ScalaTestRunner.java:144)
	at org.jetbrains.plugins.scala.testingSupport.scalaTest.ScalaTestRunner.main(ScalaTestRunner.java:35)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:606)
	at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
@scabug
Copy link
Author

scabug commented Jan 28, 2014

Imported From: https://issues.scala-lang.org/browse/SI-8196?orig=1
Reporter: stefan.wachter-at-gmx.de
Affected Versions: 2.10.3
Other Milestones: 2.11.0-M6
Attachments:

  • jstack.txt (created on Jan 28, 2014 5:15:48 PM UTC, 36895 bytes)

@scabug
Copy link
Author

scabug commented Jan 28, 2014

@adriaanm said:
Looks like a type completer isn't running correctly under runtime reflection.

@scabug
Copy link
Author

scabug commented Jan 28, 2014

@xeno-by said:
Let's revisit this once scala/scala#3391 is merged. I think the problem could be caused by reflection being thread-unsafe.

@scabug
Copy link
Author

scabug commented Feb 10, 2014

@adriaanm said:
Since 2.11.0-RC1 is one week away, pushing all non-blockers without PR to 2.11.1-RC1. Please undo the change if I missed work in progress.

@scabug
Copy link
Author

scabug commented Feb 13, 2014

@xeno-by said:
Changing fix version to 2.11.0-RC2, so that we can take a really good look at what's going on once RC1 is published and compatible tool versions are published as well (M8 version of ScalaTest is binary incompatible with current SNAPSHOT).

@scabug
Copy link
Author

scabug commented Mar 10, 2014

@retronym said:
Here's the test case without a dependency on Scalatest:

object Test extends App {
 
  trait FormTrait {
    import scala.reflect.runtime.{ universe => ru }

    val runtimeMirror = ru.runtimeMirror(this.getClass.getClassLoader)
    val instanceMirror = runtimeMirror.reflect(this)
    val members = instanceMirror.symbol.typeSignature.members
    def fields = members.filter(_.typeSignature <:< ru.typeOf[Int])
  }
 
  val f = () => {
 
    class Form1 extends FormTrait {
      val f1 = 5
    }
    val form1 = new Form1
 
    println(form1.fields)
 
    val form2 = new FormTrait {
      val g1 = new Form1
    }
 
    form2.g1 // comment this line in order to make the test pass
    ()
  }

  f()  
}

I haven't minimized it further, but note that the "remove this line and it passes" comment is accurate, and that this is single threaded.

This doesn't crash in 2.11.0-M6, but only because NoSymbol#owner no longer throws an exception after fde88c7, "No longer crash on NoSymbol.owner.".

@scabug
Copy link
Author

scabug commented Mar 10, 2014

@retronym said:
The crash happens when converting public static java.lang.reflect.Method Test$$anonfun$1.reflMethod$Method1(java.lang.Class) to Scala.

@scabug
Copy link
Author

scabug commented Mar 10, 2014

@xeno-by said:
Thanks for the detailed analysis. Do we want to fix this in 2.11.0?

@scabug
Copy link
Author

scabug commented Mar 10, 2014

@retronym said:
scala/scala#3614

@scabug
Copy link
Author

scabug commented Mar 10, 2014

@retronym said:
I think 2.10.5/2.11.1 is fine for this.

@scabug
Copy link
Author

scabug commented Feb 26, 2015

@adriaanm said:
Looks like the PR was merged but the issue wasn't closed.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants