Community
Participate
Working Groups
Compiler fails when trying to convert a "byte" args() parameter to a "int" pointcut formal when also using an "if()" PCD. java.lang.RuntimeException: Could not find instruction: org.apache.bcel.generic.B2I at org.apache.bcel.generic.InstructionFactory.createCast (InstructionFactory.java:493) at org.aspectj.weaver.bcel.Utility.createConversion(Utility.java:328) at org.aspectj.weaver.bcel.BcelRenderer.renderExpr (BcelRenderer.java:75) at org.aspectj.weaver.bcel.BcelRenderer.visit(BcelRenderer.java:210) at org.aspectj.weaver.ast.Call.accept(Call.java:30) at org.aspectj.weaver.bcel.BcelRenderer.recur(BcelRenderer.java:145) at org.aspectj.weaver.bcel.BcelRenderer.renderTest (BcelRenderer.java:111) at org.aspectj.weaver.bcel.BcelAdvice.getTestInstructions (BcelAdvice.java:342) at org.aspectj.weaver.bcel.BcelAdvice.getAdviceInstructions (BcelAdvice.java:265) at org.aspectj.weaver.bcel.BcelShadow.weaveAfterReturning (BcelShadow.java:1169) at org.aspectj.weaver.bcel.BcelAdvice.implementOn(BcelAdvice.java:135) at org.aspectj.weaver.Shadow.implementMungers(Shadow.java:430) at org.aspectj.weaver.Shadow.implement(Shadow.java:326) at org.aspectj.weaver.bcel.BcelClassWeaver.implement (BcelClassWeaver.java:1153) at org.aspectj.weaver.bcel.BcelClassWeaver.weave (BcelClassWeaver.java:361) at org.aspectj.weaver.bcel.BcelClassWeaver.weave (BcelClassWeaver.java:82) at org.aspectj.weaver.bcel.BcelWeaver.weave(BcelWeaver.java:726) at org.aspectj.weaver.bcel.BcelWeaver.weaveWithoutDump (BcelWeaver.java:691) at org.aspectj.weaver.bcel.BcelWeaver.weaveAndNotify (BcelWeaver.java:617) at org.aspectj.weaver.bcel.BcelWeaver.weave(BcelWeaver.java:565) at org.aspectj.ajdt.internal.compiler.AjCompilerAdapter.weave (AjCompilerAdapter.java:239) at org.aspectj.ajdt.internal.compiler.AjCompilerAdapter.afterCompiling (AjCompilerAdapter.java:114) at org.eclipse.jdt.internal.compiler.Compiler.compile (Compiler.java:376) at org.aspectj.ajdt.internal.core.builder.AjBuildManager.performCompilation (AjBuildManager.java:717) at org.aspectj.ajdt.internal.core.builder.AjBuildManager.doBuild (AjBuildManager.java:170) at org.aspectj.ajdt.internal.core.builder.AjBuildManager.batchBuild (AjBuildManager.java:100) at org.aspectj.ajde.internal.CompilerAdapter.compile (CompilerAdapter.java:108) at org.aspectj.ajde.internal.AspectJBuildManager$CompilerThread.run (AspectJBuildManager.java:169)
public class Company { static final byte DEFAULT_MODE = 0; static final byte RECORDING = 2; static byte mode = DEFAULT_MODE; public static void main (String[] args) { mode = RECORDING; } } public privileged aspect LoggingControl { /* ERROR */ // pointcut startRecording1 (int newMode) : // set(byte Company.mode) && args(newMode) && if(newMode == Company.RECORDING); // // after () returning : startRecording1 (*) { // // } /* OK */ pointcut startRecording2 (byte newMode) : set(byte Company.mode) && args(newMode) && if(newMode == Company.RECORDING); after () returning : startRecording2 (*) { } /* OK */ pointcut startRecording3 (int newMode) : set(byte Company.mode) && args(newMode); after (int newMode) returning : startRecording3 (newMode) { if (newMode == Company.RECORDING) { } } }
The class B2I is 'missing in action'. Its not in our version of BCEL, and it isnt in the apache version of BCEL either. They have lots of type conversions utility classes, all of the form 'X'2'Y' where X and Y are of some type (double/float/inte/byte/char/long). I can see every permutation except B2<anything>. It looks deliberately missed out...
Some instructions don't exist in the JVM. B2I, B2C, B2S - which would (if they did exist...) convert bytes, chars or shorts to ints. According to the JVM spec (3.11.4 'Type Conversion Instructions' in my copy), it says: "Note that widening numeric conversions do not exist from integral types byte, char, and short to type int. As noted in 3.11.1, values of type byte, char and short are internally widened to type int, making these conversions implicit." So, I modified org.aspectj.weaver.bcel.Utility.createConversion() to be aware of this rule, and if the source type is byte/char/short and the target type is int then we don't look for a conversion instruction. Will close bug when fix available in build.
Fix available: BUILD COMPLETE - build.327 Date of build: 08/05/2004 17:51:19 Time to build: 93 minutes 33 seconds Last changed: 08/05/2004 17:20:15 Latest good AspectJ jar available at: download.eclipse.org/technology/ajdt/dev/aspectj-DEVELOPMENT.jar
Fix released as part of AspectJ 1.2.1