diff --git a/src/main/java/leon/codegen/runtime/CaseClass.java b/src/main/java/leon/codegen/runtime/CaseClass.java new file mode 100644 index 0000000000000000000000000000000000000000..ea27c7853b4fb0f9a2eae287d186a00f73353e42 --- /dev/null +++ b/src/main/java/leon/codegen/runtime/CaseClass.java @@ -0,0 +1,5 @@ +package leon.codegen.runtime; + +public interface CaseClass { + public abstract Object[] productElements(); +} diff --git a/src/main/scala/leon/codegen/CodeGeneration.scala b/src/main/scala/leon/codegen/CodeGeneration.scala index a036dd71b1d6051bcb1578f2af83ff65bf6fe959..031494b1cae80d0f27bd54134fcb9ea63e930acc 100644 --- a/src/main/scala/leon/codegen/CodeGeneration.scala +++ b/src/main/scala/leon/codegen/CodeGeneration.scala @@ -229,6 +229,8 @@ object CodeGeneration { CLASS_ACC_ABSTRACT ).asInstanceOf[U2]) + cf.addInterface("leon/codegen/runtime/CaseClass") + cf.addDefaultConstructor cf.writeToFile(cName + ".class") @@ -280,6 +282,30 @@ object CodeGeneration { cch.freeze } + locally { + val pem = cf.addMethod("[java/lang/Object;", "productElements") + pem.setFlags(( + METHOD_ACC_PUBLIC | + METHOD_ACC_FINAL + ).asInstanceOf[U2]) + + val pech = pem.codeHandler + + pech << Ldc(ccd.fields.size) + pech << NewArray("java/lang/Object") + + for ((f, i) <- ccd.fields.zipWithIndex) { + pech << DUP + pech << Ldc(i) + pech << ALoad(0) + pech << GetField(cName, f.id.name, typeToJVM(f.tpe)) + pech << AASTORE + } + + pech << ARETURN + pech.freeze + } + // definition of equals locally { val emh = cf.addMethod("Z", "equals", "Ljava/lang/Object;") diff --git a/unmanaged/32/cafebabe_2.9.2-1.2.jar b/unmanaged/32/cafebabe_2.9.2-1.2.jar index 66e18c2577b7570e01e67c4f8cdb94eafd934682..419228d2998d13301a9d6594316d2e773b3d0296 100644 Binary files a/unmanaged/32/cafebabe_2.9.2-1.2.jar and b/unmanaged/32/cafebabe_2.9.2-1.2.jar differ diff --git a/unmanaged/64/cafebabe_2.9.2-1.2.jar b/unmanaged/64/cafebabe_2.9.2-1.2.jar index 66e18c2577b7570e01e67c4f8cdb94eafd934682..47ba4d4848e69cb70792570da656c576701949b6 100644 Binary files a/unmanaged/64/cafebabe_2.9.2-1.2.jar and b/unmanaged/64/cafebabe_2.9.2-1.2.jar differ