summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBurak Emir <emir@epfl.ch>2006-09-12 11:22:53 +0000
committerBurak Emir <emir@epfl.ch>2006-09-12 11:22:53 +0000
commit6387971d97fe6706369b54719f4a749d52ad84e5 (patch)
tree38660ea0d7012c82a2c52e4c90d0ea8fc6ba838a /src
parentdc97215ec989aa4739c18aa74fa8f2ead78402f4 (diff)
downloadscala-6387971d97fe6706369b54719f4a749d52ad84e5.tar.gz
scala-6387971d97fe6706369b54719f4a749d52ad84e5.tar.bz2
scala-6387971d97fe6706369b54719f4a749d52ad84e5.zip
fix intswitch
Diffstat (limited to 'src')
-rw-r--r--src/compiler/scala/tools/nsc/matching/PatternMatchers.scala72
1 files changed, 37 insertions, 35 deletions
diff --git a/src/compiler/scala/tools/nsc/matching/PatternMatchers.scala b/src/compiler/scala/tools/nsc/matching/PatternMatchers.scala
index c24433af7d..d7ec803ac6 100644
--- a/src/compiler/scala/tools/nsc/matching/PatternMatchers.scala
+++ b/src/compiler/scala/tools/nsc/matching/PatternMatchers.scala
@@ -81,8 +81,6 @@ trait PatternMatchers requires (transform.ExplicitOuter with PatternNodes) {
Ident(root.symbol).setType(root.tpe));
//Konsole.println("resultType = "+resultType);
//this.optimize = this.optimize && (settings.target.value == "jvm");
- if(settings.statistics.value)
- Console.println("could remove "+(nremoved+nsubstituted)+" ValDefs, "+nremoved+" by deleting and "+nsubstituted+" by substitution")
}
// ---
@@ -738,8 +736,8 @@ trait PatternMatchers requires (transform.ExplicitOuter with PatternNodes) {
//////////// generator methods
- def toTree(): Tree =
- if (optimize && isSimpleIntSwitch())
+ def toTree(): Tree = {
+ val t = if (optimize && isSimpleIntSwitch())
intSwitchToTree()
// else if (false && optimize && isSimpleSwitch())
// switchToTree()
@@ -747,7 +745,10 @@ trait PatternMatchers requires (transform.ExplicitOuter with PatternNodes) {
//print()
generalSwitchToTree()
}
-
+ if(settings.statistics.value)
+ Console.println("could remove "+(nremoved+nsubstituted)+" ValDefs, "+nremoved+" by deleting and "+nsubstituted+" by substitution")
+ return t
+ }
case class Break(res:Boolean) extends java.lang.Throwable
case class Break2() extends java.lang.Throwable
@@ -814,6 +815,7 @@ trait PatternMatchers requires (transform.ExplicitOuter with PatternNodes) {
while (({node = node.or; node}) != null) {
node match {
case ConstantPat(_) => ;
+ case DefaultPat() => // experimental: enable simple int switch with default
case _ =>
return false;
}
@@ -912,8 +914,9 @@ trait PatternMatchers requires (transform.ExplicitOuter with PatternNodes) {
while (node != null) {
node match {
case DefaultPat() =>
- if (defaultBody1 != null)
- scala.Predef.error("not your day today");
+ //experimental: allow default body
+ //if (defaultBody1 != null)
+ // scala.Predef.error("not your day today");
defaultBody1 = node.and.bodyToTree();
node = node.or;
@@ -1177,7 +1180,7 @@ trait PatternMatchers requires (transform.ExplicitOuter with PatternNodes) {
}
theRef = handleOuter(theRef)
- if(node.getTpe().decls.lookup(nme.OUTER) != NoSymbol) { // some guys don't have outers :-(
+ if(node.getTpe().decls.lookup(nme.OUTER) != NoSymbol) { // some guys don't have outers
cond = And(cond,
Eq(Apply(Select(
gen.mkAsInstanceOf(selector.duplicate, node.getTpe(), true), nme.OUTER),List()), theRef))
@@ -1187,34 +1190,35 @@ trait PatternMatchers requires (transform.ExplicitOuter with PatternNodes) {
}
}
return myIf(cond,
- Block(
- List(ValDef(casted,
- gen.mkAsInstanceOf(selector.duplicate, node.getTpe(), true))),
- toTree(node.and)),
+ squeezedBlock(Block(
+ List(ValDef(casted,
+ gen.mkAsInstanceOf(selector.duplicate, node.getTpe(), true))),
+ toTree(node.and))),
toTree(node.or, selector.duplicate));
+
case SequencePat(casted, len) =>
return (
- Or(
- And(
- And(gen.mkIsInstanceOf(selector.duplicate, node.getTpe()),
- Equals(
- typed(
- Apply(
- Select(
- gen.mkAsInstanceOf(selector.duplicate,
- node.getTpe(),
- true),
- node.getTpe().member(nme.length) /*defs.Seq_length*/),
- List())
- ),
- typed(
- Literal(Constant(len))
- ))),
- Block(
- List(
- ValDef(casted,
- gen.mkAsInstanceOf(selector.duplicate, node.getTpe(), true))),
- toTree(node.and))),
+ Or(
+ And(
+ And(gen.mkIsInstanceOf(selector.duplicate, node.getTpe()),
+ Equals(
+ typed(
+ Apply(
+ Select(
+ gen.mkAsInstanceOf(selector.duplicate,
+ node.getTpe(),
+ true),
+ node.getTpe().member(nme.length) /*defs.Seq_length*/),
+ List())
+ ),
+ typed(
+ Literal(Constant(len))
+ ))),
+ squeezedBlock(Block(
+ List(
+ ValDef(casted,
+ gen.mkAsInstanceOf(selector.duplicate, node.getTpe(), true))),
+ toTree(node.and)))),
toTree(node.or, selector.duplicate)));
case RightIgnoringSequencePat(casted, castedRest, minlen) =>
@@ -1256,8 +1260,6 @@ trait PatternMatchers requires (transform.ExplicitOuter with PatternNodes) {
toTree(node.or, selector.duplicate));
case ConstantPat(value) =>
- //Console.println("selector = "+selector);
- //Console.println("selector.tpe = "+selector.tpe);
return myIf(Equals(selector.duplicate,
typed(Literal(Constant(value))).setType(node.tpe)),
toTree(node.and),