summaryrefslogtreecommitdiff
path: root/sources/scala/tools/nsc/typechecker/ConstantFolder.scala
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2005-06-09 18:45:48 +0000
committerMartin Odersky <odersky@gmail.com>2005-06-09 18:45:48 +0000
commit4ae459ef755dccc8230a884bf6f462c4dadc96b8 (patch)
tree3d27d19a37680d452c4b52b84e809174a86fba5f /sources/scala/tools/nsc/typechecker/ConstantFolder.scala
parentd7499538cc0da7beb331a4550b7a6e85cd132876 (diff)
downloadscala-4ae459ef755dccc8230a884bf6f462c4dadc96b8.tar.gz
scala-4ae459ef755dccc8230a884bf6f462c4dadc96b8.tar.bz2
scala-4ae459ef755dccc8230a884bf6f462c4dadc96b8.zip
Repository : /home/cvslamp/repositories/scala
Module : scala Working dir: ~/scala/ In directory .: Unknown META-INF Unknown Test.symbl Unknown VERSION-1.1.0-b1 Unknown collection Unknown expr.exe.stackdump Unknown importing Unknown iq.symbl Unknown java.io.Writer Unknown make Unknown rm Unknown scalac.symtab.Symbol Unknown testcast Unknown x Unknown xmake Unknown y Unknown z In directory bin: Unknown bin/dtd2scala.lnk Unknown bin/scala-debug.lnk Unknown bin/scala-info.lnk Unknown bin/scala.lnkMa Unknown bin/scalac-debug.lnk Unknown bin/scalac.lnk Unknown bin/scaladoc-debug.lnk Unknown bin/scaladoc.lnk Unknown bin/scalaint-debug.lnk Unknown bin/scalaint.lnk Unknown bin/scalap.lnk Unknown bin/scalarun-debug.lnk Unknown bin/scalarun.lnk Unknown bin/scalatest.lnk In directory config: In directory config/list: Modified config/list/nsc.lst In directory doc: Unknown doc/announcement.txt In directory doc/papers: Message: cvs update: cannot open directory /home/cvslamp/repositories/scala/scala/doc/papers: No such file or directory Message: cvs update: skipping directory doc/papers In directory doc/reference: Unknown doc/reference/R1.tex Unknown doc/reference/ScalaReference.tex.1 Unknown doc/reference/ScalaReference.tex.new Unknown doc/reference/ScalaVersion.tex Unknown doc/reference/lecture.tex Unknown doc/reference/math.sty Unknown doc/reference/modefs.sty Unknown doc/reference/prooftree.sty Unknown doc/reference/sbe-talk.tex Unknown doc/reference/scaladefs.sty Unknown doc/reference/scaladefs.tex Unknown doc/reference/scaladoc.sty Unknown doc/reference/tweaklist.sty Unknown doc/reference/vquote.sty Unknown doc/reference/x In directory doc/reports: Message: cvs update: cannot open directory /home/cvslamp/repositories/scala/scala/doc/reports: No such file or directory Message: cvs update: skipping directory doc/reports In directory doc/talks: Message: cvs update: cannot open directory /home/cvslamp/repositories/scala/scala/doc/talks: No such file or directory Message: cvs update: skipping directory doc/talks In directory sources: Unknown sources/new Unknown sources/scala.zip Unknown sources/scalac.own Unknown sources/ziDeLBjS In directory sources/examples: Unknown sources/examples/BibTree.scala Unknown sources/examples/BibTree1.scala Unknown sources/examples/BinTree.scala Unknown sources/examples/concurrent Unknown sources/examples/epl Unknown sources/examples/epl.zip Unknown sources/examples/examples Unknown sources/examples/fs Unknown sources/examples/graphs.scala Unknown sources/examples/implicit Unknown sources/examples/interpreters.scala Unknown sources/examples/parsers2a.scala Unknown sources/examples/parsers3.scala Unknown sources/examples/pubsub.scala Unknown sources/examples/pubsub.scala.notyet Unknown sources/examples/pubsub1.scala Unknown sources/examples/shapes.scala Unknown sources/examples/stacks.scala Unknown sources/examples/teletrans.scala Unknown sources/examples/teletrans1.scala Unknown sources/examples/xpath.scala Unknown sources/examples/xpath1.scala In directory sources/examples/expressions: Unknown sources/examples/expressions/abstract-data-1.scala Unknown sources/examples/expressions/abstract-data-2.scala Unknown sources/examples/expressions/abstract-data-mixin-1.scala Unknown sources/examples/expressions/abstract-data-mixin-bad.scala Unknown sources/examples/expressions/abstract-data-mixin-neg.scala Unknown sources/examples/expressions/abstract-data-mixin.scala Unknown sources/examples/expressions/abstract-data.scala Unknown sources/examples/expressions/abstract-operation-1.scala Unknown sources/examples/expressions/abstract-operation-2.scala Unknown sources/examples/expressions/abstract-operation-mixin.scala Unknown sources/examples/expressions/abstract-operation.scala Unknown sources/examples/expressions/expressions-constr-abstypes.scala Unknown sources/examples/expressions/expressions-oo.scala Unknown sources/examples/expressions/expressions-visitors.scala Unknown sources/examples/expressions/expressions-visitos.scala Unknown sources/examples/expressions/generic-data.scala Unknown sources/examples/expressions/generic-operation-factory.scala Unknown sources/examples/expressions/generic-operation-simple.scala Unknown sources/examples/expressions/generic-operation.scala Unknown sources/examples/expressions/scala Unknown sources/examples/expressions/test Unknown sources/examples/expressions/x In directory sources/scala: Unknown sources/scala/$colon$colon.scala.disabled Unknown sources/scala/.latest-compiler Unknown sources/scala/Array.java.notyet Unknown sources/scala/ArrayIterator.java.notyet Modified sources/scala/CaseClass.scala Modified sources/scala/List.scala Unknown sources/scala/NoValue Unknown sources/scala/ScalaObject.scala Unknown sources/scala/bootclasses Unknown sources/scala/cls Unknown sources/scala/new Unknown sources/scala/newclasses Unknown sources/scala/nsc-build Unknown sources/scala/nsc-build.bat Unknown sources/scala/nscnew Unknown sources/scala/nscnew.bat Unknown sources/scala/nx Unknown sources/scala/old Unknown sources/scala/ox Unknown sources/scala/predef Unknown sources/scala/scala.Ordered![a!])scala.Ordered![scala.List![a!]] Unknown sources/scala/test.scala Unknown sources/scala/x In directory sources/scala/runtime: Unknown sources/scala/runtime/CaseOps.scala In directory sources/scala/tools: Unknown sources/scala/tools/nsc.zip Unknown sources/scala/tools/nsc1 Unknown sources/scala/tools/nscnew In directory sources/scala/tools/nsc: Modified sources/scala/tools/nsc/Global.scala Modified sources/scala/tools/nsc/Phase.scala Added sources/scala/tools/nsc/SubComponent.scala Unknown sources/scala/tools/nsc/typechecker.new In directory sources/scala/tools/nsc/ast: Modified sources/scala/tools/nsc/ast/TreeGen.scala Modified sources/scala/tools/nsc/ast/Trees.scala In directory sources/scala/tools/nsc/ast/parser: Modified sources/scala/tools/nsc/ast/parser/Parsers.scala Modified sources/scala/tools/nsc/ast/parser/Scanners.scala Added sources/scala/tools/nsc/ast/parser/SyntaxAnalyzer.scala Modified sources/scala/tools/nsc/ast/parser/Tokens.scala Modified sources/scala/tools/nsc/ast/parser/TreeBuilder.scala In directory sources/scala/tools/nsc/matching: Modified sources/scala/tools/nsc/matching/PatternUtil.scala In directory sources/scala/tools/nsc/symtab: Modified sources/scala/tools/nsc/symtab/Definitions.scala Modified sources/scala/tools/nsc/symtab/Flags.scala Modified sources/scala/tools/nsc/symtab/Names.scala Modified sources/scala/tools/nsc/symtab/Scopes.scala Modified sources/scala/tools/nsc/symtab/StdNames.scala Modified sources/scala/tools/nsc/symtab/SymbolTable.scala Modified sources/scala/tools/nsc/symtab/Symbols.scala Modified sources/scala/tools/nsc/symtab/Types.scala In directory sources/scala/tools/nsc/symtab/classfile: Modified sources/scala/tools/nsc/symtab/classfile/ClassfileConstants.scala Modified sources/scala/tools/nsc/symtab/classfile/PickleFormat.scala Modified sources/scala/tools/nsc/symtab/classfile/Pickler.scala In directory sources/scala/tools/nsc/transform: Modified sources/scala/tools/nsc/transform/SampleTransform.scala Modified sources/scala/tools/nsc/transform/Transform.scala Removed sources/scala/tools/nsc/transform/TypesAsValues.scala In directory sources/scala/tools/nsc/typechecker: Modified sources/scala/tools/nsc/typechecker/Analyzer.scala Modified sources/scala/tools/nsc/typechecker/Contexts.scala Modified sources/scala/tools/nsc/typechecker/Infer.scala Modified sources/scala/tools/nsc/typechecker/Namers.scala Added sources/scala/tools/nsc/typechecker/RefChecks.scala Modified sources/scala/tools/nsc/typechecker/TreeCheckers.scala Modified sources/scala/tools/nsc/typechecker/Typers.scala In directory sources/scala/xml: In directory sources/scala/xml/parsing: Modified sources/scala/xml/parsing/MarkupHandler.scala Modified sources/scala/xml/parsing/MarkupParser.scala In directory sources/scalac: In directory sources/scalac/symtab: In directory sources/scalac/symtab/classfile: Unknown sources/scalac/symtab/classfile/PackageParser.java.1 In directory test: Unknown test/absobs.scala Unknown test/attr.scala Unknown test/bug363.scala Unknown test/mixin.scala Unknown test/nsc Unknown test/nsc.scala Unknown test/nsc1.scala Unknown test/nsc2.scala Unknown test/sabin.scala Unknown test/sabin2.scala Unknown test/selftypes.scala Unknown test/single.scala Unknown test/testmatch.scala In directory test/files: Unknown test/files/bug320.scala In directory test/files/neg: Unknown test/files/neg/bug356.check Unknown test/files/neg/bug356.scala Unknown test/files/neg/bug363.check Unknown test/files/neg/bug363.scala Unknown test/files/neg/bug369.check Unknown test/files/neg/bug369.scala Unknown test/files/neg/bug370.check Unknown test/files/neg/bug370.scala Unknown test/files/neg/bug373.check Unknown test/files/neg/bug373.scala Unknown test/files/neg/bug375.check Unknown test/files/neg/bug375.scala Unknown test/files/neg/escapes.scala Unknown test/files/neg/test In directory test/files/pos: Unknown test/files/pos/A.symbl Unknown test/files/pos/B.symbl Unknown test/files/pos/C.symbl Unknown test/files/pos/D.symbl Unknown test/files/pos/O.symbl Unknown test/files/pos/S.symbl Unknown test/files/pos/T.symbl Unknown test/files/pos/arrays2.symbl Unknown test/files/pos/bug348plus.scala Unknown test/files/pos/lists.symbl Unknown test/files/pos/main.symbl Unknown test/files/pos/test.symbl In directory test/new: Message: cvs update: cannot open directory /home/cvslamp/repositories/scala/scala/test/new: No such file or directory Message: cvs update: skipping directory test/new In directory test/pos: Unknown test/pos/valparams.scala Unknown test/pos/vincent.scala In directory website: Message: cvs update: cannot open directory /home/cvslamp/repositories/scala/scala/website: No such file or directory Message: cvs update: skipping directory website --------------------- End --------------------- -- last cmd: cvs -f update -d -P --
Diffstat (limited to 'sources/scala/tools/nsc/typechecker/ConstantFolder.scala')
-rwxr-xr-xsources/scala/tools/nsc/typechecker/ConstantFolder.scala275
1 files changed, 111 insertions, 164 deletions
diff --git a/sources/scala/tools/nsc/typechecker/ConstantFolder.scala b/sources/scala/tools/nsc/typechecker/ConstantFolder.scala
index 3a78775393..7883246424 100755
--- a/sources/scala/tools/nsc/typechecker/ConstantFolder.scala
+++ b/sources/scala/tools/nsc/typechecker/ConstantFolder.scala
@@ -11,187 +11,134 @@ abstract class ConstantFolder {
import global._;
import definitions._;
- private val NoValue = new Object();
-
/** If tree is a constant operation, replace with result. */
def apply(tree: Tree): Tree = fold(tree, tree match {
case Apply(Select(Literal(x), op), List(Literal(y))) => foldBinop(op, x, y)
case Select(Literal(x), op) => foldUnop(op, x)
- case _ => NoValue
+ case _ => null
});
/** If tree is a constant value that can be converted to type `pt', perform the conversion */
def apply(tree: Tree, pt: Type): Tree = fold(tree, tree.tpe match {
- case ConstantType(base, value) => foldTyped(value, pt)
- case _ => NoValue
+ case ConstantType(x) => x convertTo pt
+ case _ => null
});
- private def fold(tree: Tree, value: Any): Tree =
- if (value != NoValue && value != ()) tree setType ConstantType(literalType(value), value)
- else tree;
+ private def fold(tree: Tree, x: Constant): Tree =
+ if (x != null && x.tag != UnitTag) tree setType ConstantType(x) else tree;
- private def foldUnop(op: Name, value: Any): Any = Pair(op, value) match {
- case Pair(nme.ZNOT, x: boolean) => !x
+ private def foldUnop(op: Name, x: Constant): Constant = Pair(op, x.tag) match {
+ case Pair(nme.ZNOT, BooleanTag) => Constant(!x.booleanValue)
- case Pair(nme.NOT , x: int ) => ~x
- case Pair(nme.NOT , x: long ) => ~x
+ case Pair(nme.NOT , IntTag ) => Constant(~x.intValue)
+ case Pair(nme.NOT , LongTag ) => Constant(~x.longValue)
- case Pair(nme.ADD , x: int ) => +x
- case Pair(nme.ADD , x: long ) => +x
- case Pair(nme.ADD , x: float ) => +x
- case Pair(nme.ADD , x: double ) => +x
+ case Pair(nme.ADD , IntTag ) => Constant(+x.intValue)
+ case Pair(nme.ADD , LongTag ) => Constant(+x.longValue)
+ case Pair(nme.ADD , FloatTag ) => Constant(+x.floatValue)
+ case Pair(nme.ADD , DoubleTag ) => Constant(+x.doubleValue)
- case Pair(nme.SUB , x: int ) => -x
- case Pair(nme.SUB , x: long ) => -x
- case Pair(nme.SUB , x: float ) => -x
- case Pair(nme.SUB , x: double ) => -x
+ case Pair(nme.SUB , IntTag ) => Constant(-x.intValue)
+ case Pair(nme.SUB , LongTag ) => Constant(-x.longValue)
+ case Pair(nme.SUB , FloatTag ) => Constant(-x.floatValue)
+ case Pair(nme.SUB , DoubleTag ) => Constant(-x.doubleValue)
- case _ => NoValue
+ case _ => null
}
- private def foldBinop(op: Name, lvalue: Any, rvalue: Any): Any = Triple(op, lvalue, rvalue) match {
- case Triple(nme.ZOR , x: boolean, y: boolean) => x | y
- case Triple(nme.OR , x: boolean, y: boolean) => x | y
- case Triple(nme.OR , x: int , y: int ) => x | y
- case Triple(nme.OR , x: long , y: long ) => x | y
-
- case Triple(nme.XOR , x: boolean, y: boolean) => x ^ y
- case Triple(nme.XOR , x: int , y: int ) => x ^ y
- case Triple(nme.XOR , x: long , y: long ) => x ^ y
-
- case Triple(nme.ZAND, x: boolean, y: boolean) => x & y
- case Triple(nme.AND , x: boolean, y: boolean) => x & y
- case Triple(nme.AND , x: int , y: int ) => x & y
- case Triple(nme.AND , x: long , y: long ) => x & y
-
- case Triple(nme.LSL , x: int , y: int ) => x << y
- case Triple(nme.LSL , x: long , y: int ) => x << y
- case Triple(nme.LSL , x: long , y: long ) => x << y
-
- case Triple(nme.LSR , x: int , y: int ) => x >>> y
- case Triple(nme.LSR , x: long , y: int ) => x >>> y
- case Triple(nme.LSR , x: long , y: long ) => x >>> y
-
- case Triple(nme.ASR , x: int , y: int ) => x >> y
- case Triple(nme.ASR , x: long , y: int ) => x >> y
- case Triple(nme.ASR , x: long , y: long ) => x >> y
-
- case Triple(nme.EQ , x: boolean, y: boolean) => x == y
- case Triple(nme.EQ , x: int , y: int ) => x == y
- case Triple(nme.EQ , x: long , y: long ) => x == y
- case Triple(nme.EQ , x: float , y: float ) => x == y
- case Triple(nme.EQ , x: double , y: double ) => x == y
-
- case Triple(nme.NE , x: boolean, y: boolean) => x != y
- case Triple(nme.NE , x: int , y: int ) => x != y
- case Triple(nme.NE , x: long , y: long ) => x != y
- case Triple(nme.NE , x: float , y: float ) => x != y
- case Triple(nme.NE , x: double , y: double ) => x != y
-
- case Triple(nme.LT , x: int , y: int ) => x < y
- case Triple(nme.LT , x: long , y: long ) => x < y
- case Triple(nme.LT , x: float , y: float ) => x < y
- case Triple(nme.LT , x: double , y: double ) => x < y
-
- case Triple(nme.GT , x: int , y: int ) => x > y
- case Triple(nme.GT , x: long , y: long ) => x > y
- case Triple(nme.GT , x: float , y: float ) => x > y
- case Triple(nme.GT , x: double , y: double ) => x > y
-
- case Triple(nme.LE , x: int , y: int ) => x <= y
- case Triple(nme.LE , x: long , y: long ) => x <= y
- case Triple(nme.LE , x: float , y: float ) => x <= y
- case Triple(nme.LE , x: double , y: double ) => x <= y
-
- case Triple(nme.GE , x: int , y: int ) => x >= y
- case Triple(nme.GE , x: long , y: long ) => x >= y
- case Triple(nme.GE , x: float , y: float ) => x >= y
- case Triple(nme.GE , x: double , y: double ) => x >= y
-
- case Triple(nme.ADD , x: int , y: int ) => x + y
- case Triple(nme.ADD , x: long , y: long ) => x + y
- case Triple(nme.ADD , x: float , y: float ) => x + y
- case Triple(nme.ADD , x: double , y: double ) => x + y
- case Triple(nme.ADD , x: String , y: String ) => x + y
-
- case Triple(nme.SUB , x: int , y: int ) => x - y
- case Triple(nme.SUB , x: long , y: long ) => x - y
- case Triple(nme.SUB , x: float , y: float ) => x - y
- case Triple(nme.SUB , x: double , y: double ) => x - y
-
- case Triple(nme.MUL , x: int , y: int ) => x * y
- case Triple(nme.MUL , x: long , y: long ) => x * y
- case Triple(nme.MUL , x: float , y: float ) => x * y
- case Triple(nme.MUL , x: double , y: double ) => x * y
-
- case Triple(nme.DIV , x: int , y: int ) => x / y
- case Triple(nme.DIV , x: long , y: long ) => x / y
- case Triple(nme.DIV , x: float , y: float ) => x / y
- case Triple(nme.DIV , x: double , y: double ) => x / y
-
- case Triple(nme.MOD , x: int , y: int ) => x % y
- case Triple(nme.MOD , x: long , y: long ) => x % y
- case Triple(nme.MOD , x: float , y: float ) => x % y
- case Triple(nme.MOD , x: double , y: double ) => x % y
-
- case _ => NoValue
- }
-
- /** Widen constant value to conform to given type */
- private def foldTyped(value: Any, pt: Type): Any = {
- val target = pt.symbol;
- value match {
- case x: byte =>
- if (target == ShortClass) x.asInstanceOf[short]
- else if (target == CharClass) x.asInstanceOf[char]
- else if (target == IntClass) x.asInstanceOf[int]
- else if (target == LongClass) x.asInstanceOf[long]
- else if (target == FloatClass) x.asInstanceOf[float]
- else if (target == DoubleClass) x.asInstanceOf[double]
- else NoValue
- case x: short =>
- if (target == IntClass) x.asInstanceOf[int]
- else if (target == LongClass) x.asInstanceOf[long]
- else if (target == FloatClass) x.asInstanceOf[float]
- else if (target == DoubleClass) x.asInstanceOf[double]
- else NoValue
- case x: char =>
- if (target == IntClass) x.asInstanceOf[int]
- else if (target == LongClass) x.asInstanceOf[long]
- else if (target == FloatClass) x.asInstanceOf[float]
- else if (target == DoubleClass) x.asInstanceOf[double]
- else NoValue
- case x: int =>
- if (target == ByteClass && -128 <= x && x <= 127) x.asInstanceOf[byte]
- else if (target == ShortClass && -32768 <= x && x <= 32767) x.asInstanceOf[short]
- else if (target == CharClass && 0 <= x && x <= 65535) x.asInstanceOf[char]
- else if (target == LongClass) x.asInstanceOf[long]
- else if (target == FloatClass) x.asInstanceOf[float]
- else if (target == DoubleClass) x.asInstanceOf[double]
- else NoValue
- case x: long =>
- if (target == FloatClass) x.asInstanceOf[float]
- else if (target == DoubleClass) x.asInstanceOf[double]
- else NoValue
- case x: float =>
- if (target == DoubleClass) x.asInstanceOf[double]
- else NoValue
- case x =>
- NoValue
+ private def foldBinop(op: Name, x: Constant, y: Constant): Constant = {
+ val optag = if (x.tag > y.tag) x.tag else y.tag;
+ optag match {
+ case BooleanTag =>
+ op match {
+ case nme.ZOR => Constant(x.booleanValue | y.booleanValue)
+ case nme.OR => Constant(x.booleanValue | y.booleanValue)
+ case nme.XOR => Constant(x.booleanValue ^ y.booleanValue)
+ case nme.ZAND => Constant(x.booleanValue & y.booleanValue)
+ case nme.AND => Constant(x.booleanValue & y.booleanValue)
+ case nme.EQ => Constant(x.booleanValue == y.booleanValue)
+ case nme.NE => Constant(x.booleanValue != y.booleanValue)
+ case _ => null
+ }
+ case ByteTag | ShortTag | LongTag | IntTag =>
+ op match {
+ case nme.OR => Constant(x.intValue | y.intValue)
+ case nme.XOR => Constant(x.intValue ^ y.intValue)
+ case nme.AND => Constant(x.intValue & y.intValue)
+ case nme.LSL => Constant(x.intValue << y.intValue)
+ case nme.LSR => Constant(x.intValue >>> y.intValue)
+ case nme.ASR => Constant(x.intValue >> y.intValue)
+ case nme.EQ => Constant(x.intValue == y.intValue)
+ case nme.NE => Constant(x.intValue != y.intValue)
+ case nme.LT => Constant(x.intValue < y.intValue)
+ case nme.GT => Constant(x.intValue > y.intValue)
+ case nme.LE => Constant(x.intValue <= y.intValue)
+ case nme.GE => Constant(x.intValue >= y.intValue)
+ case nme.ADD => Constant(x.intValue + y.intValue)
+ case nme.SUB => Constant(x.intValue - y.intValue)
+ case nme.MUL => Constant(x.intValue * y.intValue)
+ case nme.DIV => Constant(x.intValue / y.intValue)
+ case nme.MOD => Constant(x.intValue % y.intValue)
+ case _ => null
+ }
+ case LongTag =>
+ op match {
+ case nme.OR => Constant(x.longValue | y.longValue)
+ case nme.XOR => Constant(x.longValue ^ y.longValue)
+ case nme.AND => Constant(x.longValue & y.longValue)
+ case nme.LSL => Constant(x.longValue << y.longValue)
+ case nme.LSR => Constant(x.longValue >>> y.longValue)
+ case nme.ASR => Constant(x.longValue >> y.longValue)
+ case nme.EQ => Constant(x.longValue == y.longValue)
+ case nme.NE => Constant(x.longValue != y.longValue)
+ case nme.LT => Constant(x.longValue < y.longValue)
+ case nme.GT => Constant(x.longValue > y.longValue)
+ case nme.LE => Constant(x.longValue <= y.longValue)
+ case nme.GE => Constant(x.longValue >= y.longValue)
+ case nme.ADD => Constant(x.longValue + y.longValue)
+ case nme.SUB => Constant(x.longValue - y.longValue)
+ case nme.MUL => Constant(x.longValue * y.longValue)
+ case nme.DIV => Constant(x.longValue / y.longValue)
+ case nme.MOD => Constant(x.longValue % y.longValue)
+ case _ => null
+ }
+ case FloatTag =>
+ op match {
+ case nme.EQ => Constant(x.floatValue == y.floatValue)
+ case nme.NE => Constant(x.floatValue != y.floatValue)
+ case nme.LT => Constant(x.floatValue < y.floatValue)
+ case nme.GT => Constant(x.floatValue > y.floatValue)
+ case nme.LE => Constant(x.floatValue <= y.floatValue)
+ case nme.GE => Constant(x.floatValue >= y.floatValue)
+ case nme.ADD => Constant(x.floatValue + y.floatValue)
+ case nme.SUB => Constant(x.floatValue - y.floatValue)
+ case nme.MUL => Constant(x.floatValue * y.floatValue)
+ case nme.DIV => Constant(x.floatValue / y.floatValue)
+ case nme.MOD => Constant(x.floatValue % y.floatValue)
+ case _ => null
+ }
+ case DoubleTag =>
+ op match {
+ case nme.EQ => Constant(x.doubleValue == y.doubleValue)
+ case nme.NE => Constant(x.doubleValue != y.doubleValue)
+ case nme.LT => Constant(x.doubleValue < y.doubleValue)
+ case nme.GT => Constant(x.doubleValue > y.doubleValue)
+ case nme.LE => Constant(x.doubleValue <= y.doubleValue)
+ case nme.GE => Constant(x.doubleValue >= y.doubleValue)
+ case nme.ADD => Constant(x.doubleValue + y.doubleValue)
+ case nme.SUB => Constant(x.doubleValue - y.doubleValue)
+ case nme.MUL => Constant(x.doubleValue * y.doubleValue)
+ case nme.DIV => Constant(x.doubleValue / y.doubleValue)
+ case nme.MOD => Constant(x.doubleValue % y.doubleValue)
+ case _ => null
+ }
+ case StringTag =>
+ op match {
+ case nme.ADD => Constant(x.stringValue + y.stringValue)
+ case _ => null
+ }
+ case _ =>
+ null
}
}
-
- def literalType(value: Any): Type =
- if (value.isInstanceOf[unit]) UnitClass.tpe
- else if (value.isInstanceOf[boolean]) BooleanClass.tpe
- else if (value.isInstanceOf[byte]) ByteClass.tpe
- else if (value.isInstanceOf[short]) ShortClass.tpe
- else if (value.isInstanceOf[char]) CharClass.tpe
- else if (value.isInstanceOf[int]) IntClass.tpe
- else if (value.isInstanceOf[long]) LongClass.tpe
- else if (value.isInstanceOf[float]) FloatClass.tpe
- else if (value.isInstanceOf[double]) DoubleClass.tpe
- else if (value.isInstanceOf[String]) StringClass.tpe
- else if (value == null) AllRefClass.tpe
- else throw new FatalError("unexpected literal value: " + value);
}