summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGilles Dubochet <gilles.dubochet@epfl.ch>2009-11-08 15:55:01 +0000
committerGilles Dubochet <gilles.dubochet@epfl.ch>2009-11-08 15:55:01 +0000
commitf2f2c413117f9c41e0ee99d1596041e96a782ef2 (patch)
treeb4695a2631714836e3fe99a1b658fff98cc2c742 /src
parentaf1b2ef059dd256be8e9c2dc4ceb91a8d3b02ef5 (diff)
downloadscala-f2f2c413117f9c41e0ee99d1596041e96a782ef2.tar.gz
scala-f2f2c413117f9c41e0ee99d1596041e96a782ef2.tar.bz2
scala-f2f2c413117f9c41e0ee99d1596041e96a782ef2.zip
Fixes issue #1006 by marking structural method ...
Fixes issue #1006 by marking structural method caches as `volatile` (and the array of parameter types as `final`).
Diffstat (limited to 'src')
-rw-r--r--src/compiler/scala/tools/nsc/transform/CleanUp.scala15
1 files changed, 8 insertions, 7 deletions
diff --git a/src/compiler/scala/tools/nsc/transform/CleanUp.scala b/src/compiler/scala/tools/nsc/transform/CleanUp.scala
index 8136893fcb..d8aede6c37 100644
--- a/src/compiler/scala/tools/nsc/transform/CleanUp.scala
+++ b/src/compiler/scala/tools/nsc/transform/CleanUp.scala
@@ -126,10 +126,11 @@ abstract class CleanUp extends Transform with ast.TreeDSL {
/* ### CREATING THE METHOD CACHE ### */
- def addStaticVariableToClass(forName: String, forType: Type, forInit: Tree): Symbol = {
+ def addStaticVariableToClass(forName: String, forType: Type, forInit: Tree, isFinal: Boolean): Symbol = {
val varSym = currentClass.newVariable(ad.pos, mkName(forName))
.setFlag(PRIVATE | STATIC | MUTABLE | SYNTHETIC)
.setInfo(forType)
+ if (isFinal) varSym setFlag FINAL else varSym addAnnotation AnnotationInfo(VolatileAttr.tpe, Nil, Nil)
currentClass.info.decls enter varSym
val varDef = typedPos( VAL(varSym) === forInit )
@@ -175,7 +176,7 @@ abstract class CleanUp extends Transform with ast.TreeDSL {
*/
val reflParamsCacheSym: Symbol =
- addStaticVariableToClass("reflParams$Cache", theTypeClassArray, fromTypesToClassArrayLiteral(paramTypes))
+ addStaticVariableToClass("reflParams$Cache", theTypeClassArray, fromTypesToClassArrayLiteral(paramTypes), true)
addStaticMethodToClass("reflMethod$Method", List(ClassClass.tpe), MethodClass.tpe) {
case Pair(reflMethodSym, List(forReceiverSym)) =>
@@ -203,13 +204,13 @@ abstract class CleanUp extends Transform with ast.TreeDSL {
*/
val reflParamsCacheSym: Symbol =
- addStaticVariableToClass("reflParams$Cache", theTypeClassArray, fromTypesToClassArrayLiteral(paramTypes))
+ addStaticVariableToClass("reflParams$Cache", theTypeClassArray, fromTypesToClassArrayLiteral(paramTypes), true)
val reflMethodCacheSym: Symbol =
- addStaticVariableToClass("reflMethod$Cache", MethodClass.tpe, NULL)
+ addStaticVariableToClass("reflMethod$Cache", MethodClass.tpe, NULL, false)
val reflClassCacheSym: Symbol =
- addStaticVariableToClass("reflClass$Cache", ClassClass.tpe, NULL)
+ addStaticVariableToClass("reflClass$Cache", ClassClass.tpe, NULL, false)
def getMethodSym = ClassClass.tpe member nme.getMethod_
@@ -247,10 +248,10 @@ abstract class CleanUp extends Transform with ast.TreeDSL {
*/
val reflParamsCacheSym: Symbol =
- addStaticVariableToClass("reflParams$Cache", theTypeClassArray, fromTypesToClassArrayLiteral(paramTypes))
+ addStaticVariableToClass("reflParams$Cache", theTypeClassArray, fromTypesToClassArrayLiteral(paramTypes), true)
val reflPolyCacheSym: Symbol =
- addStaticVariableToClass("reflPoly$Cache", MethodCacheClass.tpe, NEW(TypeTree(EmptyMethodCacheClass.tpe)))
+ addStaticVariableToClass("reflPoly$Cache", MethodCacheClass.tpe, NEW(TypeTree(EmptyMethodCacheClass.tpe)), false)
addStaticMethodToClass("reflMethod$Method", List(ClassClass.tpe), MethodClass.tpe)
{ case Pair(reflMethodSym, List(forReceiverSym)) =>