mdahm 2002/11/30 03:16:44
Modified: src/java/org/apache/bcel/generic MethodGen.java
Log:
Bug fixes
Revision Changes Path
1.6 +42 -25 jakarta-bcel/src/java/org/apache/bcel/generic/MethodGen.java
Index: MethodGen.java
===================================================================
RCS file: /home/cvs/jakarta-bcel/src/java/org/apache/bcel/generic/MethodGen.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- MethodGen.java 24 Apr 2002 08:11:30 -0000 1.5
+++ MethodGen.java 30 Nov 2002 11:16:44 -0000 1.6
@@ -122,37 +122,47 @@
setInstructionList(il);
setConstantPool(cp);
- if((access_flags & (Constants.ACC_ABSTRACT | Constants.ACC_NATIVE)) == 0) {
- InstructionHandle start = il.getStart();
- InstructionHandle end = il.getEnd();
+ boolean abstract_ = isAbstract() || isNative();
+ InstructionHandle start = null;
+ InstructionHandle end = null;
+
+ if(!abstract_) {
+ start = il.getStart();
+ end = il.getEnd();
/* Add local variables, namely the implicit `this' and the arguments
*/
- if(!isStatic() && (class_name != null)) // Instance method -> `this' is local var 0
+ if(!isStatic() && (class_name != null)) { // Instance method -> `this' is local var 0
addLocalVariable("this", new ObjectType(class_name), start, end);
+ }
+ }
- if(arg_types != null) {
- int size = arg_types.length;
- for(int i=0; i < size; i++) {
- if(Type.VOID == arg_types[i])
- throw new ClassGenException("'void' is an illegal argument type for a method");
-}
-
- if(arg_names != null) { // Names for variables provided?
- if(size != arg_names.length)
- throw new ClassGenException("Mismatch in argument array lengths: " +
- size + " vs. " + arg_names.length);
- } else { // Give them dummy names
- arg_names = new String[size];
-
- for(int i=0; i < size; i++)
- arg_names[i] = "arg" + i;
+ if(arg_types != null) {
+ int size = arg_types.length;
- setArgumentNames(arg_names);
+ for(int i=0; i < size; i++) {
+ if(Type.VOID == arg_types[i]) {
+ throw new ClassGenException("'void' is an illegal argument type for a method");
}
-
+ }
+
+ if(arg_names != null) { // Names for variables provided?
+ if(size != arg_names.length)
+ throw new ClassGenException("Mismatch in argument array lengths: " +
+ size + " vs. " + arg_names.length);
+ } else { // Give them dummy names
+ arg_names = new String[size];
+
for(int i=0; i < size; i++)
+ arg_names[i] = "arg" + i;
+
+ setArgumentNames(arg_names);
+ }
+
+ if(!abstract_) {
+ for(int i=0; i < size; i++) {
addLocalVariable(arg_names[i], arg_types[i], start, end);
+ }
}
}
}
@@ -217,22 +227,29 @@
if(a instanceof LineNumberTable) {
LineNumber[] ln = ((LineNumberTable)a).getLineNumberTable();
+
for(int k=0; k < ln.length; k++) {
LineNumber l = ln[k];
addLineNumber(il.findHandle(l.getStartPC()), l.getLineNumber());
}
} else if(a instanceof LocalVariableTable) {
LocalVariable[] lv = ((LocalVariableTable)a).getLocalVariableTable();
+
+ removeLocalVariables();
+
for(int k=0; k < lv.length; k++) {
LocalVariable l = lv[k];
InstructionHandle start = il.findHandle(l.getStartPC());
InstructionHandle end = il.findHandle(l.getStartPC() + l.getLength());
// Repair malformed handles
- if(start == null)
+ if(null == start) {
start = il.getStart();
- if(end == null)
+ }
+
+ if(null == end) {
end = il.getEnd();
+ }
addLocalVariable(l.getName(), Type.getType(l.getSignature()),
l.getIndex(), start, end);
lmpx.com only provides a reader for public news (NNTP) servers. It is not
affiliated with the servers or forums shown here and is not responsible for
the content of articles, which is written by their respective authors.