From ef6771bfc802e3dfc415a2fcaf7c0f6a0a9d9dcc Mon Sep 17 00:00:00 2001 From: Martin Odersky Date: Wed, 19 Oct 2005 08:19:42 +0000 Subject: *** empty log message *** --- sources/scala/Byte.java | 21 ++++++++++ sources/scala/Char.java | 21 ++++++++++ sources/scala/Double.java | 21 ++++++++++ sources/scala/Float.java | 21 ++++++++++ sources/scala/Int.java | 21 ++++++++++ sources/scala/Long.java | 21 ++++++++++ sources/scala/Predef.scala | 48 +++++++++++----------- sources/scala/Short.java | 21 ++++++++++ sources/scala/tools/nsc/symtab/Definitions.scala | 4 ++ sources/scala/tools/nsc/transform/Erasure.scala | 27 ++++++++---- sources/scala/tools/nsc/transform/LambdaLift.scala | 28 ++++++++----- sources/scala/tools/nsc/transform/Mixin.scala | 2 +- 12 files changed, 213 insertions(+), 43 deletions(-) (limited to 'sources') 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 { -- cgit v1.2.3