Search in sources :

Example 1 with CallSiteReference

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());
}
Also used : MethodHandleReference(org.jf.dexlib2.iface.reference.MethodHandleReference)

Example 2 with CallSiteReference

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());
}
Also used : EncodedValue(org.jf.dexlib2.iface.value.EncodedValue)

Example 3 with CallSiteReference

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;
        }
    };
}
Also used : ImmutableStringEncodedValue(org.jf.dexlib2.immutable.value.ImmutableStringEncodedValue) BaseArrayEncodedValue(org.jf.dexlib2.base.value.BaseArrayEncodedValue) BaseMethodHandleEncodedValue(org.jf.dexlib2.base.value.BaseMethodHandleEncodedValue) BaseMethodTypeEncodedValue(org.jf.dexlib2.base.value.BaseMethodTypeEncodedValue) EncodedValue(org.jf.dexlib2.iface.value.EncodedValue) ArrayEncodedValue(org.jf.dexlib2.iface.value.ArrayEncodedValue) BaseArrayEncodedValue(org.jf.dexlib2.base.value.BaseArrayEncodedValue) Nonnull(javax.annotation.Nonnull) ImmutableStringEncodedValue(org.jf.dexlib2.immutable.value.ImmutableStringEncodedValue) MethodProtoReference(org.jf.dexlib2.iface.reference.MethodProtoReference) MethodHandleReference(org.jf.dexlib2.iface.reference.MethodHandleReference) BaseMethodHandleEncodedValue(org.jf.dexlib2.base.value.BaseMethodHandleEncodedValue) BaseMethodTypeEncodedValue(org.jf.dexlib2.base.value.BaseMethodTypeEncodedValue)

Example 4 with CallSiteReference

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());
            }
        }
    }
}
Also used : MutableMethodImplementation(org.jf.dexlib2.builder.MutableMethodImplementation) ExceptionWithContext(org.jf.util.ExceptionWithContext) ReferenceInstruction(org.jf.dexlib2.iface.instruction.ReferenceInstruction) Instruction(org.jf.dexlib2.iface.instruction.Instruction) ReferenceInstruction(org.jf.dexlib2.iface.instruction.ReferenceInstruction)

Example 5 with CallSiteReference

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;
}
Also used : BuilderArrayEncodedValue(org.jf.dexlib2.writer.builder.BuilderEncodedValues.BuilderArrayEncodedValue) Nonnull(javax.annotation.Nonnull)

Aggregations

Nonnull (javax.annotation.Nonnull)2 Instruction (org.jf.dexlib2.iface.instruction.Instruction)2 MethodHandleReference (org.jf.dexlib2.iface.reference.MethodHandleReference)2 EncodedValue (org.jf.dexlib2.iface.value.EncodedValue)2 BaseArrayEncodedValue (org.jf.dexlib2.base.value.BaseArrayEncodedValue)1 BaseMethodHandleEncodedValue (org.jf.dexlib2.base.value.BaseMethodHandleEncodedValue)1 BaseMethodTypeEncodedValue (org.jf.dexlib2.base.value.BaseMethodTypeEncodedValue)1 MutableMethodImplementation (org.jf.dexlib2.builder.MutableMethodImplementation)1 BuilderInstruction35c (org.jf.dexlib2.builder.instruction.BuilderInstruction35c)1 ClassDef (org.jf.dexlib2.iface.ClassDef)1 Method (org.jf.dexlib2.iface.Method)1 ReferenceInstruction (org.jf.dexlib2.iface.instruction.ReferenceInstruction)1 Instruction35c (org.jf.dexlib2.iface.instruction.formats.Instruction35c)1 CallSiteReference (org.jf.dexlib2.iface.reference.CallSiteReference)1 MethodProtoReference (org.jf.dexlib2.iface.reference.MethodProtoReference)1 ArrayEncodedValue (org.jf.dexlib2.iface.value.ArrayEncodedValue)1 ImmutableClassDef (org.jf.dexlib2.immutable.ImmutableClassDef)1 ImmutableMethod (org.jf.dexlib2.immutable.ImmutableMethod)1 ImmutableInstruction35c (org.jf.dexlib2.immutable.instruction.ImmutableInstruction35c)1 ImmutableCallSiteReference (org.jf.dexlib2.immutable.reference.ImmutableCallSiteReference)1