diff options
author | Paul Phillips <paulp@improving.org> | 2012-05-02 01:18:27 -0700 |
---|---|---|
committer | Paul Phillips <paulp@improving.org> | 2012-05-02 01:27:46 -0700 |
commit | 90d2bee45b25844f809f8c5300aefcb1bfe9e336 (patch) | |
tree | 6537e84683dae3f64c17f17bdcfe7cc177fd1a46 /src | |
parent | b27abca41a2503747b3aeeecf8b8cb355159265f (diff) | |
download | scala-90d2bee45b25844f809f8c5300aefcb1bfe9e336.tar.gz scala-90d2bee45b25844f809f8c5300aefcb1bfe9e336.tar.bz2 scala-90d2bee45b25844f809f8c5300aefcb1bfe9e336.zip |
Fixs for reflection and getSimpleName.
Since getSimpleName will be crashing us indefinitely, took the
expedient route and wrapped the call.
Diffstat (limited to 'src')
-rw-r--r-- | src/compiler/scala/reflect/runtime/JavaToScala.scala | 25 |
1 files changed, 23 insertions, 2 deletions
diff --git a/src/compiler/scala/reflect/runtime/JavaToScala.scala b/src/compiler/scala/reflect/runtime/JavaToScala.scala index 6688d77985..e11f6140c9 100644 --- a/src/compiler/scala/reflect/runtime/JavaToScala.scala +++ b/src/compiler/scala/reflect/runtime/JavaToScala.scala @@ -314,6 +314,27 @@ trait JavaToScala extends ConversionUtil { self: SymbolTable => private def followStatic(clazz: Symbol, mods: Int) = if (jModifier.isStatic(mods)) clazz.companionModule.moduleClass else clazz + /** Methods which need to be wrapped because they either are getSimpleName + * or call getSimpleName: + * + * public String getSimpleName() + * public boolean isAnonymousClass() + * public boolean isLocalClass() + * public boolean isMemberClass() + * public String getCanonicalName() + * + * TODO - find all such calls and wrap them. + * TODO - create mechanism to avoid the recurrence of unwrapped calls. + */ + private def wrapClassCheck[T](alt: T)(body: => T): T = + try body catch { case x: InternalError if x.getMessage == "Malformed class name" => alt } + + private def wrapIsLocalClass(clazz: jClass[_]): Boolean = + wrapClassCheck(false)(clazz.isLocalClass) + + private def wrapGetSimpleName(clazz: jClass[_]): String = + wrapClassCheck("")(clazz.getSimpleName) + /** * The Scala owner of the Scala class corresponding to the Java class `jclazz` */ @@ -322,7 +343,7 @@ trait JavaToScala extends ConversionUtil { self: SymbolTable => val jEnclosingClass = jclazz.getEnclosingClass val sEnclosingClass = classToScala(jEnclosingClass) followStatic(sEnclosingClass, jclazz.getModifiers) - } else if (jclazz.isLocalClass) { + } else if (wrapIsLocalClass(jclazz)) { val jEnclosingMethod = jclazz.getEnclosingMethod if (jEnclosingMethod != null) { methodToScala(jEnclosingMethod) @@ -494,7 +515,7 @@ trait JavaToScala extends ConversionUtil { self: SymbolTable => val sym = { if (jclazz.isMemberClass && !nme.isImplClassName(jname)) { lookup - } else if (jclazz.isLocalClass || invalidClassName(jname)) { + } else if (wrapIsLocalClass(jclazz) || invalidClassName(jname)) { // local classes and implementation classes not preserved by unpickling - treat as Java jclassAsScala(jclazz) } else if (jclazz.isArray) { |