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 TypeDescriptor extends java.lang.Object {
// Declared in BytecodeDescriptor.jrag at line 244
private BytecodeParser p;
// Declared in BytecodeDescriptor.jrag at line 245
private String descriptor;
// Declared in BytecodeDescriptor.jrag at line 246
public TypeDescriptor(BytecodeParser parser, String descriptor) {
p = parser;
this.descriptor = descriptor;
}
// Declared in BytecodeDescriptor.jrag at line 251
public boolean isBoolean() {
return descriptor.charAt(0) == 'Z';
}
// Declared in BytecodeDescriptor.jrag at line 255
public Access type() {
return type(descriptor);
}
// Declared in BytecodeDescriptor.jrag at line 259
public Access type(String s) {
char c = s.charAt(0);
switch (c) {
case 'B':
return new PrimitiveTypeAccess("byte");
case 'C':
return new PrimitiveTypeAccess("char");
case 'D':
return new PrimitiveTypeAccess("double");
case 'F':
return new PrimitiveTypeAccess("float");
case 'I':
return new PrimitiveTypeAccess("int");
case 'J':
return new PrimitiveTypeAccess("long");
case 'S':
return new PrimitiveTypeAccess("short");
case 'Z':
return new PrimitiveTypeAccess("boolean");
case 'L':
return this.p.fromClassName(s.substring(1, s.length() - 1));
case '[':
return new ArrayTypeAccess(type(s.substring(1)));
case 'V':
return new PrimitiveTypeAccess("void");
default:
this.p.println("Error: unknown type in TypeDescriptor");
throw new Error("Error: unknown Type in TypeDescriptor: " + s);
}
//return null;
}
// Declared in BytecodeDescriptor.jrag at line 291
public List parameterList() {
List list = new List();
String s = descriptor;
while(!s.equals("")) {
s = typeList(s, list);
}
return list;
}
// Declared in BytecodeDescriptor.jrag at line 299
public List parameterListSkipFirst() {
List list = new List();
String s = descriptor;
if(!s.equals(""))
s = typeList(s, new List()); // skip first
while(!s.equals("")) {
s = typeList(s, list);
}
return list;
}
// Declared in BytecodeDescriptor.jrag at line 310
public String typeList(String s, List l) {
char c = s.charAt(0);
switch (c) {
case 'B':
l.add(new ParameterDeclaration(new Modifiers(),
new PrimitiveTypeAccess("byte"), "p" + l.getNumChildNoTransform()));
return s.substring(1);
case 'C':
l.add(new ParameterDeclaration(new Modifiers(),
new PrimitiveTypeAccess("char"), "p" + l.getNumChildNoTransform()));
return s.substring(1);
case 'D':
l.add(new ParameterDeclaration(new Modifiers(),
new PrimitiveTypeAccess("double"), "p" + l.getNumChildNoTransform()));
return s.substring(1);
case 'F':
l.add(new ParameterDeclaration(new Modifiers(),
new PrimitiveTypeAccess("float"), "p" + l.getNumChildNoTransform()));
return s.substring(1);
case 'I':
l.add(new ParameterDeclaration(new Modifiers(),
new PrimitiveTypeAccess("int"), "p" + l.getNumChildNoTransform()));
return s.substring(1);
case 'J':
l.add(new ParameterDeclaration(new Modifiers(),
new PrimitiveTypeAccess("long"), "p" + l.getNumChildNoTransform()));
return s.substring(1);
case 'S':
l.add(new ParameterDeclaration(new Modifiers(),
new PrimitiveTypeAccess("short"), "p" + l.getNumChildNoTransform()));
return s.substring(1);
case 'Z':
l.add(new ParameterDeclaration(new Modifiers(),
new PrimitiveTypeAccess("boolean"), "p" + l.getNumChildNoTransform()));
return s.substring(1);
case 'L':
int pos = s.indexOf(';');
String s1 = s.substring(1, pos);
String s2 = s.substring(pos+1, s.length());
l.add(new ParameterDeclaration(new Modifiers(),
this.p.fromClassName(s1),
"p" + l.getNumChildNoTransform()));
return s2;
case '[':
int i = 1;
while(s.charAt(i) == '[') i++;
ArrayTypeAccess bottom = new ArrayTypeAccess(new ParseName("")); // dummy name is replaced later
ArrayTypeAccess top = bottom;
for(int j = 0; j < i - 1; j++)
top = new ArrayTypeAccess(top);
l.add(new ParameterDeclaration(new Modifiers(), top, "p" + l.getNumChild()));
return arrayTypeList(s.substring(i), bottom);
default:
this.p.println("Error: unknown Type \"" + c + "\" in TypeDescriptor");
throw new Error("Error: unknown Type in TypeDescriptor: " + s);
}
//return "";
}
// Declared in BytecodeDescriptor.jrag at line 370
public String arrayTypeList(String s, ArrayTypeAccess typeAccess) {
char c = s.charAt(0);
switch (c) {
case 'B':
typeAccess.setAccess(new PrimitiveTypeAccess("byte"));
return s.substring(1);
case 'C':
typeAccess.setAccess(new PrimitiveTypeAccess("char"));
return s.substring(1);
case 'D':
typeAccess.setAccess(new PrimitiveTypeAccess("double"));
return s.substring(1);
case 'F':
typeAccess.setAccess(new PrimitiveTypeAccess("float"));
return s.substring(1);
case 'I':
typeAccess.setAccess(new PrimitiveTypeAccess("int"));
return s.substring(1);
case 'J':
typeAccess.setAccess(new PrimitiveTypeAccess("long"));
return s.substring(1);
case 'S':
typeAccess.setAccess(new PrimitiveTypeAccess("short"));
return s.substring(1);
case 'Z':
typeAccess.setAccess(new PrimitiveTypeAccess("boolean"));
return s.substring(1);
case 'L':
//String[] strings = s.substring(1).split("\\;", 2);
//typeAccess.setAccess(this.p.fromClassName(strings[0]));
//return strings[1];
int pos = s.indexOf(';');
String s1 = s.substring(1, pos);
String s2 = s.substring(pos+1, s.length());
typeAccess.setAccess(this.p.fromClassName(s1));
return s2;
default:
this.p.println("Error: unknown Type in TypeDescriptor");
throw new Error("Error: unknown Type in TypeDescriptor: " + s);
}
//return null;
}
}