Skip to content

Commit af3a9f7

Browse files
committed
[DEX] Overhaul DEX
1 parent 2664403 commit af3a9f7

50 files changed

Lines changed: 2152 additions & 506 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

src/main/java/com/reandroid/dex/common/IdDefinition.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,15 @@ public interface IdDefinition<T extends IdItem> extends AccessibleProgram, IdUsa
2929

3030
@Override
3131
default boolean uses(Key key) {
32+
if (key.equals(getKey())) {
33+
return false;
34+
}
3235
IdItem id = getId();
3336
Iterator<IdItem> iterator = usedIds();
3437
while (iterator.hasNext()) {
3538
IdItem idItem = iterator.next();
36-
if (!id.equals(idItem) && key.equals(idItem.getKey())) {
39+
Key idKey = idItem.getKey();
40+
if (idKey != null && !id.equals(idItem) && idKey.uses(key)) {
3741
return true;
3842
}
3943
}

src/main/java/com/reandroid/dex/data/ClassData.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -324,6 +324,27 @@ public void editInternal(Block user) {
324324
}
325325
}
326326

327+
@Override
328+
public boolean uses(Key key) {
329+
DefArray<?> defArray = staticFields;
330+
if (defArray != null && defArray.uses(key)) {
331+
return true;
332+
}
333+
defArray = instanceFields;
334+
if (defArray != null && defArray.uses(key)) {
335+
return true;
336+
}
337+
defArray = directMethods;
338+
if (defArray != null && defArray.uses(key)) {
339+
return true;
340+
}
341+
defArray = virtualMethods;
342+
if (defArray != null && defArray.uses(key)) {
343+
return true;
344+
}
345+
return false;
346+
}
347+
327348
@Override
328349
public Iterator<IdItem> usedIds() {
329350
return new IterableIterator<DefArray<?>, IdItem>(getDefArrays()) {

src/main/java/com/reandroid/dex/data/CodeItem.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -266,6 +266,15 @@ protected void onRefreshed() {
266266
}
267267
}
268268

269+
@Override
270+
public boolean uses(Key key) {
271+
TryBlock tryBlock = getTryBlock();
272+
if (tryBlock != null && tryBlock.uses(key)) {
273+
return true;
274+
}
275+
return getInstructionList().uses(key);
276+
}
277+
269278
@Override
270279
public Iterator<IdItem> usedIds(){
271280
DebugInfo debugInfo = getDebugInfo();

src/main/java/com/reandroid/dex/data/Def.java

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,14 @@
2323
import com.reandroid.dex.common.HiddenApiFlag;
2424
import com.reandroid.dex.common.IdDefinition;
2525
import com.reandroid.dex.common.IdUsageIterator;
26-
import com.reandroid.dex.common.Modifier;
2726
import com.reandroid.dex.common.SectionTool;
2827
import com.reandroid.dex.id.ClassId;
2928
import com.reandroid.dex.id.IdItem;
30-
import com.reandroid.dex.key.*;
29+
import com.reandroid.dex.key.AnnotationItemKey;
30+
import com.reandroid.dex.key.AnnotationSetKey;
31+
import com.reandroid.dex.key.Key;
32+
import com.reandroid.dex.key.MemberKey;
33+
import com.reandroid.dex.key.TypeKey;
3134
import com.reandroid.dex.pool.DexSectionPool;
3235
import com.reandroid.dex.program.MemberProgram;
3336
import com.reandroid.dex.sections.Section;
@@ -36,7 +39,6 @@
3639
import com.reandroid.dex.smali.SmaliRegion;
3740
import com.reandroid.dex.smali.model.Smali;
3841
import com.reandroid.dex.smali.model.SmaliDef;
39-
import com.reandroid.utils.collection.CombiningIterator;
4042
import com.reandroid.utils.collection.EmptyIterator;
4143
import com.reandroid.utils.collection.SingleIterator;
4244

@@ -378,6 +380,15 @@ public void editInternal(Block user) {
378380

379381
}
380382

383+
@Override
384+
public boolean uses(Key key) {
385+
Key k = getKey();
386+
if (key.equals(k)) {
387+
return false;
388+
}
389+
return k.uses(key);
390+
}
391+
381392
public Iterator<IdItem> usedIds() {
382393
return SingleIterator.of(getId());
383394
}

src/main/java/com/reandroid/dex/data/DefArray.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,17 @@ public void editInternal(Block user) {
205205
}
206206
}
207207

208+
@Override
209+
public boolean uses(Key key) {
210+
int size = size();
211+
for (int i = 0; i < size; i++) {
212+
if (get(i).uses(key)) {
213+
return true;
214+
}
215+
}
216+
return false;
217+
}
218+
208219
@Override
209220
public Iterator<IdItem> usedIds(){
210221
return new IterableIterator<Def<?>, IdItem>(iterator()) {

src/main/java/com/reandroid/dex/data/FieldDef.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,13 @@ public Iterator<IdItem> usedIds() {
138138
}
139139
@Override
140140
public boolean uses(Key key) {
141+
Key k = getKey();
142+
if (key.equals(k)) {
143+
return false;
144+
}
145+
if (k.uses(key)) {
146+
return true;
147+
}
141148
return key.equals(getStaticValue());
142149
}
143150
@Override

src/main/java/com/reandroid/dex/data/InstructionList.java

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -346,11 +346,14 @@ public ConstString createStringAt(int index, int register, StringKey value) {
346346
return constNumber;
347347
}
348348
public<T1 extends Ins> T1 createAt(int index, Opcode<T1> opcode) {
349-
if(index == getCount()) {
349+
return createAt(true, index, opcode);
350+
}
351+
public<T1 extends Ins> T1 createAt(boolean shiftLabels, int index, Opcode<T1> opcode) {
352+
if (index == getCount()) {
350353
return createNext(opcode);
351354
}
352355
T1 item = opcode.newInstance();
353-
add(index, item);
356+
add(shiftLabels, index, item);
354357
return item;
355358
}
356359
public<T1 extends Ins> T1 createNext(Opcode<T1> opcode) {
@@ -458,6 +461,15 @@ public void replaceKeys(Key search, Key replace){
458461
ins.replaceKeys(search, replace);
459462
}
460463
}
464+
public boolean uses(Key key) {
465+
int size = getCount();
466+
for (int i = 0; i < size; i++) {
467+
if (get(i).uses(key)) {
468+
return true;
469+
}
470+
}
471+
return false;
472+
}
461473
public Iterator<IdItem> usedIds() {
462474
return new IterableIterator<Ins, IdItem>(iterator()) {
463475
@Override

src/main/java/com/reandroid/dex/data/MethodDef.java

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import com.reandroid.common.ArraySupplier;
2121
import com.reandroid.dex.base.UsageMarker;
2222
import com.reandroid.dex.common.Modifier;
23+
import com.reandroid.dex.debug.DebugSequence;
2324
import com.reandroid.dex.id.IdItem;
2425
import com.reandroid.dex.id.MethodId;
2526
import com.reandroid.dex.id.ProtoId;
@@ -202,6 +203,26 @@ public DebugInfo getDebugInfo() {
202203
public DebugInfo getOrCreateDebugInfo() {
203204
return getOrCreateCodeItem().getOrCreateDebugInfo();
204205
}
206+
public DebugSequence getDebugSequence() {
207+
DebugInfo debugInfo = getDebugInfo();
208+
if (debugInfo != null) {
209+
return debugInfo.getDebugSequence();
210+
}
211+
return null;
212+
}
213+
public DebugSequence getOrCreateDebugSequence() {
214+
return getOrCreateDebugInfo().getDebugSequence();
215+
}
216+
public boolean hasDebugInfo() {
217+
return getDebugInfo() != null;
218+
}
219+
public boolean hasDebugSequence() {
220+
DebugInfo debugInfo = getDebugInfo();
221+
if (debugInfo != null) {
222+
return debugInfo.hasSequence();
223+
}
224+
return false;
225+
}
205226
public ProtoId getProtoId() {
206227
MethodId methodId = getId();
207228
if (methodId != null) {
@@ -355,6 +376,22 @@ public void editInternal(Block user) {
355376
this.edit();
356377
}
357378

379+
@Override
380+
public boolean uses(Key key) {
381+
Key k = getKey();
382+
if (key.equals(k)) {
383+
return false;
384+
}
385+
if (k.uses(key)) {
386+
return true;
387+
}
388+
CodeItem codeItem = getCodeItem();
389+
if (codeItem != null && codeItem.uses(key)) {
390+
return true;
391+
}
392+
return false;
393+
}
394+
358395
@Override
359396
public Iterator<IdItem> usedIds() {
360397
Iterator<IdItem> iterator;
@@ -395,7 +432,7 @@ public void fromSmali(Smali smali) {
395432
MethodKey methodKey = smaliMethod.getKey();
396433
throw new RuntimeException("Parameter out of range, class = " +
397434
methodKey.getDeclaring() + ", method = " + methodKey.getName() +
398-
methodKey.getProto() + "\n" + smaliMethodParameter);
435+
methodKey.getType() + "\n" + smaliMethodParameter);
399436
}
400437
MethodParameterDef parameter = getParameter(index);
401438
parameter.fromSmali(smaliMethodParameter, false);

0 commit comments

Comments
 (0)