summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--config/list/library.lst1
-rw-r--r--sources/scala/cloneable.scala12
-rw-r--r--sources/scala/collection/mutable/Buffer.scala3
-rw-r--r--sources/scala/collection/mutable/Map.scala3
-rw-r--r--sources/scala/collection/mutable/PriorityQueue.scala4
-rw-r--r--sources/scala/collection/mutable/Queue.scala8
-rw-r--r--sources/scala/collection/mutable/Set.scala3
-rw-r--r--sources/scala/collection/mutable/Stack.scala4
-rw-r--r--sources/scalac/backend/jvm/GenJVM.java23
-rw-r--r--sources/scalac/symtab/Definitions.java17
-rw-r--r--sources/scalac/util/Names.java1
11 files changed, 57 insertions, 22 deletions
diff --git a/config/list/library.lst b/config/list/library.lst
index daf7d4c790..7e432502a8 100644
--- a/config/list/library.lst
+++ b/config/list/library.lst
@@ -13,6 +13,7 @@ Byte.java
CaseClass.scala
Cell.scala
Char.java
+cloneable.scala
Console.scala
Double.java
Enumeration.scala
diff --git a/sources/scala/cloneable.scala b/sources/scala/cloneable.scala
new file mode 100644
index 0000000000..8369799be0
--- /dev/null
+++ b/sources/scala/cloneable.scala
@@ -0,0 +1,12 @@
+/* __ *\
+** ________ ___ / / ___ Scala API **
+** / __/ __// _ | / / / _ | (c) 2002-2005, LAMP/EPFL **
+** __\ \/ /__/ __ |/ /__/ __ | **
+** /____/\___/_/ |_/____/_/ | | **
+** |/ **
+** $Id$
+*/
+
+package scala;
+
+class cloneable extends Attribute {}
diff --git a/sources/scala/collection/mutable/Buffer.scala b/sources/scala/collection/mutable/Buffer.scala
index 5d6adcc9c9..f1e8d0fe9b 100644
--- a/sources/scala/collection/mutable/Buffer.scala
+++ b/sources/scala/collection/mutable/Buffer.scala
@@ -17,7 +17,8 @@ package scala.collection.mutable;
* @author Matthias Zenger
* @version 1.1, 02/03/2004
*/
-trait Buffer[A] extends AnyRef with Seq[A] with Scriptable[Message[Pair[Location, A]]] with Cloneable {
+[cloneable]
+trait Buffer[A] extends AnyRef with Seq[A] with Scriptable[Message[Pair[Location, A]]] {
/** Append a single element to this buffer and return
* the identity of the buffer.
diff --git a/sources/scala/collection/mutable/Map.scala b/sources/scala/collection/mutable/Map.scala
index 1432b13394..75f544193e 100644
--- a/sources/scala/collection/mutable/Map.scala
+++ b/sources/scala/collection/mutable/Map.scala
@@ -17,7 +17,8 @@ package scala.collection.mutable;
* @author Matthias Zenger
* @version 1.1, 09/05/2004
*/
-trait Map[A, B] extends AnyRef with scala.collection.Map[A, B] with Scriptable[Message[Pair[A, B]]] with Cloneable {
+[cloneable]
+trait Map[A, B] extends AnyRef with scala.collection.Map[A, B] with Scriptable[Message[Pair[A, B]]] {
/** This method allows one to add a new mapping from <code>key</code>
* to <code>value</code> to the map. If the map already contains a
diff --git a/sources/scala/collection/mutable/PriorityQueue.scala b/sources/scala/collection/mutable/PriorityQueue.scala
index e9e44dbbd7..82d76ec957 100644
--- a/sources/scala/collection/mutable/PriorityQueue.scala
+++ b/sources/scala/collection/mutable/PriorityQueue.scala
@@ -17,8 +17,8 @@ package scala.collection.mutable;
* @author Matthias Zenger
* @version 1.0, 03/05/2004
*/
-//[serializable]
-class PriorityQueue[A <% Ordered[A]] extends ResizableArray[A] with Cloneable with java.io.Serializable {
+//[serializable, cloneable]
+class PriorityQueue[A <% Ordered[A]] extends ResizableArray[A] with java.io.Serializable {
size = size + 1; // we do not use array(0)
protected def fixUp(as: Array[A], m: Int): Unit = {
diff --git a/sources/scala/collection/mutable/Queue.scala b/sources/scala/collection/mutable/Queue.scala
index c3e0020576..2f22411ede 100644
--- a/sources/scala/collection/mutable/Queue.scala
+++ b/sources/scala/collection/mutable/Queue.scala
@@ -16,8 +16,8 @@ package scala.collection.mutable;
* @author Matthias Zenger
* @version 1.1, 03/05/2004
*/
-[serializable]
-class Queue[A] extends MutableList[A] with Cloneable {
+[serializable, cloneable]
+class Queue[A] extends MutableList[A] {
/** Checks if the queue is empty.
*
@@ -81,7 +81,7 @@ class Queue[A] extends MutableList[A] with Cloneable {
if (first == null)
None
else if (p(first.elem)) {
- val res = Some(first.elem);
+ val res: Option[A] = Some(first.elem);
first = first.next;
len = len - 1;
if (first == null) {
@@ -136,7 +136,7 @@ class Queue[A] extends MutableList[A] with Cloneable {
if (cell.next == null)
None
else {
- val res = Some(cell.next);
+ val res: Option[LinkedList[A]] = Some(cell.next);
cell.next = cell.next.next;
if (cell.next == null)
last = cell;
diff --git a/sources/scala/collection/mutable/Set.scala b/sources/scala/collection/mutable/Set.scala
index 7ef0fb0b16..d493ee1560 100644
--- a/sources/scala/collection/mutable/Set.scala
+++ b/sources/scala/collection/mutable/Set.scala
@@ -18,7 +18,8 @@ package scala.collection.mutable;
* @author Matthias Zenger
* @version 1.1, 09/05/2004
*/
-trait Set[A] extends AnyRef with scala.collection.Set[A] with Scriptable[Message[A]] with Cloneable {
+[cloneable]
+trait Set[A] extends AnyRef with scala.collection.Set[A] with Scriptable[Message[A]] {
/** This method allows one to add or remove an element <code>elem</code>
* from this set depending on the value of parameter <code>included</code>.
diff --git a/sources/scala/collection/mutable/Stack.scala b/sources/scala/collection/mutable/Stack.scala
index 135d21a70c..5597a3cd5d 100644
--- a/sources/scala/collection/mutable/Stack.scala
+++ b/sources/scala/collection/mutable/Stack.scala
@@ -16,8 +16,8 @@ package scala.collection.mutable;
* @author Matthias Zenger
* @version 1.1, 03/05/2004
*/
-[serializable]
-class Stack[A] extends MutableList[A] with Cloneable {
+[serializable, cloneable]
+class Stack[A] extends MutableList[A] {
/** Checks if the stack is empty.
*
diff --git a/sources/scalac/backend/jvm/GenJVM.java b/sources/scalac/backend/jvm/GenJVM.java
index b3ec16c879..2ba2fb1a6b 100644
--- a/sources/scalac/backend/jvm/GenJVM.java
+++ b/sources/scalac/backend/jvm/GenJVM.java
@@ -87,8 +87,6 @@ public class GenJVM {
protected final Symbol JAVA_RMI_REMOTE_CLASS;
protected final Symbol SCALA_SERIAL_VERSION_UID_CONSTR;
- protected final Symbol SCALA_TRANSIENT_CONSTR;
- protected final Symbol SCALA_VOLATILE_CONSTR;
protected final Global global;
protected final Definitions defs;
@@ -118,10 +116,6 @@ public class GenJVM {
JAVA_RMI_REMOTE_CLASS = defs.getClass(JAVA_RMI_REMOTE);
SCALA_SERIAL_VERSION_UID_CONSTR =
defs.getClass("scala.SerialVersionUID") .primaryConstructor();
- SCALA_TRANSIENT_CONSTR =
- defs.getClass("scala.transient").primaryConstructor();
- SCALA_VOLATILE_CONSTR =
- defs.getClass("scala.volatile").primaryConstructor();
}
/// Code generation
@@ -1634,6 +1628,9 @@ public class GenJVM {
boolean serializable =
global.getAttrArguments(cSym, defs.SCALA_SERIALIZABLE_CONSTR) != null;
+ boolean cloneable =
+ global.getAttrArguments(cSym, defs.SCALA_CLONEABLE_CONSTR) != null;
+
scalac.symtab.Type[] baseTps = cSym.info().parents();
assert baseTps.length > 0 : Debug.show(cSym);
@@ -1647,14 +1644,18 @@ public class GenJVM {
superClassName = javaName(baseTps[0].symbol());
}
String[] interfaceNames = new String[baseTps.length - offset
- + (serializable ? 1 : 0)];
+ + (serializable ? 1 : 0)
+ + (cloneable ? 1 : 0)];
for (int i = offset; i < baseTps.length; ++i) {
Symbol baseSym = baseTps[i].symbol();
assert baseSym.isInterface() : cSym + " implements " + baseSym;
interfaceNames[i - offset] = javaName(baseSym);
}
if (serializable)
- interfaceNames[interfaceNames.length - 1] = "java.io.Serializable";
+ interfaceNames[interfaceNames.length - 1 - (cloneable ? 1 : 0)] =
+ "java.io.Serializable";
+ if (cloneable)
+ interfaceNames[interfaceNames.length - 1] = "java.lang.Cloneable";
JClass cls = fjbgContext.JClass(javaModifiers(cSym)
& ~JAccessFlags.ACC_STATIC
@@ -1788,9 +1789,11 @@ public class GenJVM {
Symbol member = memberIt.next();
if (member.isTerm() && !member.isMethod()) {
int flags = javaModifiers(member);
- if (global.getAttrArguments(member,SCALA_TRANSIENT_CONSTR)!=null)
+ if (global.getAttrArguments(member,defs.SCALA_TRANSIENT_CONSTR)
+ != null)
flags |= JAccessFlags.ACC_TRANSIENT;
- if (global.getAttrArguments(member,SCALA_VOLATILE_CONSTR)!=null)
+ if (global.getAttrArguments(member,defs.SCALA_VOLATILE_CONSTR)
+ != null)
flags |= JAccessFlags.ACC_VOLATILE;
ctx.clazz.addNewField(flags,
member.name.toString(),
diff --git a/sources/scalac/symtab/Definitions.java b/sources/scalac/symtab/Definitions.java
index f09740708a..70386c9d1a 100644
--- a/sources/scalac/symtab/Definitions.java
+++ b/sources/scalac/symtab/Definitions.java
@@ -253,6 +253,9 @@ public class Definitions {
// attributes
public final Symbol SCALA_SERIALIZABLE_CONSTR;
+ public final Symbol SCALA_TRANSIENT_CONSTR;
+ public final Symbol SCALA_VOLATILE_CONSTR;
+ public final Symbol SCALA_CLONEABLE_CONSTR;
//########################################################################
// Public Fields & Methods - Scala primitive types
@@ -337,6 +340,7 @@ public class Definitions {
/** Some java.lang.Object methods */
public final Symbol OBJECT_EQ;
public final Symbol OBJECT_NE;
+ public final Symbol OBJECT_CLONE;
public final Symbol OBJECT_SYNCHRONIZED;
/** Some java.lang.String methods */
@@ -835,6 +839,12 @@ public class Definitions {
SCALA_SERIALIZABLE_CONSTR = getClass("scala.serializable")
.primaryConstructor();
+ SCALA_TRANSIENT_CONSTR = getClass("scala.transient")
+ .primaryConstructor();
+ SCALA_VOLATILE_CONSTR = getClass("scala.volatile")
+ .primaryConstructor();
+ SCALA_CLONEABLE_CONSTR = getClass("scala.cloneable")
+ .primaryConstructor();
// initialize generated classes and aliases
initClass(ANY_CLASS, Type.EMPTY_ARRAY);
@@ -924,6 +934,9 @@ public class Definitions {
OBJECT_SYNCHRONIZED_TPARAM.type())));
if (forMSIL) {
+ OBJECT_CLONE = newMethod(OBJECT_CLASS, Names.clone, Modifiers.PROTECTED);
+ initMethod(OBJECT_CLONE, Type.EMPTY_ARRAY, ANYREF_TYPE());
+
Symbol WAIT0 = newMethod(OBJECT_CLASS, Names.wait, Modifiers.FINAL);
initMethod(WAIT0, Type.EMPTY_ARRAY, UNIT_TYPE());
@@ -943,7 +956,9 @@ public class Definitions {
Symbol JLOA = newAlias(JAVALANG, Names.Object, 0);
initAlias(JLOA, OBJECT_TYPE());
- }
+ } else {
+ OBJECT_CLONE = null;
+ }
// add members to java.lang.String
STRING_PLUS = newMethod(STRING_CLASS, Names.PLUS, Modifiers.FINAL);
diff --git a/sources/scalac/util/Names.java b/sources/scalac/util/Names.java
index 0a2883d0aa..9bde7b9b5c 100644
--- a/sources/scalac/util/Names.java
+++ b/sources/scalac/util/Names.java
@@ -168,6 +168,7 @@ public class Names {
public static final Name caseElement = Name.fromString("caseElement");
public static final Name cur = Name.fromString("cur"); // used in translation of automata
public static final Name cast = Name.fromString("cast");
+ public static final Name clone = Name.fromString("clone");
public static final Name coerce = Name.fromString("coerce");
public static final Name defaultValue = Name.fromString("defaultValue");
public static final Name elem = Name.fromString("elem");