summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPaul Phillips <paulp@improving.org>2010-11-30 06:04:33 +0000
committerPaul Phillips <paulp@improving.org>2010-11-30 06:04:33 +0000
commit402d96dd3fab6ae677966a9a258c00b3f34a37ed (patch)
treecf7ea182c1d6e3eea2a2b3eb61b123203103e340 /src
parent66a92814a61c62149a49335f65f4189763b43296 (diff)
downloadscala-402d96dd3fab6ae677966a9a258c00b3f34a37ed.tar.gz
scala-402d96dd3fab6ae677966a9a258c00b3f34a37ed.tar.bz2
scala-402d96dd3fab6ae677966a9a258c00b3f34a37ed.zip
It looks like the fix for #2318 was causing pro...
It looks like the fix for #2318 was causing problems, so I gave it some more graceful failure. Leaving #2318 open because the implementation could still work harder to find the right method. No review.
Diffstat (limited to 'src')
-rw-r--r--src/compiler/scala/tools/nsc/symtab/Definitions.scala1
-rw-r--r--src/compiler/scala/tools/nsc/transform/CleanUp.scala6
-rw-r--r--src/library/scala/runtime/ScalaRunTime.scala11
3 files changed, 14 insertions, 4 deletions
diff --git a/src/compiler/scala/tools/nsc/symtab/Definitions.scala b/src/compiler/scala/tools/nsc/symtab/Definitions.scala
index 4c7bc32c02..a468e81b3e 100644
--- a/src/compiler/scala/tools/nsc/symtab/Definitions.scala
+++ b/src/compiler/scala/tools/nsc/symtab/Definitions.scala
@@ -164,6 +164,7 @@ trait Definitions extends reflect.generic.StandardDefinitions {
def arrayUpdateMethod = getMember(ScalaRunTimeModule, "array_update")
def arrayLengthMethod = getMember(ScalaRunTimeModule, "array_length")
def arrayCloneMethod = getMember(ScalaRunTimeModule, "array_clone")
+ def ensureAccessibleMethod = getMember(ScalaRunTimeModule, "ensureAccessible")
def scalaRuntimeHash = getMember(ScalaRunTimeModule, "hash")
def scalaRuntimeSameElements = getMember(ScalaRunTimeModule, nme.sameElements)
diff --git a/src/compiler/scala/tools/nsc/transform/CleanUp.scala b/src/compiler/scala/tools/nsc/transform/CleanUp.scala
index 73886420c1..f8f185e6d8 100644
--- a/src/compiler/scala/tools/nsc/transform/CleanUp.scala
+++ b/src/compiler/scala/tools/nsc/transform/CleanUp.scala
@@ -221,8 +221,7 @@ abstract class CleanUp extends Transform with ast.TreeDSL {
if (method != null)
return method
else {
- method = forReceiver.getMethod("xyz", reflParams$Cache)
- method.setAccessible(true) // issue #2381
+ method = ScalaRunTime.ensureAccessible(forReceiver.getMethod("xyz", reflParams$Cache))
reflPoly$Cache = new SoftReference(reflPoly$Cache.get.add(forReceiver, method))
return method
}
@@ -250,8 +249,7 @@ abstract class CleanUp extends Transform with ast.TreeDSL {
def methodSymRHS = ((REF(forReceiverSym) DOT Class_getMethod)(LIT(method), REF(reflParamsCacheSym)))
def cacheRHS = ((getPolyCache DOT methodCache_add)(REF(forReceiverSym), REF(methodSym)))
BLOCK(
- REF(methodSym) === methodSymRHS,
- (REF(methodSym) DOT methodClass_setAccessible)(LIT(true)),
+ REF(methodSym) === (REF(ensureAccessibleMethod) APPLY (methodSymRHS)),
REF(reflPolyCacheSym) === gen.mkSoftRef(cacheRHS),
Return(REF(methodSym))
)
diff --git a/src/library/scala/runtime/ScalaRunTime.scala b/src/library/scala/runtime/ScalaRunTime.scala
index 2d4d1d3306..925e9b4b64 100644
--- a/src/library/scala/runtime/ScalaRunTime.scala
+++ b/src/library/scala/runtime/ScalaRunTime.scala
@@ -17,6 +17,7 @@ import scala.collection.immutable.{ NumericRange, List, Stream, Nil, :: }
import scala.collection.generic.{ Sorted }
import scala.xml.{ Node, MetaData }
import scala.util.control.ControlThrowable
+import java.lang.reflect.{ Modifier, Method => JMethod }
/* The object <code>ScalaRunTime</code> provides ...
*/
@@ -111,6 +112,16 @@ object ScalaRunTime {
arr
}
+ // Java bug: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4071957
+ // More background at ticket #2318.
+ def ensureAccessible(m: JMethod): JMethod = {
+ if (!m.isAccessible) {
+ try m setAccessible true
+ catch { case _: SecurityException => () }
+ }
+ m
+ }
+
def checkInitialized[T <: AnyRef](x: T): T =
if (x == null) throw new UninitializedError else x