summaryrefslogtreecommitdiff
path: root/sources
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2005-10-19 08:19:42 +0000
committerMartin Odersky <odersky@gmail.com>2005-10-19 08:19:42 +0000
commitef6771bfc802e3dfc415a2fcaf7c0f6a0a9d9dcc (patch)
tree2e97e0431395eabeba3fe5b0e2eac76fd3fb385e /sources
parentf2141da88e9bfaf12364ba28d8c7e62685bd9528 (diff)
downloadscala-ef6771bfc802e3dfc415a2fcaf7c0f6a0a9d9dcc.tar.gz
scala-ef6771bfc802e3dfc415a2fcaf7c0f6a0a9d9dcc.tar.bz2
scala-ef6771bfc802e3dfc415a2fcaf7c0f6a0a9d9dcc.zip
*** empty log message ***
Diffstat (limited to 'sources')
-rw-r--r--sources/scala/Byte.java21
-rw-r--r--sources/scala/Char.java21
-rw-r--r--sources/scala/Double.java21
-rw-r--r--sources/scala/Float.java21
-rw-r--r--sources/scala/Int.java21
-rw-r--r--sources/scala/Long.java21
-rw-r--r--sources/scala/Predef.scala48
-rw-r--r--sources/scala/Short.java21
-rwxr-xr-xsources/scala/tools/nsc/symtab/Definitions.scala4
-rwxr-xr-xsources/scala/tools/nsc/transform/Erasure.scala27
-rwxr-xr-xsources/scala/tools/nsc/transform/LambdaLift.scala28
-rwxr-xr-xsources/scala/tools/nsc/transform/Mixin.scala2
12 files changed, 213 insertions, 43 deletions
diff --git a/sources/scala/Byte.java b/sources/scala/Byte.java
index adf7cc610f..e998662800 100644
--- a/sources/scala/Byte.java
+++ b/sources/scala/Byte.java
@@ -30,6 +30,27 @@ public abstract class Byte extends AnyVal implements java.io.Serializable {
return String.valueOf(value);
}
+ /** @meta method []scala.Byte; */
+ public byte toByte() { return (byte)value; }
+
+ /** @meta method []scala.Short; */
+ public short toShort() { return (short)value; }
+
+ /** @meta method []scala.Char; */
+ public char toChar() { return (char)value; }
+
+ /** @meta method []scala.Int; */
+ public int toInt() { return (int)value; }
+
+ /** @meta method []scala.Long; */
+ public long toLong() { return (long)value; }
+
+ /** @meta method []scala.Float; */
+ public float toFloat() { return (float)value; }
+
+ /** @meta method []scala.Double; */
+ public double toDouble() { return (double)value; }
+
/** @meta method (scala.Any)scala.Boolean; */
public boolean $eq$eq (java.lang.Object other) { return equals(other); }
/** @meta method (scala.Any)scala.Boolean; */
diff --git a/sources/scala/Char.java b/sources/scala/Char.java
index 0cec730836..3a92fc6799 100644
--- a/sources/scala/Char.java
+++ b/sources/scala/Char.java
@@ -30,6 +30,27 @@ public abstract class Char extends AnyVal implements java.io.Serializable {
return String.valueOf(value);
}
+ /** @meta method []scala.Byte; */
+ public byte toByte() { return (byte)value; }
+
+ /** @meta method []scala.Short; */
+ public short toShort() { return (short)value; }
+
+ /** @meta method []scala.Char; */
+ public char toChar() { return (char)value; }
+
+ /** @meta method []scala.Int; */
+ public int toInt() { return (int)value; }
+
+ /** @meta method []scala.Long; */
+ public long toLong() { return (long)value; }
+
+ /** @meta method []scala.Float; */
+ public float toFloat() { return (float)value; }
+
+ /** @meta method []scala.Double; */
+ public double toDouble() { return (double)value; }
+
/** @meta method (scala.Any)scala.Boolean; */
public boolean $eq$eq (java.lang.Object other) { return equals(other); }
/** @meta method (scala.Any)scala.Boolean; */
diff --git a/sources/scala/Double.java b/sources/scala/Double.java
index be5d3de12a..77f44fd10e 100644
--- a/sources/scala/Double.java
+++ b/sources/scala/Double.java
@@ -30,6 +30,27 @@ public abstract class Double extends AnyVal implements java.io.Serializable {
return String.valueOf(value);
}
+ /** @meta method []scala.Byte; */
+ public byte toByte() { return (byte)value; }
+
+ /** @meta method []scala.Short; */
+ public short toShort() { return (short)value; }
+
+ /** @meta method []scala.Char; */
+ public char toChar() { return (char)value; }
+
+ /** @meta method []scala.Int; */
+ public int toInt() { return (int)value; }
+
+ /** @meta method []scala.Long; */
+ public long toLong() { return (long)value; }
+
+ /** @meta method []scala.Float; */
+ public float toFloat() { return (float)value; }
+
+ /** @meta method []scala.Double; */
+ public double toDouble() { return (double)value; }
+
/** @meta method (scala.Any)scala.Boolean; */
public boolean $eq$eq (java.lang.Object other) { return equals(other); }
/** @meta method (scala.Any)scala.Boolean; */
diff --git a/sources/scala/Float.java b/sources/scala/Float.java
index 28e7a0ef64..a4a35f575e 100644
--- a/sources/scala/Float.java
+++ b/sources/scala/Float.java
@@ -30,6 +30,27 @@ public abstract class Float extends AnyVal implements java.io.Serializable {
return String.valueOf(value);
}
+ /** @meta method []scala.Byte; */
+ public byte toByte() { return (byte)value; }
+
+ /** @meta method []scala.Short; */
+ public short toShort() { return (short)value; }
+
+ /** @meta method []scala.Char; */
+ public char toChar() { return (char)value; }
+
+ /** @meta method []scala.Int; */
+ public int toInt() { return (int)value; }
+
+ /** @meta method []scala.Long; */
+ public long toLong() { return (long)value; }
+
+ /** @meta method []scala.Float; */
+ public float toFloat() { return (float)value; }
+
+ /** @meta method []scala.Double; */
+ public double toDouble() { return (double)value; }
+
/** @meta method (scala.Any)scala.Boolean; */
public boolean $eq$eq (java.lang.Object other) { return equals(other); }
/** @meta method (scala.Any)scala.Boolean; */
diff --git a/sources/scala/Int.java b/sources/scala/Int.java
index 4c8cbd000b..8e0187773f 100644
--- a/sources/scala/Int.java
+++ b/sources/scala/Int.java
@@ -30,6 +30,27 @@ public abstract class Int extends AnyVal implements java.io.Serializable {
return String.valueOf(value);
}
+ /** @meta method []scala.Byte; */
+ public byte toByte() { return (byte)value; }
+
+ /** @meta method []scala.Short; */
+ public short toShort() { return (short)value; }
+
+ /** @meta method []scala.Char; */
+ public char toChar() { return (char)value; }
+
+ /** @meta method []scala.Int; */
+ public int toInt() { return (int)value; }
+
+ /** @meta method []scala.Long; */
+ public long toLong() { return (long)value; }
+
+ /** @meta method []scala.Float; */
+ public float toFloat() { return (float)value; }
+
+ /** @meta method []scala.Double; */
+ public double toDouble() { return (double)value; }
+
/** @meta method (scala.Any)scala.Boolean; */
public boolean $eq$eq (java.lang.Object other) { return equals(other); }
/** @meta method (scala.Any)scala.Boolean; */
diff --git a/sources/scala/Long.java b/sources/scala/Long.java
index 721be0d116..d3425fb75b 100644
--- a/sources/scala/Long.java
+++ b/sources/scala/Long.java
@@ -30,6 +30,27 @@ public abstract class Long extends AnyVal implements java.io.Serializable {
return String.valueOf(value);
}
+ /** @meta method []scala.Byte; */
+ public byte toByte() { return (byte)value; }
+
+ /** @meta method []scala.Short; */
+ public short toShort() { return (short)value; }
+
+ /** @meta method []scala.Char; */
+ public char toChar() { return (char)value; }
+
+ /** @meta method []scala.Int; */
+ public int toInt() { return (int)value; }
+
+ /** @meta method []scala.Long; */
+ public long toLong() { return (long)value; }
+
+ /** @meta method []scala.Float; */
+ public float toFloat() { return (float)value; }
+
+ /** @meta method []scala.Double; */
+ public double toDouble() { return (double)value; }
+
/** @meta method (scala.Any)scala.Boolean; */
public boolean $eq$eq (java.lang.Object other) { return equals(other); }
/** @meta method (scala.Any)scala.Boolean; */
diff --git a/sources/scala/Predef.scala b/sources/scala/Predef.scala
index f8e62aa12b..14c365f461 100644
--- a/sources/scala/Predef.scala
+++ b/sources/scala/Predef.scala
@@ -317,28 +317,28 @@ object Predef {
}
def view(x: String): Seq[Char] = string2seq(x);
- implicit def byte2short(x: byte): short = x.coerce;
- implicit def byte2int(x: byte): int = x.coerce;
- implicit def byte2long(x: byte): long = x.coerce;
- implicit def byte2float(x: byte): float = x.coerce;
- implicit def byte2double(x: byte): double = x.coerce;
-
- implicit def short2int(x: short): int = x.coerce;
- implicit def short2long(x: short): long = x.coerce;
- implicit def short2float(x: short): float = x.coerce;
- implicit def short2double(x: short): double = x.coerce;
-
- implicit def char2int(x: char): int = x.coerce;
- implicit def char2long(x: char): long = x.coerce;
- implicit def char2float(x: char): float = x.coerce;
- implicit def char2double(x: char): double = x.coerce;
-
- implicit def int2long(x: int): long = x.coerce;
- implicit def int2float(x: int): float = x.coerce;
- implicit def int2double(x: int): double = x.coerce;
-
- implicit def long2float(x: long): float = x.coerce;
- implicit def long2double(x: long): double = x.coerce;
-
- implicit def float2double(x: float): double = x.coerce;
+ implicit def byte2short(x: byte): short = x.toShort;
+ implicit def byte2int(x: byte): int = x.toInt;
+ implicit def byte2long(x: byte): long = x.toLong;
+ implicit def byte2float(x: byte): float = x.toFloat;
+ implicit def byte2double(x: byte): double = x.toDouble;
+
+ implicit def short2int(x: short): int = x.toInt;
+ implicit def short2long(x: short): long = x.toLong;
+ implicit def short2float(x: short): float = x.toFloat;
+ implicit def short2double(x: short): double = x.toDouble;
+
+ implicit def char2int(x: char): int = x.toInt;
+ implicit def char2long(x: char): long = x.toLong;
+ implicit def char2float(x: char): float = x.toFloat;
+ implicit def char2double(x: char): double = x.toDouble;
+
+ implicit def int2long(x: int): long = x.toLong;
+ implicit def int2float(x: int): float = x.toFloat;
+ implicit def int2double(x: int): double = x.toDouble;
+
+ implicit def long2float(x: long): float = x.toFloat;
+ implicit def long2double(x: long): double = x.toDouble;
+
+ implicit def float2double(x: float): double = x.toDouble;
}
diff --git a/sources/scala/Short.java b/sources/scala/Short.java
index a959b5083e..b704fb88ed 100644
--- a/sources/scala/Short.java
+++ b/sources/scala/Short.java
@@ -30,6 +30,27 @@ public abstract class Short extends AnyVal implements java.io.Serializable {
return String.valueOf(value);
}
+ /** @meta method []scala.Byte; */
+ public byte toByte() { return (byte)value; }
+
+ /** @meta method []scala.Short; */
+ public short toShort() { return (short)value; }
+
+ /** @meta method []scala.Char; */
+ public char toChar() { return (char)value; }
+
+ /** @meta method []scala.Int; */
+ public int toInt() { return (int)value; }
+
+ /** @meta method []scala.Long; */
+ public long toLong() { return (long)value; }
+
+ /** @meta method []scala.Float; */
+ public float toFloat() { return (float)value; }
+
+ /** @meta method []scala.Double; */
+ public double toDouble() { return (double)value; }
+
/** @meta method (scala.Any)scala.Boolean; */
public boolean $eq$eq (java.lang.Object other) { return equals(other); }
/** @meta method (scala.Any)scala.Boolean; */
diff --git a/sources/scala/tools/nsc/symtab/Definitions.scala b/sources/scala/tools/nsc/symtab/Definitions.scala
index 7063f47987..6e6cf21cb1 100755
--- a/sources/scala/tools/nsc/symtab/Definitions.scala
+++ b/sources/scala/tools/nsc/symtab/Definitions.scala
@@ -256,6 +256,10 @@ import Flags._;
/** Is symbol a value class? */
def isValueClass(sym: Symbol): boolean = boxedClass contains sym;
+ /** Is symbol a value class? */
+ def isNumericValueClass(sym: Symbol): boolean =
+ isValueClass(sym) && sym != BooleanClass && sym != UnitClass;
+
/** Is symbol a value or array class? */
def isUnboxedClass(sym: Symbol): boolean = isValueClass(sym) || sym == ArrayClass;
diff --git a/sources/scala/tools/nsc/transform/Erasure.scala b/sources/scala/tools/nsc/transform/Erasure.scala
index 30c5ddb43b..d0b362fab4 100755
--- a/sources/scala/tools/nsc/transform/Erasure.scala
+++ b/sources/scala/tools/nsc/transform/Erasure.scala
@@ -151,6 +151,13 @@ abstract class Erasure extends AddInterfaces with typechecker.Analyzer {
}
}
+ /** The method-name xxxValue, where Xxx is a numeric value class name */
+ def unboxOp(tp: Type) = {
+ val clazzName = tp.symbol.name.toString();
+ String.valueOf((clazzName.charAt(0) + ('a' - 'A')).asInstanceOf[char]) +
+ clazzName.substring(1) + "Value"
+ }
+
/** Unbox `tree' of boxed type to expected type `pt' */
private def unbox(tree: Tree, pt: Type): Tree =
typed {
@@ -172,12 +179,9 @@ abstract class Erasure extends AddInterfaces with typechecker.Analyzer {
else Literal(signature(pt));
Apply(Select(tree1, "unbox"), List(elemTag))
} else {
+ assert(isNumericValueClass(pt.symbol));
val tree1 = adaptToType(tree, BoxedNumberClass.tpe);
- val unboxedName = pt.symbol.name.toString();
- val unboxOp =
- String.valueOf((unboxedName.charAt(0) + ('a' - 'A')).asInstanceOf[char]) +
- unboxedName.substring(1) + "Value";
- Apply(Select(tree1, unboxOp), List())
+ Apply(Select(tree1, unboxOp(pt)), List())
}
}
}
@@ -235,6 +239,15 @@ abstract class Erasure extends AddInterfaces with typechecker.Analyzer {
atPos(tree.pos) {
Typed(Apply(Select(New(TypeTree(BoxedAnyArrayClass.tpe)), name), args), tpt)
}
+ case Apply(TypeApply(sel @ Select(qual, name), List(targ)), List()) =>
+ if ((tree.symbol == Any_asInstanceOf || tree.symbol == Any_asInstanceOfErased) &&
+ isValueClass(targ.tpe.symbol)) {
+ val qual1 = typedQualifier(qual);
+ if (isNumericValueClass(qual1.tpe.symbol) && isNumericValueClass(targ.tpe.symbol))
+ // convert numeric type casts
+ atPos(tree.pos)(Apply(Select(qual1, "to" + targ.tpe.symbol.name), List()))
+ else unbox(qual1, targ.tpe)
+ } else tree
case Select(qual, name) if (name != nme.CONSTRUCTOR) =>
if (tree.symbol == Any_asInstanceOf || tree.symbol == Any_asInstanceOfErased)
adaptMember(atPos(tree.pos)(Select(qual, Object_asInstanceOf)))
@@ -476,8 +489,8 @@ abstract class Erasure extends AddInterfaces with typechecker.Analyzer {
case AliasTypeDef(_, _, _, _) =>
EmptyTree
case TypeApply(fun, args) if (fun.symbol.owner != AnyClass) =>
- // leave type tests/type casts, remove all other type applications
- fun
+ // leave all other type tests/type casts, remove all other type applications
+ fun
case Template(parents, body) =>
assert(!currentOwner.isImplClass);
//System.out.println("checking no dble defs " + tree);//DEBUG
diff --git a/sources/scala/tools/nsc/transform/LambdaLift.scala b/sources/scala/tools/nsc/transform/LambdaLift.scala
index 21f13e39c0..201f2941fd 100755
--- a/sources/scala/tools/nsc/transform/LambdaLift.scala
+++ b/sources/scala/tools/nsc/transform/LambdaLift.scala
@@ -321,21 +321,27 @@ abstract class LambdaLift extends InfoTransform {
postTransform(super.transform(tree) setType lifted(tree.tpe));
}
/** Transform statements and add lifted definitions to them. */
- override def transformStats(stats: List[Tree], exprOwner: Symbol): List[Tree] =
- for (val stat <- super.transformStats(stats, exprOwner)) yield {
- stat match {
- case ClassDef(mods, name, tparams, tpt, impl @ Template(parents, body))
- if (liftedDefs(stat.symbol).hasNext) =>
- copy.ClassDef(stat, mods, name, tparams, tpt,
- copy.Template(impl, parents, body ::: liftedDefs(stat.symbol).toList))
- case _ =>
- stat
- }
+ override def transformStats(stats: List[Tree], exprOwner: Symbol): List[Tree] = {
+ def addLifted(stat: Tree): Tree = stat match {
+ case ClassDef(mods, name, tparams, tpt, impl @ Template(parents, body)) =>
+ val result =
+ if (liftedDefs(stat.symbol).hasNext) {
+ val lifted = liftedDefs(stat.symbol).toList map addLifted;
+ copy.ClassDef(stat, mods, name, tparams, tpt,
+ copy.Template(impl, parents, body ::: lifted))
+ } else stat;
+ liftedDefs -= stat.symbol;
+ result
+ case _ =>
+ stat
}
+ super.transformStats(stats, exprOwner) map addLifted
+ }
override def transformUnit(unit: CompilationUnit): unit = {
computeFreeVars;
- atPhase(phase.next)(super.transformUnit(unit))
+ atPhase(phase.next)(super.transformUnit(unit));
+ assert(liftedDefs.size == 0, liftedDefs.keys.toList)
}
}
}
diff --git a/sources/scala/tools/nsc/transform/Mixin.scala b/sources/scala/tools/nsc/transform/Mixin.scala
index a0eccb0e64..9f960a9d70 100755
--- a/sources/scala/tools/nsc/transform/Mixin.scala
+++ b/sources/scala/tools/nsc/transform/Mixin.scala
@@ -349,7 +349,7 @@ abstract class Mixin extends InfoTransform {
if (sym.isMethod) {
assert(sym hasFlag (LIFTED | BRIDGE), sym);
val sym1 = toInterface(qual.tpe).member(sym.name);
- assert(sym1 != NoSymbol, "" + sym + " " + toInterface(qual.tpe));//debug
+ assert(sym1 != NoSymbol, sym);//debug
assert(!(sym1 hasFlag OVERLOADED), sym);//debug
tree setSymbol sym1
} else {