Bug 71273 - RuntimeException thrown: Could not find instruction: org.apache.bcel.generic.B2I
Summary: RuntimeException thrown: Could not find instruction: org.apache.bcel.generic.B2I
Status: RESOLVED FIXED
Alias: None
Product: AspectJ
Classification: Tools
Component: Compiler (show other bugs)
Version: 1.2   Edit
Hardware: PC Windows XP
: P3 normal (vote)
Target Milestone: 1.2.1   Edit
Assignee: Adrian Colyer CLA
QA Contact:
URL:
Whiteboard:
Keywords:
Depends on:
Blocks:
 
Reported: 2004-08-03 06:53 EDT by Matthew Webster CLA
Modified: 2004-10-21 04:31 EDT (History)
0 users

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
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