use of org.jf.dexlib2.iface.reference.CallSiteReference in project smali by JesusFreke.
the class BaksmaliWriter method writeCallSite.
@Override
public void writeCallSite(CallSiteReference callSiteReference) throws IOException {
writeSimpleName(callSiteReference.getName());
writer.write('(');
writeQuotedString(callSiteReference.getMethodName());
writer.write(", ");
writeMethodProtoDescriptor(callSiteReference.getMethodProto());
for (EncodedValue encodedValue : callSiteReference.getExtraArguments()) {
writer.write(", ");
writeEncodedValue(encodedValue);
}
writer.write(")@");
MethodHandleReference methodHandle = callSiteReference.getMethodHandle();
if (methodHandle.getMethodHandleType() != MethodHandleType.INVOKE_STATIC) {
throw new IllegalArgumentException("The linker method handle for a call site must be of type invoke-static");
}
writeMethodDescriptor((MethodReference) callSiteReference.getMethodHandle().getMemberReference());
}
use of org.jf.dexlib2.iface.reference.CallSiteReference in project smali by JesusFreke.
the class ReferenceUtil method writeCallSite.
public static void writeCallSite(Writer writer, CallSiteReference callSiteReference) throws IOException {
writer.write(callSiteReference.getName());
writer.write('(');
writer.write('"');
StringUtils.writeEscapedString(writer, callSiteReference.getMethodName());
writer.write('"');
writer.write(", ");
writeMethodProtoDescriptor(writer, callSiteReference.getMethodProto());
for (EncodedValue encodedValue : callSiteReference.getExtraArguments()) {
writer.write(", ");
EncodedValueUtils.writeEncodedValue(writer, encodedValue);
}
writer.write(")@");
MethodHandleReference methodHandle = callSiteReference.getMethodHandle();
if (methodHandle.getMethodHandleType() != MethodHandleType.INVOKE_STATIC) {
throw new IllegalArgumentException("The linker method handle for a call site must be of type invoke-static");
}
writeMethodDescriptor(writer, (MethodReference) callSiteReference.getMethodHandle().getMemberReference());
}
use of org.jf.dexlib2.iface.reference.CallSiteReference in project smali by JesusFreke.
the class CallSiteUtil method getEncodedCallSite.
public static ArrayEncodedValue getEncodedCallSite(CallSiteReference callSiteReference) {
return new BaseArrayEncodedValue() {
@Nonnull
@Override
public List<? extends EncodedValue> getValue() {
List<EncodedValue> encodedCallSite = Lists.newArrayList();
encodedCallSite.add(new BaseMethodHandleEncodedValue() {
@Nonnull
@Override
public MethodHandleReference getValue() {
return callSiteReference.getMethodHandle();
}
});
encodedCallSite.add(new ImmutableStringEncodedValue(callSiteReference.getMethodName()));
encodedCallSite.add(new BaseMethodTypeEncodedValue() {
@Nonnull
@Override
public MethodProtoReference getValue() {
return callSiteReference.getMethodProto();
}
});
encodedCallSite.addAll(callSiteReference.getExtraArguments());
return encodedCallSite;
}
};
}
use of org.jf.dexlib2.iface.reference.CallSiteReference in project smali by JesusFreke.
the class ClassPool method internCode.
private void internCode(@Nonnull Method method) {
// this also handles parameter names, which aren't directly tied to the MethodImplementation, even though the debug items are
boolean hasInstruction = false;
MethodImplementation methodImpl = method.getImplementation();
if (methodImpl != null) {
for (Instruction instruction : methodImpl.getInstructions()) {
hasInstruction = true;
if (instruction instanceof ReferenceInstruction) {
Reference reference = ((ReferenceInstruction) instruction).getReference();
switch(instruction.getOpcode().referenceType) {
case ReferenceType.STRING:
dexPool.stringSection.intern((StringReference) reference);
break;
case ReferenceType.TYPE:
dexPool.typeSection.intern(((TypeReference) reference).getType());
break;
case ReferenceType.FIELD:
dexPool.fieldSection.intern((FieldReference) reference);
break;
case ReferenceType.METHOD:
dexPool.methodSection.intern((MethodReference) reference);
break;
case ReferenceType.CALL_SITE:
dexPool.callSiteSection.intern((CallSiteReference) reference);
break;
default:
throw new ExceptionWithContext("Unrecognized reference type: %d", instruction.getOpcode().referenceType);
}
}
}
List<? extends TryBlock> tryBlocks = methodImpl.getTryBlocks();
if (!hasInstruction && tryBlocks.size() > 0) {
throw new ExceptionWithContext("Method %s has no instructions, but has try blocks.", method);
}
for (TryBlock<? extends ExceptionHandler> tryBlock : methodImpl.getTryBlocks()) {
for (ExceptionHandler handler : tryBlock.getExceptionHandlers()) {
dexPool.typeSection.internNullable(handler.getExceptionType());
}
}
}
}
use of org.jf.dexlib2.iface.reference.CallSiteReference in project smali by JesusFreke.
the class BuilderCallSitePool method internCallSite.
@Nonnull
public BuilderCallSiteReference internCallSite(@Nonnull CallSiteReference callSiteReference) {
BuilderCallSiteReference internedCallSite = internedItems.get(callSiteReference);
if (internedCallSite != null) {
return internedCallSite;
}
BuilderArrayEncodedValue encodedCallSite = dexBuilder.encodedArraySection.internArrayEncodedValue(CallSiteUtil.getEncodedCallSite(callSiteReference));
internedCallSite = new BuilderCallSiteReference(callSiteReference.getName(), encodedCallSite);
BuilderCallSiteReference existing = internedItems.putIfAbsent(internedCallSite, internedCallSite);
return existing == null ? internedCallSite : existing;
}
Aggregations