diff options
author | Adriaan Moors <adriaan.moors@typesafe.com> | 2013-04-12 13:38:42 -0700 |
---|---|---|
committer | Adriaan Moors <adriaan.moors@typesafe.com> | 2013-05-16 11:56:20 -0700 |
commit | 7f9feba0213fc210c7752ab210f900c016032699 (patch) | |
tree | 80bcfeab588097788c6e7fe1463b74a95de0c78e /src | |
parent | 487584caa97d0905df06e32c292c00fcd82a2fa3 (diff) | |
download | scala-7f9feba0213fc210c7752ab210f900c016032699.tar.gz scala-7f9feba0213fc210c7752ab210f900c016032699.tar.bz2 scala-7f9feba0213fc210c7752ab210f900c016032699.zip |
[backport #1727] SI-7359 cyclic nested java class
The original commit message (from 54a84a36d5):
SI-6548 reflection correctly enters jinners
When completing Java classes, runtime reflection enumerates their
fields, methods, constructors and inner classes, loads them and
enters them into either the instance part (ClassSymbol) or the
static part (ModuleSymbol).
However unlike fields, methods and constructors, inner classes don't
need to be entered explicitly - they are entered implicitly when
being loaded.
This patch fixes the double-enter problem, make sure that enter-on-load
uses the correct owner, and also hardens jclassAsScala against double
enters that can occur in a different scenario.
Diffstat (limited to 'src')
-rw-r--r-- | src/reflect/scala/reflect/runtime/JavaMirrors.scala | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/src/reflect/scala/reflect/runtime/JavaMirrors.scala b/src/reflect/scala/reflect/runtime/JavaMirrors.scala index 3442e3d22e..0e06e643fb 100644 --- a/src/reflect/scala/reflect/runtime/JavaMirrors.scala +++ b/src/reflect/scala/reflect/runtime/JavaMirrors.scala @@ -687,7 +687,8 @@ private[reflect] trait JavaMirrors extends internal.SymbolTable with api.JavaUni (if (jModifier.isStatic(mods)) module.moduleClass else clazz).info.decls enter sym for (jinner <- jclazz.getDeclaredClasses) { - enter(jclassAsScala(jinner, clazz), jinner.getModifiers) + jclassAsScala(jinner) // inner class is entered as a side-effect + // no need to call enter explicitly } pendingLoadActions = { () => @@ -1046,13 +1047,17 @@ private[reflect] trait JavaMirrors extends internal.SymbolTable with api.JavaUni * @param jclazz The Java class * @return A Scala class symbol that wraps all reflection info of `jclazz` */ - private def jclassAsScala(jclazz: jClass[_]): Symbol = jclassAsScala(jclazz, sOwner(jclazz)) + private def jclassAsScala(jclazz: jClass[_]): Symbol = { + val clazz = sOwner(jclazz) // sOwner called outside of closure for binary compatibility + toScala(classCache, jclazz){ (mirror, jclazz) => + mirror.jclassAsScala(jclazz, clazz) + } + } private def jclassAsScala(jclazz: jClass[_], owner: Symbol): ClassSymbol = { - val name = scalaSimpleName(jclazz) - val completer = (clazz: Symbol, module: Symbol) => new FromJavaClassCompleter(clazz, module, jclazz) - val (clazz, module) = createClassModule(owner, name, completer) - classCache enter (jclazz, clazz) + val name = scalaSimpleName(jclazz) + val completer = (clazz: Symbol, module: Symbol) => new FromJavaClassCompleter(clazz, module, jclazz) + val (clazz, _) = createClassModule(owner, name, completer) clazz } |