package soot.JastAddJ; import java.util.HashSet;import java.util.LinkedHashSet;import java.io.File;import java.util.*;import beaver.*;import java.util.ArrayList;import java.util.zip.*;import java.io.*;import java.io.FileNotFoundException;import java.util.Collection;import soot.*;import soot.util.*;import soot.jimple.*;import soot.coffi.ClassFile;import soot.coffi.method_info;import soot.coffi.CONSTANT_Utf8_info;import soot.tagkit.SourceFileTag;import soot.coffi.CoffiMethodSource; public class MethodInfo extends java.lang.Object { // Declared in BytecodeDescriptor.jrag at line 131 private BytecodeParser p; // Declared in BytecodeDescriptor.jrag at line 132 String name; // Declared in BytecodeDescriptor.jrag at line 133 int flags; // Declared in BytecodeDescriptor.jrag at line 134 private MethodDescriptor methodDescriptor; // Declared in BytecodeDescriptor.jrag at line 135 private Attributes.MethodAttributes attributes; // Declared in BytecodeDescriptor.jrag at line 137 public MethodInfo(BytecodeParser parser) { p = parser; flags = p.u2(); if(BytecodeParser.VERBOSE) p.print(" Flags: " + Integer.toBinaryString(flags)); int name_index = p.u2(); CONSTANT_Info info = p.constantPool[name_index]; if(info == null || !(info instanceof CONSTANT_Utf8_Info)) { System.err.println("Expected CONSTANT_Utf8_Info but found: " + info.getClass().getName()); //if(info instanceof CONSTANT_Class_Info) { // System.err.println(" found CONSTANT_Class_Info: " + ((CONSTANT_Class_Info)info).name()); // name = ((CONSTANT_Class_Info)info).name(); //} } name = ((CONSTANT_Utf8_Info)info).string(); methodDescriptor = new MethodDescriptor(p, name); attributes = new Attributes.MethodAttributes(p); } // Declared in BytecodeDescriptor.jrag at line 155 public BodyDecl bodyDecl() { Signatures.MethodSignature s = attributes.methodSignature; Access returnType = (s != null && s.hasReturnType()) ? s.returnType() : methodDescriptor.type(); List parameterList; if(isConstructor() && p.isInnerClass) { parameterList = methodDescriptor.parameterListSkipFirst(); if(s != null) { Iterator iter = s.parameterTypes().iterator(); if(iter.hasNext()) iter.next(); for(int i = 0; iter.hasNext(); i++) { Access a = (Access)iter.next(); ((ParameterDeclaration)parameterList.getChildNoTransform(i)).setTypeAccess(a); } } } else { parameterList = methodDescriptor.parameterList(); if(s != null) { int i = 0; for(Iterator iter = s.parameterTypes().iterator(); iter.hasNext(); i++) { Access a = (Access)iter.next(); ((ParameterDeclaration)parameterList.getChildNoTransform(i)).setTypeAccess(a); } } } if((flags & Flags.ACC_VARARGS) != 0) { int lastIndex = parameterList.getNumChildNoTransform() - 1; ParameterDeclaration p = (ParameterDeclaration)parameterList.getChildNoTransform(lastIndex); parameterList.setChild( new VariableArityParameterDeclaration( p.getModifiersNoTransform(), ((ArrayTypeAccess)p.getTypeAccessNoTransform()).getAccessNoTransform(), p.getID() ), lastIndex ); } List exceptionList = (s != null && s.hasExceptionList()) ? s.exceptionList() : attributes.exceptionList(); if(attributes.parameterAnnotations != null) { for(int i = 0; i < attributes.parameterAnnotations.length; i++) { ParameterDeclaration p = (ParameterDeclaration)parameterList.getChildNoTransform(i); for(Iterator iter = attributes.parameterAnnotations[i].iterator(); iter.hasNext(); ) { Modifier m = (Modifier)iter.next(); p.getModifiersNoTransform().addModifier(m); } } } BodyDecl b; if(isConstructor()) { b = new ConstructorDecl(BytecodeParser.modifiers(flags), name, parameterList, exceptionList, new Opt(), new Block()); } else if(attributes.elementValue() != null) { b = new AnnotationMethodDecl(BytecodeParser.modifiers(flags), returnType, name, parameterList, exceptionList, new Opt(new Block()), new Opt(attributes.elementValue())); } else if(s != null && s.hasFormalTypeParameters()) { b = new GenericMethodDecl(BytecodeParser.modifiers(flags), returnType, name, parameterList, exceptionList, new Opt(new Block()), s.typeParameters()); } else { b = new MethodDecl(BytecodeParser.modifiers(flags), returnType, name, parameterList, exceptionList, new Opt(new Block())); } if(attributes.annotations != null) { for(Iterator iter = attributes.annotations.iterator(); iter.hasNext(); ) { if(b instanceof MethodDecl) ((MethodDecl)b).getModifiers().addModifier((Modifier)iter.next()); else if(b instanceof ConstructorDecl) ((ConstructorDecl)b).getModifiers().addModifier((Modifier)iter.next()); } } return b; } // Declared in BytecodeDescriptor.jrag at line 233 private boolean isConstructor() { return name.equals("<init>"); } // Declared in BytecodeDescriptor.jrag at line 237 public boolean isSynthetic() { return attributes.isSynthetic() || (flags & 0x1000) != 0; } }