mirror of
https://github.com/zaaarf/lillero-processor.git
synced 2024-11-22 15:04:50 +01:00
fix: map descriptors too
This commit is contained in:
parent
4215780e0d
commit
dac2510de7
3 changed files with 57 additions and 4 deletions
|
@ -63,11 +63,12 @@ public class FieldContainer {
|
||||||
throw new AmbiguousDefinitionException("Cannot use name-based lookups for fields of unverifiable classes!");
|
throw new AmbiguousDefinitionException("Cannot use name-based lookups for fields of unverifiable classes!");
|
||||||
this.elem = null;
|
this.elem = null;
|
||||||
this.name = name;
|
this.name = name;
|
||||||
this.descriptor = descriptor;
|
this.descriptor = mapper == null ? descriptor : mapper.obfuscateMethodDescriptor(descriptor);
|
||||||
} else {
|
} else {
|
||||||
this.elem = (VariableElement) findMember(parent, name, descriptor, descriptor != null, true);
|
this.elem = (VariableElement) findMember(parent, name, descriptor, descriptor != null, true);
|
||||||
this.name = this.elem.getSimpleName().toString();
|
this.name = this.elem.getSimpleName().toString();
|
||||||
this.descriptor = descriptorFromType(this.elem.asType());
|
String validatedDescriptor = descriptorFromType(this.elem.asType());
|
||||||
|
this.descriptor = mapper == null ? descriptor : mapper.obfuscateMethodDescriptor(validatedDescriptor);
|
||||||
}
|
}
|
||||||
this.nameObf = findMemberName(parent.fqnObf, name, descriptor, mapper);
|
this.nameObf = findMemberName(parent.fqnObf, name, descriptor, mapper);
|
||||||
}
|
}
|
||||||
|
|
|
@ -67,11 +67,12 @@ public class MethodContainer {
|
||||||
throw new AmbiguousDefinitionException("Cannot use name-based lookups for methods of unverifiable classes!");
|
throw new AmbiguousDefinitionException("Cannot use name-based lookups for methods of unverifiable classes!");
|
||||||
this.elem = null;
|
this.elem = null;
|
||||||
this.name = name;
|
this.name = name;
|
||||||
this.descriptor = descriptor;
|
this.descriptor = mapper == null ? descriptor : mapper.obfuscateMethodDescriptor(descriptor);
|
||||||
} else {
|
} else {
|
||||||
this.elem = (ExecutableElement) findMember(parent, name, descriptor, descriptor != null && strict, false);
|
this.elem = (ExecutableElement) findMember(parent, name, descriptor, descriptor != null && strict, false);
|
||||||
this.name = this.elem.getSimpleName().toString();
|
this.name = this.elem.getSimpleName().toString();
|
||||||
this.descriptor = descriptorFromExecutableElement(this.elem);
|
String validatedDescriptor = descriptorFromExecutableElement(this.elem);
|
||||||
|
this.descriptor = mapper == null ? descriptor : mapper.obfuscateMethodDescriptor(validatedDescriptor);
|
||||||
}
|
}
|
||||||
this.nameObf = findMemberName(parent.fqnObf, name, descriptor, mapper);
|
this.nameObf = findMemberName(parent.fqnObf, name, descriptor, mapper);
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,6 +2,8 @@ package ftbsc.lll.processor.tools.obfuscation;
|
||||||
|
|
||||||
import ftbsc.lll.exceptions.AmbiguousDefinitionException;
|
import ftbsc.lll.exceptions.AmbiguousDefinitionException;
|
||||||
import ftbsc.lll.exceptions.MappingNotFoundException;
|
import ftbsc.lll.exceptions.MappingNotFoundException;
|
||||||
|
import ftbsc.lll.tools.DescriptorBuilder;
|
||||||
|
import org.objectweb.asm.Type;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -93,6 +95,55 @@ public class ObfuscationMapper {
|
||||||
return member;
|
return member;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Obfuscates a method descriptor, replacing its class references
|
||||||
|
* with their obfuscated counterparts.
|
||||||
|
* @param descriptor a {@link String} containing the descriptor
|
||||||
|
* @return the obfuscated descriptor
|
||||||
|
* @since 0.5.1
|
||||||
|
*/
|
||||||
|
public String obfuscateMethodDescriptor(String descriptor) {
|
||||||
|
Type method = Type.getMethodType(descriptor);
|
||||||
|
Type[] arguments = method.getArgumentTypes();
|
||||||
|
Type returnType = method.getReturnType();
|
||||||
|
|
||||||
|
Type[] obfArguments = new Type[arguments.length];
|
||||||
|
for(int i = 0; i < obfArguments.length; i++)
|
||||||
|
obfArguments[i] = this.obfuscateType(arguments[i]);
|
||||||
|
|
||||||
|
return Type.getMethodDescriptor(this.obfuscateType(returnType), obfArguments);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Given a {@link Type} it returns its obfuscated counterpart.
|
||||||
|
* @param type the type in question
|
||||||
|
* @return the obfuscated type
|
||||||
|
* @since 0.5.1
|
||||||
|
*/
|
||||||
|
public Type obfuscateType(Type type) {
|
||||||
|
//unwrap arrays
|
||||||
|
Type unwrapped = type;
|
||||||
|
int arrayLevel = 0;
|
||||||
|
while(unwrapped.getSort() == org.objectweb.asm.Type.ARRAY) {
|
||||||
|
unwrapped = unwrapped.getElementType();
|
||||||
|
arrayLevel++;
|
||||||
|
}
|
||||||
|
|
||||||
|
//if it's a primitive no operation is needed
|
||||||
|
if(type.getSort() < org.objectweb.asm.Type.ARRAY)
|
||||||
|
return type;
|
||||||
|
|
||||||
|
String internalName = type.getInternalName();
|
||||||
|
|
||||||
|
String internalNameObf;
|
||||||
|
try {
|
||||||
|
internalNameObf = this.obfuscateClass(internalName);
|
||||||
|
return Type.getType(DescriptorBuilder.nameToDescriptor(internalNameObf, arrayLevel));
|
||||||
|
} catch(MappingNotFoundException e) {
|
||||||
|
return type;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the unobfuscated name of the given member.
|
* Gets the unobfuscated name of the given member.
|
||||||
* Due to how it's implemented, it's considerably less efficient than its
|
* Due to how it's implemented, it's considerably less efficient than its
|
||||||
|
|
Loading…
Reference in a new issue