
jas.BootstrapMethodsAttribute Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of jasmin Show documentation
Show all versions of jasmin Show documentation
Java Assembler Interface for the Soot framework
package jas;
import java.io.DataOutputStream;
import java.io.IOException;
import java.util.ArrayList;
public class BootstrapMethodsAttribute {
static CP attr = new AsciiCP("BootstrapMethods");
short attr_length = 0;
short num = 0;
ArrayList> list = new ArrayList>();
int addEntry(MethodHandleCP bsm, CP[] argCPs) {
int i=0;
//search for existing equal entry
for (Pair pair : list) {
MethodHandleCP mh = pair.getO1();
CP[] args = pair.getO2();
if(mh.uniq.equals(bsm.uniq)) {
boolean equal = true;
for (int j = 0; j < args.length; j++) {
CP arg = args[j];
CP otherArg = argCPs[j];
if(!arg.uniq.equals(otherArg.uniq)) {
equal = false;
break;
}
}
if(equal) return i;
}
i++;
}
//none found
//add to end
list.add(new Pair(bsm,argCPs));
return list.size()-1;
}
void resolve(ClassEnv e){
e.addCPItem(attr);
}
void write(ClassEnv e, DataOutputStream out)
throws IOException, jasError {
out.writeShort(e.getCPIndex(attr)); //u2 name;
out.writeInt(size()); //u4 size;
out.writeShort(list.size()); //u2 bootstrap_method_count;
for (Pair pair : list) {
out.writeShort(e.getCPIndex(pair.getO1())); //u2 bootstrap_method_ref;
CP[] cps = pair.getO2();
out.writeShort(cps.length);//u2 bootstrap_argument_count;
for (CP cp : cps) {
out.writeShort(e.getCPIndex(cp)); //u2 bootstrap_arguments[bootstrap_argument_count];
}
}
}
int size() {
// u2 bootstrap_method_count;
int size = 2;
for (Pair pair : list) {
// u2 bootstrap_method_ref; // index to CONSTANT_MethodHandle
// u2 bootstrap_argument_count;
size+=4;
size+= pair.getO2().length*2; //args
}
return size;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy