summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/compiler/scala/reflect/internal/Definitions.scala3
-rw-r--r--src/compiler/scala/reflect/internal/Flags.scala5
-rw-r--r--src/compiler/scala/reflect/internal/Symbols.scala1
-rw-r--r--src/compiler/scala/tools/nsc/backend/jvm/GenJVM.scala6
-rw-r--r--src/compiler/scala/tools/nsc/backend/opt/Inliners.scala7
-rw-r--r--src/compiler/scala/tools/nsc/transform/TailCalls.scala27
-rw-r--r--src/compiler/scala/tools/nsc/transform/UnCurry.scala25
-rw-r--r--src/fjbg/ch/epfl/lamp/fjbg/JAccessFlags.java1
-rw-r--r--src/fjbg/ch/epfl/lamp/fjbg/JFieldOrMethod.java4
-rw-r--r--src/fjbg/ch/epfl/lamp/fjbg/JMethod.java1
-rw-r--r--src/library/scala/annotation/synchronized.scala15
11 files changed, 33 insertions, 62 deletions
diff --git a/src/compiler/scala/reflect/internal/Definitions.scala b/src/compiler/scala/reflect/internal/Definitions.scala
index e87f7d65b0..974eb1442c 100644
--- a/src/compiler/scala/reflect/internal/Definitions.scala
+++ b/src/compiler/scala/reflect/internal/Definitions.scala
@@ -688,7 +688,7 @@ trait Definitions extends reflect.api.StandardDefinitions {
lazy val Object_ne = newMethod(ObjectClass, nme.ne, anyrefparam, booltype, FINAL)
lazy val Object_isInstanceOf = newT1NoParamsMethod(ObjectClass, nme.isInstanceOf_Ob, FINAL | SYNTHETIC)(_ => booltype)
lazy val Object_asInstanceOf = newT1NoParamsMethod(ObjectClass, nme.asInstanceOf_Ob, FINAL | SYNTHETIC)(_.typeConstructor)
- lazy val Object_synchronized = newPolyMethod(1, ObjectClass, nme.synchronized_, FINAL)(tps =>
+ lazy val Object_synchronized = newPolyMethod(1, ObjectClass, nme.synchronized_, FINAL)(tps =>
(Some(List(tps.head.typeConstructor)), tps.head.typeConstructor)
)
lazy val String_+ = newMethod(StringClass, nme.raw.PLUS, anyparam, stringtype, FINAL)
@@ -734,7 +734,6 @@ trait Definitions extends reflect.api.StandardDefinitions {
lazy val ScalaStrictFPAttr = getRequiredClass("scala.annotation.strictfp")
lazy val SerializableAttr = getRequiredClass("scala.annotation.serializable") // @serializable is deprecated
lazy val SwitchClass = getRequiredClass("scala.annotation.switch")
- lazy val SynchronizedAttr = getRequiredClass("scala.annotation.synchronized")
lazy val TailrecClass = getRequiredClass("scala.annotation.tailrec")
lazy val VarargsClass = getRequiredClass("scala.annotation.varargs")
lazy val uncheckedStableClass = getRequiredClass("scala.annotation.unchecked.uncheckedStable")
diff --git a/src/compiler/scala/reflect/internal/Flags.scala b/src/compiler/scala/reflect/internal/Flags.scala
index aa696bc6e8..270491d078 100644
--- a/src/compiler/scala/reflect/internal/Flags.scala
+++ b/src/compiler/scala/reflect/internal/Flags.scala
@@ -165,6 +165,7 @@ class Flags extends ModifierFlags {
final val TRIEDCOOKING = 0x100000000000L // ``Cooking'' has been tried on this symbol
// A Java method's type is ``cooked'' by transforming raw types to existentials
+ final val SYNCHRONIZED = 0x200000000000L // symbol is a method which should be marked ACC_SYNCHRONIZED
// ------- shift definitions -------------------------------------------------------
final val InitialFlags = 0x0001FFFFFFFFFFFFL // flags that are enabled from phase 1.
@@ -222,7 +223,7 @@ class Flags extends ModifierFlags {
/** These modifiers appear in TreePrinter output. */
final val PrintableFlags: Long =
ExplicitFlags | LOCAL | SYNTHETIC | STABLE | CASEACCESSOR | MACRO |
- ACCESSOR | SUPERACCESSOR | PARAMACCESSOR | BRIDGE | STATIC | VBRIDGE | SPECIALIZED
+ ACCESSOR | SUPERACCESSOR | PARAMACCESSOR | BRIDGE | STATIC | VBRIDGE | SPECIALIZED | SYNCHRONIZED
/** The two bridge flags */
final val BridgeFlags = BRIDGE | VBRIDGE
@@ -384,7 +385,7 @@ class Flags extends ModifierFlags {
case VBRIDGE => "<vbridge>" // (1L << 42)
case VARARGS => "<varargs>" // (1L << 43)
case TRIEDCOOKING => "<triedcooking>" // (1L << 44)
- case 0x200000000000L => "" // (1L << 45)
+ case SYNCHRONIZED => "<synchronized>" // (1L << 45)
case 0x400000000000L => "" // (1L << 46)
case 0x800000000000L => "" // (1L << 47)
case 0x1000000000000L => "" // (1L << 48)
diff --git a/src/compiler/scala/reflect/internal/Symbols.scala b/src/compiler/scala/reflect/internal/Symbols.scala
index e997405c77..ce85d65050 100644
--- a/src/compiler/scala/reflect/internal/Symbols.scala
+++ b/src/compiler/scala/reflect/internal/Symbols.scala
@@ -557,7 +557,6 @@ trait Symbols extends api.Symbols { self: SymbolTable =>
}
def isStrictFP = hasAnnotation(ScalaStrictFPAttr) || (enclClass hasAnnotation ScalaStrictFPAttr)
- def isSynchronized = hasAnnotation(SynchronizedAttr)
def isSerializable = (
info.baseClasses.exists(p => p == SerializableClass || p == JavaSerializableClass)
|| hasAnnotation(SerializableAttr) // last part can be removed, @serializable annotation is deprecated
diff --git a/src/compiler/scala/tools/nsc/backend/jvm/GenJVM.scala b/src/compiler/scala/tools/nsc/backend/jvm/GenJVM.scala
index 50e84a81a8..23ee0bb33d 100644
--- a/src/compiler/scala/tools/nsc/backend/jvm/GenJVM.scala
+++ b/src/compiler/scala/tools/nsc/backend/jvm/GenJVM.scala
@@ -857,9 +857,6 @@ abstract class GenJVM extends SubComponent with GenJVMUtil with GenAndroid with
if (method.native)
flags |= ACC_NATIVE
- if (m.symbol.isSynchronized)
- flags |= ACC_SYNCHRONIZED
-
jmethod = jclass.addNewMethod(flags,
javaName(m.symbol),
resTpe,
@@ -1917,7 +1914,8 @@ abstract class GenJVM extends SubComponent with GenJVMUtil with GenAndroid with
if (sym.isStaticMember) ACC_STATIC else 0,
if (sym.isBridge) ACC_BRIDGE | ACC_SYNTHETIC else 0,
if (sym.isClass && !sym.isInterface) ACC_SUPER else 0,
- if (sym.isVarargsMethod) ACC_VARARGS else 0
+ if (sym.isVarargsMethod) ACC_VARARGS else 0,
+ if (sym.hasFlag(Flags.SYNCHRONIZED)) JAVA_ACC_SYNCHRONIZED else 0
)
}
def javaFieldFlags(sym: Symbol) = {
diff --git a/src/compiler/scala/tools/nsc/backend/opt/Inliners.scala b/src/compiler/scala/tools/nsc/backend/opt/Inliners.scala
index 09be682123..2398f8406c 100644
--- a/src/compiler/scala/tools/nsc/backend/opt/Inliners.scala
+++ b/src/compiler/scala/tools/nsc/backend/opt/Inliners.scala
@@ -706,8 +706,8 @@ abstract class Inliners extends SubComponent {
if (settings.debug.value) icodes.checkValid(caller.m)
}
- def isStampedForInlining(stack: TypeStack) =
- !sameSymbols && inc.m.hasCode && shouldInline && isSafeToInline(stack) && !inc.m.symbol.isSynchronized
+ def isStampedForInlining(stackLength: Int) =
+ !sameSymbols && inc.m.hasCode && shouldInline && isSafeToInline(stackLength) && !inc.m.symbol.hasFlag(Flags.SYNCHRONIZED)
def logFailure(stackLength: Int) = log(
"""|inline failed for %s:
@@ -724,8 +724,7 @@ abstract class Inliners extends SubComponent {
def failureReason(stackLength: Int) =
if (!inc.m.hasCode) "bytecode was unavailable"
- else if (!isSafeToInline(stack)) "it is unsafe (target may reference private fields)"
- else if (inc.m.symbol.isSynchronized) "method is synchronized"
+ else if (!isSafeToInline(stackLength)) "it is unsafe (target may reference private fields)"
else "of a bug (run with -Ylog:inline -Ydebug for more information)"
def canAccess(level: NonPublicRefs.Value) = level match {
diff --git a/src/compiler/scala/tools/nsc/transform/TailCalls.scala b/src/compiler/scala/tools/nsc/transform/TailCalls.scala
index 39ca60d870..23697a4730 100644
--- a/src/compiler/scala/tools/nsc/transform/TailCalls.scala
+++ b/src/compiler/scala/tools/nsc/transform/TailCalls.scala
@@ -173,29 +173,6 @@ abstract class TailCalls extends Transform {
trees map (t => transform(t, nctx))
}
- /**
- * Transforms methods with synchronized body into synchronized methods
- */
- private def transformSynchronizedMethods(tree: Tree): Tree = {
- def isSelfSynchronized(body: Apply) = body.fun match {
- case TypeApply(fun @ Select(This(_), _), List(TypeTree()))
- if (fun.symbol == Object_synchronized &&
- fun.qualifier.symbol == tree.symbol.enclClass &&
- !tree.symbol.enclClass.isTrait) => true
- case _ => false
- }
-
- tree match {
- case DefDef(mods, name, tparams, vparamss, tpt, rhs @ Apply(_, List(body)))
- if (isSelfSynchronized(rhs)) =>
- val res = treeCopy.DefDef(tree, mods, name, tparams, vparamss, tpt, body)
- res.symbol withAnnotation AnnotationInfo(SynchronizedAttr.tpe, Nil, Nil)
- res
- case _ =>
- tree
- }
- }
-
override def transform(tree: Tree): Tree = {
/** A possibly polymorphic apply to be considered for tail call transformation.
*/
@@ -245,8 +222,8 @@ abstract class TailCalls extends Transform {
else rewriteTailCall(receiver)
}
- transformSynchronizedMethods(tree) match {
- case dd @ DefDef(mods, name, tparams, vparams, tpt, rhs) =>
+ tree match {
+ case dd @ DefDef(_, _, _, vparamss0, _, rhs0) =>
val newCtx = new Context(dd)
debuglog("Considering " + dd.name + " for tailcalls")
val newRHS = transform(rhs0, newCtx)
diff --git a/src/compiler/scala/tools/nsc/transform/UnCurry.scala b/src/compiler/scala/tools/nsc/transform/UnCurry.scala
index b9b115b7c8..2af6192e42 100644
--- a/src/compiler/scala/tools/nsc/transform/UnCurry.scala
+++ b/src/compiler/scala/tools/nsc/transform/UnCurry.scala
@@ -451,6 +451,24 @@ abstract class UnCurry extends InfoTransform
gen.mkZero(tree.tpe) setType tree.tpe
}
}
+
+ private def isSelfSynchronized(ddef: DefDef) = ddef.rhs match {
+ case Apply(fn @ TypeApply(Select(sel, _), _), _) =>
+ fn.symbol == Object_synchronized && sel.symbol == ddef.symbol.enclClass && !ddef.symbol.enclClass.isTrait
+ case _ => false
+ }
+
+ /** If an eligible method is entirely wrapped in a call to synchronized
+ * locked on the same instance, remove the synchronized scaffolding and
+ * mark the method symbol SYNCHRONIZED for bytecode generation.
+ */
+ private def translateSynchronized(tree: Tree) = tree match {
+ case dd @ DefDef(_, _, _, _, _, Apply(fn, body :: Nil)) if isSelfSynchronized(dd) =>
+ log("Translating " + dd.symbol.defString + " into synchronized method")
+ dd.symbol setFlag SYNCHRONIZED
+ deriveDefDef(dd)(_ => body)
+ case _ => tree
+ }
// ------ The tree transformers --------------------------------------------------------
@@ -495,9 +513,10 @@ abstract class UnCurry extends InfoTransform
// breakage until a reasonable interface is settled upon.
if ((sym ne null) && (sym.elisionLevel.exists (_ < settings.elidebelow.value || settings.noassertions.value)))
replaceElidableTree(tree)
- else tree match {
+ else translateSynchronized(tree) match {
case dd @ DefDef(mods, name, tparams, vparamss, tpt, rhs) =>
if (dd.symbol hasAnnotation VarargsClass) saveRepeatedParams(dd)
+
withNeedLift(false) {
if (dd.symbol.isClassConstructor) {
atOwner(sym) {
@@ -512,11 +531,11 @@ abstract class UnCurry extends InfoTransform
treeCopy.Block(rhs, presupers ::: supercalls ::: others, transform(expr))
}
treeCopy.DefDef(
- tree, mods, name, transformTypeDefs(tparams),
+ dd, mods, name, transformTypeDefs(tparams),
transformValDefss(vparamss), transform(tpt), rhs1)
}
} else {
- super.transform(tree)
+ super.transform(dd)
}
}
case ValDef(_, _, _, rhs) =>
diff --git a/src/fjbg/ch/epfl/lamp/fjbg/JAccessFlags.java b/src/fjbg/ch/epfl/lamp/fjbg/JAccessFlags.java
index d254acbdc1..0a48fc1628 100644
--- a/src/fjbg/ch/epfl/lamp/fjbg/JAccessFlags.java
+++ b/src/fjbg/ch/epfl/lamp/fjbg/JAccessFlags.java
@@ -19,7 +19,6 @@ public interface JAccessFlags {
public static int ACC_STATIC = 0x0008;
public static int ACC_FINAL = 0x0010;
public static int ACC_SUPER = 0x0020;
- public static int ACC_SYNCHRONIZED = 0x0020;
public static int ACC_VOLATILE = 0x0040;
public static int ACC_TRANSIENT = 0x0080;
public static int ACC_NATIVE = 0x0100;
diff --git a/src/fjbg/ch/epfl/lamp/fjbg/JFieldOrMethod.java b/src/fjbg/ch/epfl/lamp/fjbg/JFieldOrMethod.java
index beb76893f6..3d2bf87264 100644
--- a/src/fjbg/ch/epfl/lamp/fjbg/JFieldOrMethod.java
+++ b/src/fjbg/ch/epfl/lamp/fjbg/JFieldOrMethod.java
@@ -121,10 +121,6 @@ abstract public class JFieldOrMethod extends JMember {
return (accessFlags & JAccessFlags.ACC_VARARGS) != 0;
}
- public boolean isSynchronized() {
- return (accessFlags & JAccessFlags.ACC_SYNCHRONIZED) != 0;
- }
-
public void writeTo(DataOutputStream stream) throws IOException {
if (! frozen) {
try {
diff --git a/src/fjbg/ch/epfl/lamp/fjbg/JMethod.java b/src/fjbg/ch/epfl/lamp/fjbg/JMethod.java
index 9b9da3c0aa..ad35c76da3 100644
--- a/src/fjbg/ch/epfl/lamp/fjbg/JMethod.java
+++ b/src/fjbg/ch/epfl/lamp/fjbg/JMethod.java
@@ -194,7 +194,6 @@ public class JMethod extends JFieldOrMethod {
else if (isNative()) buf.append("native ");
if (isAbstract()) buf.append("abstract ");
else if (isFinal()) buf.append("final ");
- if (isSynchronized()) buf.append("synchronized ");
return buf.toString();
}
}
diff --git a/src/library/scala/annotation/synchronized.scala b/src/library/scala/annotation/synchronized.scala
deleted file mode 100644
index 9470c7173c..0000000000
--- a/src/library/scala/annotation/synchronized.scala
+++ /dev/null
@@ -1,15 +0,0 @@
-/* __ *\
-** ________ ___ / / ___ Scala API **
-** / __/ __// _ | / / / _ | (c) 2002-2011, LAMP/EPFL **
-** __\ \/ /__/ __ |/ /__/ __ | http://scala-lang.org/ **
-** /____/\___/_/ |_/____/_/ | | **
-** |/ **
-\* */
-
-package scala.annotation
-
-/**
- * If this annotation is present on a method, the synchronized flag will be emitted.
- * FIXME This should be internal to the compiler
- */
-private[scala] class synchronized extends StaticAnnotation