Bug 71273

Summary: RuntimeException thrown: Could not find instruction: org.apache.bcel.generic.B2I
Product: [Tools] AspectJ Reporter: Matthew Webster <matthew_webster>
Component: CompilerAssignee: Adrian Colyer <adrian.colyer>
Status: RESOLVED FIXED QA Contact:
Severity: normal    
Priority: P3    
Version: 1.2   
Target Milestone: 1.2.1   
Hardware: PC   
OS: Windows XP   
Whiteboard:

Description Matthew Webster CLA 2004-08-03 06:53:41 EDT
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)
Comment 1 Matthew Webster CLA 2004-08-03 07:00:10 EDT
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) {
			
		}
	}
}
Comment 2 Andrew Clement CLA 2004-08-03 08:24:51 EDT
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...
Comment 3 Andrew Clement CLA 2004-08-05 05:43:51 EDT
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.
Comment 4 Andrew Clement CLA 2004-08-06 03:28:14 EDT
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
Comment 5 Adrian Colyer CLA 2004-10-21 04:31:13 EDT
Fix released as part of AspectJ 1.2.1