cvs commit: jakarta-bcel/src/java/org/apache/bcel/generic MethodGen.java

[email protected]
Newsgroups gmane.comp.jakarta.bcel.devel
Message-ID <[email protected]>
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.