diff options
author | Grzegorz Kossakowski <grzegorz.kossakowski@gmail.com> | 2012-01-25 18:38:38 +0100 |
---|---|---|
committer | Grzegorz Kossakowski <grzegorz.kossakowski@gmail.com> | 2012-02-01 15:16:20 +0100 |
commit | e311585e26449a921bc8a40b87b2552f1d363086 (patch) | |
tree | 5ea227fdd656dcda661ef050008791aaac06a81d /src/compiler | |
parent | 18d6a9f5054bf7f1c76e48c3eb8da0fb96ccdccb (diff) | |
download | scala-e311585e26449a921bc8a40b87b2552f1d363086.tar.gz scala-e311585e26449a921bc8a40b87b2552f1d363086.tar.bz2 scala-e311585e26449a921bc8a40b87b2552f1d363086.zip |
Unfold pattern alternatives in genicode.
Implemented unfolding of pattern alternatives
that can be translated into switch table in
genicode. This way pattern matcher can keep
simple patterns as-is and let backend handle
translation of them instead of generating
bunch of LabelDefs and jumps.
Review by @dragos or @magarciaEPFL as both
seem to know genicode very well.
Diffstat (limited to 'src/compiler')
-rw-r--r-- | src/compiler/scala/tools/nsc/backend/icode/GenICode.scala | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/src/compiler/scala/tools/nsc/backend/icode/GenICode.scala b/src/compiler/scala/tools/nsc/backend/icode/GenICode.scala index 3d650ef753..3baff7da9e 100644 --- a/src/compiler/scala/tools/nsc/backend/icode/GenICode.scala +++ b/src/compiler/scala/tools/nsc/backend/icode/GenICode.scala @@ -1072,6 +1072,15 @@ abstract class GenICode extends SubComponent { targets = tmpCtx.bb :: targets case Ident(nme.WILDCARD) => default = tmpCtx.bb + case Alternative(alts) => + alts foreach { + case Literal(value) => + tags = value.intValue :: tags + targets = tmpCtx.bb :: targets + case _ => + abort("Invalid case in alternative in switch-like pattern match: " + + tree + " at: " + tree.pos) + } case _ => abort("Invalid case statement in switch-like pattern match: " + tree + " at: " + (tree.pos)) |