nhatminhle / cofoja

Contracts for Java
GNU Lesser General Public License v3.0
151 stars 18 forks source link

Instrumentation crashes when using old in both Ensures and ThrowEnsures #47

Closed vesalvojdani closed 8 years ago

vesalvojdani commented 8 years ago

Here is a simplified test case:

import com.google.java.contract.*;
public class Test {
    @Ensures("old(true)")
    @ThrowEnsures({ "RuntimeException", "old(true)" })
    public static void main(String[] arg) { }
}

I get the following stack trace (using version 6347fae9e08f3a3b303d5c0f4db2b3e135710cbd):

[com.google.java.contract:agent FATAL ERROR while instrumenting Test (stack trace follows)]
java.lang.ArrayIndexOutOfBoundsException: 1
    at com.google.java.contract.core.agent.SpecificationMethodAdapter.allocateOldValues(SpecificationMethodAdapter.java:336)
    at com.google.java.contract.core.agent.SpecificationMethodAdapter.onMethodEnter(SpecificationMethodAdapter.java:207)
    at org.objectweb.asm.commons.AdviceAdapter.visitCode(Unknown Source)
    at org.objectweb.asm.ClassReader.b(Unknown Source)
    at org.objectweb.asm.ClassReader.accept(Unknown Source)
    at org.objectweb.asm.ClassReader.accept(Unknown Source)
    at com.google.java.contract.core.agent.ContractClassFileTransformer.instrumentWithContracts(ContractClassFileTransformer.java:391)
    at com.google.java.contract.core.agent.ContractClassFileTransformer.transform(ContractClassFileTransformer.java:277)
    at sun.instrument.TransformerManager.transform(TransformerManager.java:188)
    at sun.instrument.InstrumentationImpl.transform(InstrumentationImpl.java:428)
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:760)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
    at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:495)
nhatminhle commented 8 years ago

Thanks for the report and sorry for the delay. This should be fixed in c2070febb1ff11479b6703648e742392d99f8ba2 .

Cheers