diff options
author | Martin Odersky <odersky@gmail.com> | 2005-06-09 18:45:48 +0000 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2005-06-09 18:45:48 +0000 |
commit | 4ae459ef755dccc8230a884bf6f462c4dadc96b8 (patch) | |
tree | 3d27d19a37680d452c4b52b84e809174a86fba5f /sources/scala/tools/nsc/typechecker/ConstantFolder.scala | |
parent | d7499538cc0da7beb331a4550b7a6e85cd132876 (diff) | |
download | scala-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-x | sources/scala/tools/nsc/typechecker/ConstantFolder.scala | 275 |
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); } |