use of net.runelite.asm.attributes.annotation.Annotation in project runelite by runelite.
the class ClassFile method accept.
public void accept(ClassVisitor visitor) {
String[] ints = interfaces.getInterfaces().stream().map(i -> i.getName()).toArray(String[]::new);
visitor.visit(version, access, name.getName(), null, super_class.getName(), ints);
visitor.visitSource(source, null);
for (Annotation annotation : annotations.getAnnotations()) {
AnnotationVisitor av = visitor.visitAnnotation(annotation.getType().toString(), true);
annotation.accept(av);
}
for (Field field : fields) {
FieldVisitor fv = visitor.visitField(field.getAccessFlags(), field.getName(), field.getType().toString(), null, field.getValue());
field.accept(fv);
}
for (Method method : methods) {
String[] exceptions = method.getExceptions().getExceptions().stream().map(cl -> cl.getName()).toArray(String[]::new);
if (exceptions.length == 0) {
exceptions = null;
}
MethodVisitor mv = visitor.visitMethod(method.getAccessFlags(), method.getName(), method.getDescriptor().toString(), null, exceptions);
method.accept(mv);
}
visitor.visitEnd();
}
use of net.runelite.asm.attributes.annotation.Annotation in project runelite by runelite.
the class Method method accept.
public void accept(MethodVisitor visitor) {
for (Annotation annotation : annotations.getAnnotations()) {
AnnotationVisitor av = visitor.visitAnnotation(annotation.getType().toString(), true);
annotation.accept(av);
}
if (code != null) {
code.getInstructions().rebuildLabels();
visitor.visitCode();
net.runelite.asm.attributes.code.Exceptions exceptions = code.getExceptions();
for (net.runelite.asm.attributes.code.Exception exception : exceptions.getExceptions()) {
assert exception.getStart().getLabel() != null;
assert exception.getEnd().getLabel() != null;
assert exception.getHandler().getLabel() != null;
int idxStart = code.getInstructions().getInstructions().indexOf(exception.getStart());
int idxEnd = code.getInstructions().getInstructions().indexOf(exception.getEnd());
assert idxStart != -1;
assert idxEnd != -1;
assert code.getInstructions().getInstructions().contains(exception.getHandler());
assert idxEnd > idxStart;
visitor.visitTryCatchBlock(exception.getStart().getLabel(), exception.getEnd().getLabel(), exception.getHandler().getLabel(), exception.getCatchType() != null ? exception.getCatchType().getName() : null);
}
for (Instruction i : code.getInstructions().getInstructions()) {
i.accept(visitor);
}
visitor.visitMaxs(code.getMaxStack(), code.getMaxLocals());
}
visitor.visitEnd();
}
use of net.runelite.asm.attributes.annotation.Annotation in project runelite by runelite.
the class AnnotationMapper method copyAnnotations.
private int copyAnnotations(Annotations from, Annotations to) {
int count = 0;
if (from.getAnnotations() == null)
return count;
for (Annotation a : from.getAnnotations()) {
if (isCopyable(a)) {
Annotation annotation = new Annotation(to);
annotation.setType(a.getType());
to.addAnnotation(annotation);
for (Element e : a.getElements()) {
Element element = new Element(annotation);
element.setName(e.getName());
element.setValue(e.getValue());
annotation.addElement(element);
}
++count;
}
}
return count;
}
use of net.runelite.asm.attributes.annotation.Annotation in project runelite by runelite.
the class MappingImporter method makeMappings.
@Test
@Ignore
public void makeMappings() throws IOException {
InjectionModscript mod = Injection.load(MappingImporter.class.getResourceAsStream(RL_INJECTION));
int fields = 0, classes = 0;
for (int i = 0; i < mod.getGetterInjects().size(); ++i) {
GetterInjectInstruction gii = (GetterInjectInstruction) mod.getGetterInjects().get(i);
ClassFile cf = this.findClassWithObfuscatedName(gii.getGetterClassName());
Assert.assertNotNull(cf);
Field f = this.findFieldWithObfuscatedName(cf, gii.getGetterFieldName());
if (f == null) {
// so they don't all exist
continue;
}
String attrName = gii.getGetterName();
attrName = Utils.toExportedName(attrName);
Annotations an = f.getAnnotations();
Annotation a = an.find(EXPORT);
if (a != null) {
String exportedName = a.getElement().getString();
if (!attrName.equals(exportedName)) {
logger.info("Exported field " + f + " with mismatched name. Theirs: " + attrName + ", mine: " + exportedName);
}
} else {
an.addAnnotation(EXPORT, "value", attrName);
logger.info("Exporting field " + f + " with name " + attrName);
++fields;
}
}
for (AddInterfaceInstruction aii : mod.getAddInterfaceInjects()) {
ClassFile cf = this.findClassWithObfuscatedName(aii.getClientClass());
Assert.assertNotNull(cf);
String iface = aii.getInterfaceClass();
iface = iface.replace("com/runeloader/api/bridge/os/accessor/", "");
Annotations an = cf.getAnnotations();
Annotation a = an.find(IMPLEMENTS);
if (a != null) {
String implementsName = a.getElement().getString();
if (!iface.equals(implementsName)) {
logger.info("Implements class " + cf + " with mismatched name. Theirs: " + iface + ", mine: " + implementsName);
}
} else {
an.addAnnotation(IMPLEMENTS, "value", iface);
logger.info("Exporting class " + cf.getName() + " with name " + iface);
++classes;
}
}
logger.info("Added {} fields, {} classes", fields, classes);
}
use of net.runelite.asm.attributes.annotation.Annotation in project runelite by runelite.
the class Inject method getFieldType.
public Type getFieldType(Field f) {
Type type = f.getType();
Annotation obfSignature = f.getAnnotations().find(DeobAnnotations.OBFUSCATED_SIGNATURE);
if (obfSignature != null) {
// Annotation exists. Type was updated by us during deobfuscation
type = DeobAnnotations.getObfuscatedType(f);
}
return type;
}
Aggregations