diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/debug/SetSourceFile.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/debug/SetSourceFile.java index d992423d..de243abc 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/iface/debug/SetSourceFile.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/debug/SetSourceFile.java @@ -31,8 +31,11 @@ package org.jf.dexlib2.iface.debug; +import org.jf.dexlib2.iface.reference.StringReference; + import javax.annotation.Nullable; public interface SetSourceFile extends DebugItem { @Nullable String getSourceFile(); + @Nullable StringReference getSourceFileReference(); } diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/debug/StartLocal.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/debug/StartLocal.java index 01ec1e09..90a55475 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/iface/debug/StartLocal.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/debug/StartLocal.java @@ -31,6 +31,15 @@ package org.jf.dexlib2.iface.debug; +import org.jf.dexlib2.iface.reference.StringReference; +import org.jf.dexlib2.iface.reference.TypeReference; + +import javax.annotation.Nullable; + public interface StartLocal extends DebugItem, LocalInfo { int getRegister(); + + @Nullable StringReference getNameReference(); + @Nullable TypeReference getTypeReference(); + @Nullable StringReference getSignatureReference(); } diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/debug/ImmutableSetSourceFile.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/debug/ImmutableSetSourceFile.java index 54d7e29c..b74adab0 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/immutable/debug/ImmutableSetSourceFile.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/debug/ImmutableSetSourceFile.java @@ -32,7 +32,9 @@ package org.jf.dexlib2.immutable.debug; import org.jf.dexlib2.DebugItemType; +import org.jf.dexlib2.base.reference.BaseStringReference; import org.jf.dexlib2.iface.debug.SetSourceFile; +import org.jf.dexlib2.iface.reference.StringReference; import javax.annotation.Nonnull; import javax.annotation.Nullable; @@ -58,5 +60,14 @@ public class ImmutableSetSourceFile extends ImmutableDebugItem implements SetSou @Nullable @Override public String getSourceFile() { return sourceFile; } + @Nullable @Override public StringReference getSourceFileReference() { + return sourceFile==null?null:new BaseStringReference() { + @Nonnull @Override public String getString() { + return sourceFile; + } + }; + } + + @Override public int getDebugItemType() { return DebugItemType.SET_SOURCE_FILE; } } diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/debug/ImmutableStartLocal.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/debug/ImmutableStartLocal.java index 24eb7c83..635e92ad 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/immutable/debug/ImmutableStartLocal.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/debug/ImmutableStartLocal.java @@ -32,7 +32,11 @@ package org.jf.dexlib2.immutable.debug; import org.jf.dexlib2.DebugItemType; +import org.jf.dexlib2.base.reference.BaseStringReference; +import org.jf.dexlib2.base.reference.BaseTypeReference; import org.jf.dexlib2.iface.debug.StartLocal; +import org.jf.dexlib2.iface.reference.StringReference; +import org.jf.dexlib2.iface.reference.TypeReference; import javax.annotation.Nonnull; import javax.annotation.Nullable; @@ -69,6 +73,31 @@ public class ImmutableStartLocal extends ImmutableDebugItem implements StartLoca } @Override public int getRegister() { return register; } + + @Nullable @Override public StringReference getNameReference() { + return name==null?null:new BaseStringReference() { + @Nonnull @Override public String getString() { + return name; + } + }; + } + + @Nullable @Override public TypeReference getTypeReference() { + return type==null?null:new BaseTypeReference() { + @Nonnull @Override public String getType() { + return type; + } + }; + } + + @Nullable @Override public StringReference getSignatureReference() { + return signature==null?null:new BaseStringReference() { + @Nonnull @Override public String getString() { + return signature; + } + }; + } + @Nullable @Override public String getName() { return name; } @Nullable @Override public String getType() { return type; } @Nullable @Override public String getSignature() { return signature; } diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/ClassSection.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/ClassSection.java index c41b17e0..a57904ea 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/writer/ClassSection.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/ClassSection.java @@ -32,6 +32,7 @@ package org.jf.dexlib2.writer; import org.jf.dexlib2.iface.TryBlock; +import org.jf.dexlib2.iface.debug.DebugItem; import javax.annotation.Nonnull; import javax.annotation.Nullable; @@ -41,7 +42,7 @@ import java.util.List; import java.util.Map; public interface ClassSection extends IndexSection { @Nonnull Collection getSortedClasses(); diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/DexWriter.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/DexWriter.java index 9c979b74..3f297e6e 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/writer/DexWriter.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/DexWriter.java @@ -40,6 +40,7 @@ import org.jf.dexlib2.base.BaseAnnotation; import org.jf.dexlib2.dexbacked.raw.*; import org.jf.dexlib2.iface.Annotation; import org.jf.dexlib2.iface.TryBlock; +import org.jf.dexlib2.iface.debug.DebugItem; import org.jf.dexlib2.iface.debug.LineNumber; import org.jf.dexlib2.iface.instruction.Instruction; import org.jf.dexlib2.iface.instruction.formats.*; @@ -75,7 +76,6 @@ public abstract class DexWriter< TypeListKey, FieldKey, MethodKey, EncodedValue, AnnotationElement, - DebugItem extends org.jf.dexlib2.iface.debug.DebugItem, Insn extends Instruction, ExceptionHandler extends org.jf.dexlib2.iface.ExceptionHandler> { public static final int NO_INDEX = -1; public static final int NO_OFFSET = 0; @@ -116,7 +116,7 @@ public abstract class DexWriter< protected final FieldSection fieldSection; protected final MethodSection methodSection; protected final ClassSection classSection; + EncodedValue, Insn, ExceptionHandler> classSection; protected final TypeListSection typeListSection; protected final AnnotationSection annotationSection; @@ -130,7 +130,7 @@ public abstract class DexWriter< FieldSection fieldSection, MethodSection methodSection, ClassSection classSection, + EncodedValue, Insn, ExceptionHandler> classSection, TypeListSection typeListSection, AnnotationSection annotationSection, diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderClassPool.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderClassPool.java index cda9a4e2..215f1abc 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderClassPool.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderClassPool.java @@ -37,15 +37,13 @@ import com.google.common.collect.*; import org.jf.dexlib2.DebugItemType; import org.jf.dexlib2.iface.Field; import org.jf.dexlib2.iface.TryBlock; -import org.jf.dexlib2.iface.debug.EndLocal; -import org.jf.dexlib2.iface.debug.LineNumber; -import org.jf.dexlib2.iface.debug.RestartLocal; +import org.jf.dexlib2.iface.debug.*; +import org.jf.dexlib2.iface.reference.StringReference; +import org.jf.dexlib2.iface.reference.TypeReference; import org.jf.dexlib2.iface.value.EncodedValue; import org.jf.dexlib2.util.EncodedValueUtils; import org.jf.dexlib2.writer.ClassSection; import org.jf.dexlib2.writer.DebugWriter; -import org.jf.dexlib2.writer.builder.BuilderDebugItem.BuilderSetSourceFile; -import org.jf.dexlib2.writer.builder.BuilderDebugItem.BuilderStartLocal; import org.jf.dexlib2.writer.builder.BuilderEncodedValues.BuilderEncodedValue; import org.jf.util.AbstractForwardSequentialList; import org.jf.util.CollectionUtils; @@ -59,8 +57,8 @@ import java.util.Map.Entry; import java.util.concurrent.ConcurrentMap; public class BuilderClassPool implements ClassSection { + BuilderClassDef, BuilderField, BuilderMethod, BuilderAnnotationSet, BuilderEncodedValue, BuilderInstruction, + BuilderExceptionHandler> { @Nonnull private final ConcurrentMap internedItems = Maps.newConcurrentMap(); @@ -266,7 +264,7 @@ public class BuilderClassPool implements ClassSection getDebugItems(@Nonnull BuilderMethod builderMethod) { + public Iterable getDebugItems(@Nonnull BuilderMethod builderMethod) { BuilderMethodImplementation impl = builderMethod.getImplementation(); if (impl == null) { return null; @@ -353,17 +351,41 @@ public class BuilderClassPool implements ClassSection writer, - BuilderDebugItem debugItem) throws IOException { + DebugItem debugItem) throws IOException { switch (debugItem.getDebugItemType()) { case DebugItemType.START_LOCAL: { - BuilderStartLocal startLocal = (BuilderStartLocal)debugItem; + StartLocal startLocal = (StartLocal)debugItem; writer.writeStartLocal(startLocal.getCodeAddress(), - startLocal.register, - startLocal.name, - startLocal.type, - startLocal.signature); + startLocal.getRegister(), + checkStringReference(startLocal.getNameReference()), + checkTypeReference(startLocal.getTypeReference()), + checkStringReference(startLocal.getSignatureReference())); break; } case DebugItemType.END_LOCAL: { @@ -390,8 +412,9 @@ public class BuilderClassPool implements ClassSection instructions; @Nonnull protected final List tryBlocks; - @Nonnull protected final List debugItems; + @Nonnull protected final List debugItems; public BuilderMethodImplementation(int registerCount, @Nonnull List instructions, @Nonnull List tryBlocks, - @Nonnull List debugItems) { + @Nonnull List debugItems) { this.registerCount = registerCount; this.instructions = instructions; this.tryBlocks = tryBlocks; @@ -55,5 +56,5 @@ public class BuilderMethodImplementation implements MethodImplementation { @Override public int getRegisterCount() { return registerCount; } @Nonnull @Override public List getInstructions() { return instructions; } @Nonnull @Override public List getTryBlocks() { return tryBlocks; } - @Nonnull @Override public List getDebugItems() { return debugItems; } + @Nonnull @Override public List getDebugItems() { return debugItems; } } diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/DexBuilder.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/DexBuilder.java index 3d4f3025..e3c6cd13 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/DexBuilder.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/DexBuilder.java @@ -38,10 +38,10 @@ import com.google.common.collect.Lists; import org.jf.dexlib2.ValueType; import org.jf.dexlib2.iface.Annotation; import org.jf.dexlib2.iface.MethodParameter; +import org.jf.dexlib2.iface.debug.DebugItem; import org.jf.dexlib2.iface.reference.*; import org.jf.dexlib2.iface.value.*; import org.jf.dexlib2.writer.DexWriter; -import org.jf.dexlib2.writer.builder.BuilderDebugItem.*; import org.jf.dexlib2.writer.builder.BuilderEncodedValues.*; import org.jf.util.ExceptionWithContext; @@ -56,7 +56,7 @@ import java.util.Set; public class DexBuilder extends DexWriter { + BuilderEncodedValue, BuilderAnnotationElement, BuilderInstruction, BuilderExceptionHandler> { private final BuilderContext context; @@ -110,7 +110,7 @@ public class DexBuilder extends DexWriter instructions, @Nullable List tryBlocks, - @Nullable List debugItems) { + @Nullable List debugItems) { if (instructions == null) { instructions = ImmutableList.of(); } @@ -232,40 +232,6 @@ public class DexBuilder extends DexWriter>, PoolClassDef, Field, PoolMethod, Set, - EncodedValue, DebugItem, Instruction, ExceptionHandler> { + EncodedValue, Instruction, ExceptionHandler> { @Nonnull private HashMap internedItems = Maps.newHashMap(); @Nonnull private final StringPool stringPool; diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/DexPool.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/DexPool.java index 1eda265a..887a30da 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/DexPool.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/DexPool.java @@ -33,7 +33,6 @@ package org.jf.dexlib2.writer.pool; import org.jf.dexlib2.ValueType; import org.jf.dexlib2.iface.*; -import org.jf.dexlib2.iface.debug.DebugItem; import org.jf.dexlib2.iface.instruction.Instruction; import org.jf.dexlib2.iface.reference.*; import org.jf.dexlib2.iface.value.*; @@ -51,7 +50,7 @@ public class DexPool extends DexWriter, TypeListPool.Key>, Field, PoolMethod, - EncodedValue, AnnotationElement, DebugItem, Instruction, ExceptionHandler> { + EncodedValue, AnnotationElement, Instruction, ExceptionHandler> { public static DexPool makeDexPool() { return makeDexPool(15);