diff options
author | schinz <schinz@epfl.ch> | 2003-08-25 15:02:02 +0000 |
---|---|---|
committer | schinz <schinz@epfl.ch> | 2003-08-25 15:02:02 +0000 |
commit | 5a25b6cfc1b32ee809420767769d68c8dd74da1c (patch) | |
tree | 81d750bd509c5a6f84e503adb8af2341cebe0f14 /sources | |
parent | ba17480ab2c61075133f896be22e539ec554c82d (diff) | |
download | scala-5a25b6cfc1b32ee809420767769d68c8dd74da1c.tar.gz scala-5a25b6cfc1b32ee809420767769d68c8dd74da1c.tar.bz2 scala-5a25b6cfc1b32ee809420767769d68c8dd74da1c.zip |
- implemented new Switch node (warning, unteste...
- implemented new Switch node (warning, untested code, I'm waiting for
test cases)
Diffstat (limited to 'sources')
-rw-r--r-- | sources/scalac/backend/jvm/GenJVM.java | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/sources/scalac/backend/jvm/GenJVM.java b/sources/scalac/backend/jvm/GenJVM.java index 1e49389425..b55bedd46b 100644 --- a/sources/scalac/backend/jvm/GenJVM.java +++ b/sources/scalac/backend/jvm/GenJVM.java @@ -483,6 +483,25 @@ class GenJVM { generatedType = finalType; } break; + case Switch(Tree test, int[] tags, Tree[] bodies, Tree otherwise): { + JLabel[] labels = new JLabel[bodies.length]; + for (int i = 0; i < labels.length; ++i) labels[i] = new JLabel(); + JLabel defaultLabel = new JLabel(); + JLabel afterLabel = new JLabel(); + + genLoad(ctx, test, JType.INT); + ctx.code.emitSWITCH(tags, labels, defaultLabel, 0.9F); + for (int i = 0; i < bodies.length; ++i) { + ctx.code.anchorLabelToNext(labels[i]); + genLoad(ctx, bodies[i], expectedType); + ctx.code.emitGOTO(afterLabel); + } + ctx.code.anchorLabelToNext(defaultLabel); + genLoad(ctx, otherwise, expectedType); + ctx.code.anchorLabelToNext(afterLabel); + generatedType = expectedType; + } break; + case This(_): case Super(_, _): ctx.code.emitALOAD_0(); |