summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPaul Phillips <paulp@improving.org>2012-05-02 01:18:27 -0700
committerPaul Phillips <paulp@improving.org>2012-05-02 01:27:46 -0700
commit90d2bee45b25844f809f8c5300aefcb1bfe9e336 (patch)
tree6537e84683dae3f64c17f17bdcfe7cc177fd1a46 /src
parentb27abca41a2503747b3aeeecf8b8cb355159265f (diff)
downloadscala-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.scala25
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) {