diff --git a/src/main/java/leon/codegen/runtime/Tuple.java b/src/main/java/leon/codegen/runtime/Tuple.java index 93ed1403275bfb1c4962f65ea0c7b763fe015b6f..c8f46923bdd47184264cf8ac73ce5a6b757de4fd 100644 --- a/src/main/java/leon/codegen/runtime/Tuple.java +++ b/src/main/java/leon/codegen/runtime/Tuple.java @@ -7,8 +7,8 @@ public final class Tuple { private Object[] elements; // You may think that using varargs here would show less of the internals, - // however the bytecode to generate is exactly the same, so let's reflect - // the reality instead. + // however the bytecode is exactly the same, so let's reflect the reality + // instead. public Tuple(int arity, Object[] elements) { this.arity = arity; this.elements = Arrays.copyOf(elements, elements.length); diff --git a/src/main/scala/leon/codegen/CodeGeneration.scala b/src/main/scala/leon/codegen/CodeGeneration.scala index 422e17778530083135c2216710687ad1c494c3db..b585b5b1c36573d939be3b499379d59be3c19f94 100644 --- a/src/main/scala/leon/codegen/CodeGeneration.scala +++ b/src/main/scala/leon/codegen/CodeGeneration.scala @@ -79,6 +79,24 @@ object CodeGeneration { ch << instr mkExpr(b, ch)(env.withVars(Map(i -> slot))) + case LetTuple(is,d,b) => + mkExpr(d, ch) // the tuple + var count = 0 + val withSlots = is.map(i => (i, ch.getFreshVar)) + for((i,s) <- withSlots) { + ch << DUP + ch << Ldc(count) + ch << InvokeVirtual(TupleClass, "get", "(I)Ljava/lang/Object;") + mkUnbox(i.getType, ch) + val instr = i.getType match { + case Int32Type | BooleanType => IStore(s) + case _ => AStore(s) + } + ch << instr + count += 1 + } + mkExpr(b, ch)(env.withVars(withSlots.toMap)) + case IntLiteral(v) => ch << Ldc(v) diff --git a/src/test/resources/regression/codegen/purescala/Prog003.scala b/src/test/resources/regression/codegen/purescala/Prog003.scala index 69236b64e2cdc59502125fbd8e78346ba6405323..82958305781e8e1efad738720f0cf5f30ff0e6b0 100644 --- a/src/test/resources/regression/codegen/purescala/Prog003.scala +++ b/src/test/resources/regression/codegen/purescala/Prog003.scala @@ -5,4 +5,10 @@ object Prog003 { def fst(t : (Int,Boolean)) : Int = t._1 def snd(t : (Int,Boolean)) : Boolean = t._2 + + def swap(t : (Int,Boolean)) : (Boolean,Int) = { + val (i,b) = t + + (b,i) + } }