From d37e1a3f73830b6d2c3ec24d02fd11500b8f1ff2 Mon Sep 17 00:00:00 2001 From: "honfika@gmail.com" Date: Wed, 9 Sep 2015 11:02:33 +0200 Subject: [PATCH] faster deobfuscation --- .../decompiler/flash/abc/avm2/AVM2Code.java | 119 ++++++++---------- .../flash/abc/avm2/graph/AVM2Graph.java | 83 ++++++------ 2 files changed, 96 insertions(+), 106 deletions(-) diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/AVM2Code.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/AVM2Code.java index 8547bfb93..0b769c353 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/AVM2Code.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/AVM2Code.java @@ -290,6 +290,7 @@ import com.jpexs.decompiler.graph.TypeItem; import com.jpexs.decompiler.graph.model.ExitItem; import com.jpexs.decompiler.graph.model.ScriptEndItem; import com.jpexs.helpers.Helper; +import com.jpexs.helpers.stat.Statistics; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; @@ -1035,7 +1036,6 @@ public class AVM2Code implements Cloneable { } public GraphTextWriter toASMSource(AVM2ConstantPool constants, Trait trait, MethodInfo info, MethodBody body, List outputMap, ScriptExportMode exportMode, GraphTextWriter writer) { - invalidateCache(); if (trait != null) { if (trait instanceof TraitFunction) { TraitFunction tf = (TraitFunction) trait; @@ -1298,62 +1298,58 @@ public class AVM2Code implements Cloneable { return writer; } - private boolean cacheActual = false; - - private List posCache; - - private Map posCacheReverse; - - private void buildCache() { - List posCache = new ArrayList<>(code.size() + 1); - Map posCacheReverse = new HashMap<>(code.size() + 1); - long a = 0; - int i = 0; - for (; i < code.size(); i++) { - AVM2Instruction ins = code.get(i); - posCache.add(ins.offset); - posCacheReverse.put(ins.offset, i); - a = ins.offset + ins.getBytesLength(); - } - - posCache.add(a); - posCacheReverse.put(a, i); - this.posCache = posCache; - this.posCacheReverse = posCacheReverse; - cacheActual = true; - } - public int adr2pos(long address) throws ConvertException { return adr2pos(address, false); } public int adr2pos(long address, boolean nearest) throws ConvertException { - if (!cacheActual) { - buildCache(); - } - Integer ret = posCacheReverse.get(address); - if (ret == null) { - if (nearest) { - for (long a : posCache) { - if (a > address) { - return posCache.indexOf(a); - } - } + int ret = adr2posNoEx(address); + if (ret < 0) { + if (nearest && address < getEndOffset()) { + return -ret - 1; } throw new ConvertException("Invalid jump to ofs" + Helper.formatAddress(address), -1); } return ret; } - public int pos2adr(int pos) { - if (!cacheActual) { - buildCache(); + private int adr2posNoEx(long address) { + int min = 0; + int max = code.size() - 1; + + while (max >= min) { + int mid = (min + max) / 2; + long midValue = code.get(mid).offset; + if (midValue == address) { + return mid; + } else if (midValue < address) { + min = mid + 1; + } else { + max = mid - 1; + } } - return posCache.get(pos).intValue(); + + if (address == getEndOffset()) { + return code.size(); + } + + return -min - 1; } - public void invalidateCache() { - cacheActual = false; + public long pos2adr(int pos) { + if (pos == code.size()) { + return getEndOffset(); + } + return (int) code.get(pos).offset; + } + + public long getEndOffset() { + if (code.isEmpty()) { + return 0; + } + + AVM2Instruction ins = code.get(code.size() - 1); + return (int) (ins.offset + ins.getBytesLength()); } private List unknownJumps; @@ -1463,7 +1459,7 @@ public class AVM2Code implements Cloneable { return ip; } - public int fixAddrAfterDebugLine(int addr) throws ConvertException { + public long fixAddrAfterDebugLine(long addr) throws ConvertException { return pos2adr(fixIPAfterDebugLine(adr2pos(addr, true))); } @@ -2006,13 +2002,11 @@ public class AVM2Code implements Cloneable { } public void fixJumps(final String path, MethodBody body) throws InterruptedException { - buildCache(); if (code.isEmpty()) { return; } - AVM2Instruction lastInstuction = code.get(code.size() - 1); final List insAddrToRemove = new ArrayList<>(); - final long endOffset = lastInstuction.offset + lastInstuction.getBytesLength(); + final long endOffset = getEndOffset(); updateOffsets(new OffsetUpdater() { @Override @@ -2022,7 +2016,7 @@ public class AVM2Code implements Cloneable { @Override public int updateOperandOffset(long insAddr, long targetAddress, int offset) { - if (targetAddress > endOffset || targetAddress < 0 || posCache.indexOf(targetAddress) == -1) { + if (targetAddress > endOffset || targetAddress < 0 || adr2posNoEx(targetAddress) < 0) { insAddrToRemove.add(insAddr); } return offset; @@ -2032,8 +2026,8 @@ public class AVM2Code implements Cloneable { boolean someIgnored = false; for (Long insAddr : insAddrToRemove) { - Integer pos = posCacheReverse.get(insAddr); - if (pos != null) { + int pos = adr2posNoEx(insAddr); + if (pos > -1) { code.get(pos).ignored = true; someIgnored = true; } @@ -2045,7 +2039,6 @@ public class AVM2Code implements Cloneable { } public void checkValidOffsets(MethodBody body) { - invalidateCache(); updateOffsets(new OffsetUpdater() { @Override @@ -2097,7 +2090,6 @@ public class AVM2Code implements Cloneable { } }, body); code.remove(pos); - invalidateCache(); //checkValidOffsets(body); } @@ -2159,7 +2151,6 @@ public class AVM2Code implements Cloneable { }, body); } code.set(pos, instruction); - invalidateCache(); //checkValidOffsets(body); } @@ -2212,7 +2203,6 @@ public class AVM2Code implements Cloneable { } }, body); code.add(pos, instruction); - invalidateCache(); //checkValidOffsets(body); } @@ -2270,9 +2260,15 @@ public class AVM2Code implements Cloneable { if (Configuration.deobfuscationOldMode.get()) { return removeTrapsOld(constants, trait, info, body, abc, scriptIndex, classIndex, isStatic, path); } else { - new AVM2DeobfuscatorSimple().deobfuscate(path, classIndex, isStatic, scriptIndex, abc, constants, trait, info, body); - new AVM2DeobfuscatorRegisters().deobfuscate(path, classIndex, isStatic, scriptIndex, abc, constants, trait, info, body); - new AVM2DeobfuscatorJumps().deobfuscate(path, classIndex, isStatic, scriptIndex, abc, constants, trait, info, body); + try (Statistics s = new Statistics("AVM2DeobfuscatorSimple")) { + new AVM2DeobfuscatorSimple().deobfuscate(path, classIndex, isStatic, scriptIndex, abc, constants, trait, info, body); + } + try (Statistics s = new Statistics("AVM2DeobfuscatorRegisters")) { + new AVM2DeobfuscatorRegisters().deobfuscate(path, classIndex, isStatic, scriptIndex, abc, constants, trait, info, body); + } + try (Statistics s = new Statistics("AVM2DeobfuscatorJumps")) { + new AVM2DeobfuscatorJumps().deobfuscate(path, classIndex, isStatic, scriptIndex, abc, constants, trait, info, body); + } return 1; } } @@ -2765,7 +2761,6 @@ public class AVM2Code implements Cloneable { } catch (ConvertException cex) { logger.log(Level.SEVERE, "Error during restore control flow", cex); } - invalidateCache(); try { List outputMap = new ArrayList<>(); HighlightedTextWriter writer = new HighlightedTextWriter(Configuration.getCodeFormatting(), false); @@ -2791,7 +2786,6 @@ public class AVM2Code implements Cloneable { } catch (AVM2ParseException ex) { logger.log(Level.FINE, null, ex); } - invalidateCache(); removeDeadCode(body); } @@ -2836,7 +2830,6 @@ public class AVM2Code implements Cloneable { } public int removeDeadCode(MethodBody body) throws InterruptedException { - invalidateCache(); HashMap> refs = visitCode(body); int cnt = 0; for (int i = code.size() - 1; i >= 0; i--) { @@ -2869,9 +2862,9 @@ public class AVM2Code implements Cloneable { for (int i = 0; i < csize; i++) { AVM2Instruction ins = code.get(i); int insLen = code.get(i).getBytesLength(); - int ofs = pos2adr(i); + long ofs = pos2adr(i); if (ins.definition instanceof JumpIns) { - int targetOfs = ofs + insLen + ins.operands[0]; + long targetOfs = ofs + insLen + ins.operands[0]; try { int ni = adr2pos(targetOfs); if (ni < code.size() && ni > -1) { @@ -2887,7 +2880,6 @@ public class AVM2Code implements Cloneable { code.add(i + 3, nopIns); i += 3; csize = code.size(); - buildCache(); } } } catch (ConvertException ex) { @@ -3360,7 +3352,6 @@ public class AVM2Code implements Cloneable { ret.code = codeCopy; } - ret.cacheActual = false; ret.ignoredIns = new ArrayList<>(); ret.killedRegs = new HashMap<>(); ret.unknownJumps = new ArrayList<>(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/graph/AVM2Graph.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/graph/AVM2Graph.java index 48f6376e6..1471172fe 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/graph/AVM2Graph.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/graph/AVM2Graph.java @@ -184,21 +184,21 @@ public class AVM2Graph extends Graph { } List ignoredSwitches2 = aLocalData.ignoredSwitches2; int ip = part.start; - int addr = this.avm2code.fixAddrAfterDebugLine(this.avm2code.pos2adr(part.start)); - int maxend = -1; + long addr = avm2code.fixAddrAfterDebugLine(avm2code.pos2adr(part.start)); + long maxend = -1; List catchedFinallys = new ArrayList<>(); List catchedExceptions = new ArrayList<>(); for (int e = 0; e < body.exceptions.length; e++) { - if (addr == this.avm2code.fixAddrAfterDebugLine(body.exceptions[e].start)) { + if (addr == avm2code.fixAddrAfterDebugLine(body.exceptions[e].start)) { //Add finally only when the list is empty if (!body.exceptions[e].isFinally() || catchedExceptions.isEmpty()) { if (!parsedExceptions.contains(body.exceptions[e])) { if (((body.exceptions[e].end) > maxend)) { catchedExceptions.clear(); catchedFinallys.clear(); - maxend = this.avm2code.fixAddrAfterDebugLine(body.exceptions[e].end); + maxend = avm2code.fixAddrAfterDebugLine(body.exceptions[e].end); catchedExceptions.add(body.exceptions[e]); - } else if (this.avm2code.fixAddrAfterDebugLine(body.exceptions[e].end) == maxend) { + } else if (avm2code.fixAddrAfterDebugLine(body.exceptions[e].end) == maxend) { catchedExceptions.add(body.exceptions[e]); } catchedFinallys.add(e); @@ -211,19 +211,19 @@ public class AVM2Graph extends Graph { } if (catchedExceptions.size() > 0) { parsedExceptions.addAll(catchedExceptions); - int endpos = code.adr2pos(this.avm2code.fixAddrAfterDebugLine(catchedExceptions.get(0).end)); + int endpos = code.adr2pos(avm2code.fixAddrAfterDebugLine(catchedExceptions.get(0).end)); int endposStartBlock = code.adr2pos(catchedExceptions.get(0).end); String finCatchName = ""; List> catchedCommands = new ArrayList<>(); - if (this.avm2code.code.get(endpos).definition instanceof JumpIns) { - int afterCatchAddr = this.avm2code.pos2adr(endpos + 1) + this.avm2code.code.get(endpos).operands[0]; - int afterCatchPos = this.avm2code.adr2pos(afterCatchAddr); + if (avm2code.code.get(endpos).definition instanceof JumpIns) { + long afterCatchAddr = avm2code.pos2adr(endpos + 1) + avm2code.code.get(endpos).operands[0]; + int afterCatchPos = avm2code.adr2pos(afterCatchAddr); final AVM2Graph t = this; Collections.sort(catchedExceptions, new Comparator() { @Override public int compare(ABCException o1, ABCException o2) { - return t.avm2code.fixAddrAfterDebugLine(o1.target) - t.avm2code.fixAddrAfterDebugLine(o2.target); + return (int) (t.avm2code.fixAddrAfterDebugLine(o1.target) - t.avm2code.fixAddrAfterDebugLine(o2.target)); } }); @@ -233,13 +233,13 @@ public class AVM2Graph extends Graph { int finStart = -1; for (int e = 0; e < body.exceptions.length; e++) { if (body.exceptions[e].isFinally()) { - if (addr == this.avm2code.fixAddrAfterDebugLine(body.exceptions[e].start)) { - if (afterCatchPos + 1 == code.adr2pos(this.avm2code.fixAddrAfterDebugLine(body.exceptions[e].end))) { + if (addr == avm2code.fixAddrAfterDebugLine(body.exceptions[e].start)) { + if (afterCatchPos + 1 == code.adr2pos(avm2code.fixAddrAfterDebugLine(body.exceptions[e].end))) { catchedFinallys.add(e); - AVM2Instruction jmpIns = this.avm2code.code.get(code.adr2pos(this.avm2code.fixAddrAfterDebugLine(body.exceptions[e].end))); + AVM2Instruction jmpIns = avm2code.code.get(code.adr2pos(avm2code.fixAddrAfterDebugLine(body.exceptions[e].end))); if (jmpIns.definition instanceof JumpIns) { - finStart = code.adr2pos(this.avm2code.fixAddrAfterDebugLine(body.exceptions[e].end) + jmpIns.getBytesLength() + jmpIns.operands[0]); + finStart = code.adr2pos(avm2code.fixAddrAfterDebugLine(body.exceptions[e].end) + jmpIns.getBytesLength() + jmpIns.operands[0]); GraphPart fpart = null; for (GraphPart p : allParts) { @@ -251,9 +251,9 @@ public class AVM2Graph extends Graph { TranslateStack st = (TranslateStack) stack.clone(); st.clear(); int swPos = -1; - for (int f = finStart; f < this.avm2code.code.size(); f++) { - if (this.avm2code.code.get(f).definition instanceof LookupSwitchIns) { - AVM2Instruction swins = this.avm2code.code.get(f); + for (int f = finStart; f < avm2code.code.size(); f++) { + if (avm2code.code.get(f).definition instanceof LookupSwitchIns) { + AVM2Instruction swins = avm2code.code.get(f); if (swins.operands.length >= 3) { if (swins.operands[0] == swins.getBytesLength()) { if (code.adr2pos(code.pos2adr(f) + swins.operands[2]) < finStart) { @@ -311,7 +311,7 @@ public class AVM2Graph extends Graph { for (int e = 0; e < catchedExceptions.size(); e++) { int eendpos; if (e < catchedExceptions.size() - 1) { - eendpos = code.adr2pos(this.avm2code.fixAddrAfterDebugLine(catchedExceptions.get(e + 1).target)) - 2; + eendpos = code.adr2pos(avm2code.fixAddrAfterDebugLine(catchedExceptions.get(e + 1).target)) - 2; } else { eendpos = afterCatchPos - 1; } @@ -428,16 +428,16 @@ public class AVM2Graph extends Graph { } if (part.nextParts.isEmpty()) { - if (this.avm2code.code.get(part.end).definition instanceof ReturnValueIns) { //returns in finally clause + if (avm2code.code.get(part.end).definition instanceof ReturnValueIns) { //returns in finally clause if (part.getHeight() >= 3) { - if (this.avm2code.code.get(part.getPosAt(part.getHeight() - 2)).definition instanceof KillIns) { - if (this.avm2code.code.get(part.getPosAt(part.getHeight() - 3)).definition instanceof GetLocalTypeIns) { + if (avm2code.code.get(part.getPosAt(part.getHeight() - 2)).definition instanceof KillIns) { + if (avm2code.code.get(part.getPosAt(part.getHeight() - 3)).definition instanceof GetLocalTypeIns) { if (output.size() >= 2) { if (output.get(output.size() - 2) instanceof SetLocalAVM2Item) { ret = new ArrayList<>(); ret.addAll(output); ret.remove(ret.size() - 1); - ret.add(new ReturnValueAVM2Item(this.avm2code.code.get(part.end), ((SetLocalAVM2Item) output.get(output.size() - 2)).value)); + ret.add(new ReturnValueAVM2Item(avm2code.code.get(part.end), ((SetLocalAVM2Item) output.get(output.size() - 2)).value)); return ret; } } @@ -446,7 +446,7 @@ public class AVM2Graph extends Graph { } } } - if ((this.avm2code.code.get(part.end).definition instanceof LookupSwitchIns) && (ignoredSwitches.containsValue(part.end) || ignoredSwitches2.contains(part.end))) { + if ((avm2code.code.get(part.end).definition instanceof LookupSwitchIns) && (ignoredSwitches.containsValue(part.end) || ignoredSwitches2.contains(part.end))) { ret = new ArrayList<>(); ret.addAll(output); return ret; @@ -455,16 +455,16 @@ public class AVM2Graph extends Graph { && (!stack.isEmpty()) && (stack.peek() instanceof StrictEqAVM2Item) && (part.nextParts.get(0).getHeight() >= 2) - && (this.avm2code.code.get(this.avm2code.fixIPAfterDebugLine(part.nextParts.get(0).start)).definition instanceof PushIntegerTypeIns) + && (avm2code.code.get(avm2code.fixIPAfterDebugLine(part.nextParts.get(0).start)).definition instanceof PushIntegerTypeIns) && (!part.nextParts.get(0).nextParts.isEmpty()) - && (this.avm2code.code.get(part.nextParts.get(0).nextParts.get(0).end).definition instanceof LookupSwitchIns)) + && (avm2code.code.get(part.nextParts.get(0).nextParts.get(0).end).definition instanceof LookupSwitchIns)) || ((part.nextParts.size() == 2) && (!stack.isEmpty()) && (stack.peek() instanceof StrictNeqAVM2Item) && (part.nextParts.get(1).getHeight() >= 2) - && (this.avm2code.code.get(this.avm2code.fixIPAfterDebugLine(part.nextParts.get(1).start)).definition instanceof PushIntegerTypeIns) + && (avm2code.code.get(avm2code.fixIPAfterDebugLine(part.nextParts.get(1).start)).definition instanceof PushIntegerTypeIns) && (!part.nextParts.get(1).nextParts.isEmpty()) - && (this.avm2code.code.get(part.nextParts.get(1).nextParts.get(0).end).definition instanceof LookupSwitchIns)))) { + && (avm2code.code.get(part.nextParts.get(1).nextParts.get(0).end).definition instanceof LookupSwitchIns)))) { if (stack.peek() instanceof StrictEqAVM2Item) { ignoredSwitches2.add(part.nextParts.get(0).nextParts.get(0).end); @@ -495,12 +495,12 @@ public class AVM2Graph extends Graph { if (tar instanceof StrictNeqAVM2Item) { tar = ((StrictNeqAVM2Item) tar).leftSide; } - caseValuesMap.put(this.avm2code.code.get(part.nextParts.get(reversed ? 0 : 1).start).operands[0], tar); + caseValuesMap.put(avm2code.code.get(part.nextParts.get(reversed ? 0 : 1).start).operands[0], tar); GraphPart switchLoc = part.nextParts.get(reversed ? 0 : 1).nextParts.get(0); - while ((this.avm2code.code.get(part.nextParts.get(reversed ? 1 : 0).end).definition instanceof IfStrictNeIns) - || (this.avm2code.code.get(part.nextParts.get(reversed ? 1 : 0).end).definition instanceof IfStrictEqIns)) { + while ((avm2code.code.get(part.nextParts.get(reversed ? 1 : 0).end).definition instanceof IfStrictNeIns) + || (avm2code.code.get(part.nextParts.get(reversed ? 1 : 0).end).definition instanceof IfStrictEqIns)) { part = part.nextParts.get(reversed ? 1 : 0); translatePart(localData, part, stack, staticOperation, null); tar = stack.pop(); @@ -510,7 +510,7 @@ public class AVM2Graph extends Graph { if (tar instanceof StrictNeqAVM2Item) { tar = ((StrictNeqAVM2Item) tar).leftSide; } - if (this.avm2code.code.get(part.end).definition instanceof IfStrictNeIns) { + if (avm2code.code.get(part.end).definition instanceof IfStrictNeIns) { reversed = false; } else { reversed = true; @@ -520,7 +520,7 @@ public class AVM2Graph extends Graph { TranslateStack sstack = new TranslateStack(path); do { for (int n = 0; n < numPart.getHeight(); n++) { - ins = this.avm2code.code.get(numPart.getPosAt(n)); + ins = avm2code.code.get(numPart.getPosAt(n)); if (ins.definition instanceof LookupSwitchIns) { break; } @@ -531,7 +531,7 @@ public class AVM2Graph extends Graph { } else { numPart = numPart.nextParts.get(0); } - } while (!(this.avm2code.code.get(numPart.end).definition instanceof LookupSwitchIns)); + } while (!(avm2code.code.get(numPart.end).definition instanceof LookupSwitchIns)); GraphTargetItem nt = sstack.peek(); if (!(nt instanceof IntegerValueAVM2Item)) { @@ -539,7 +539,7 @@ public class AVM2Graph extends Graph { } IntegerValueAVM2Item iv = (IntegerValueAVM2Item) nt; caseValuesMap.put((int) (long) iv.value, tar); - while (this.avm2code.code.get(part.nextParts.get(reversed ? 1 : 0).start).definition instanceof JumpIns) { + while (avm2code.code.get(part.nextParts.get(reversed ? 1 : 0).start).definition instanceof JumpIns) { reversed = false; part = part.nextParts.get(reversed ? 1 : 0); if (part instanceof GraphPartMulti) { @@ -549,7 +549,7 @@ public class AVM2Graph extends Graph { } boolean hasDefault = false; GraphPart dp = part.nextParts.get(reversed ? 1 : 0); - while (this.avm2code.code.get(dp.start).definition instanceof JumpIns) { + while (avm2code.code.get(dp.start).definition instanceof JumpIns) { if (dp instanceof GraphPartMulti) { dp = ((GraphPartMulti) dp).parts.get(0); } @@ -561,7 +561,7 @@ public class AVM2Graph extends Graph { TranslateStack sstack = new TranslateStack(path); do { for (int n = 0; n < numPart.getHeight(); n++) { - ins = this.avm2code.code.get(numPart.getPosAt(n)); + ins = avm2code.code.get(numPart.getPosAt(n)); if (ins.definition instanceof LookupSwitchIns) { break; } @@ -572,7 +572,7 @@ public class AVM2Graph extends Graph { } else { numPart = numPart.nextParts.get(0); } - } while (!(this.avm2code.code.get(numPart.end).definition instanceof LookupSwitchIns)); + } while (!(avm2code.code.get(numPart.end).definition instanceof LookupSwitchIns)); GraphTargetItem nt = sstack.peek(); if (nt instanceof IntegerValueAVM2Item) { hasDefault = true; @@ -688,7 +688,6 @@ public class AVM2Graph extends Graph { return p; } } - ret = null; } } ret = null; @@ -700,14 +699,14 @@ public class AVM2Graph extends Graph { } int pos = next.start; - int addr = this.avm2code.fixAddrAfterDebugLine(avm2code.pos2adr(pos)); + long addr = avm2code.fixAddrAfterDebugLine(avm2code.pos2adr(pos)); for (int e = 0; e < body.exceptions.length; e++) { if (body.exceptions[e].isFinally()) { - if (addr == this.avm2code.fixAddrAfterDebugLine(body.exceptions[e].start)) { + if (addr == avm2code.fixAddrAfterDebugLine(body.exceptions[e].start)) { if (true) { //afterCatchPos + 1 == code.adr2pos(this.code.fixAddrAfterDebugLine(body.exceptions[e].end))) { - AVM2Instruction jmpIns = this.avm2code.code.get(avm2code.adr2pos(this.avm2code.fixAddrAfterDebugLine(body.exceptions[e].end))); + AVM2Instruction jmpIns = avm2code.code.get(avm2code.adr2pos(avm2code.fixAddrAfterDebugLine(body.exceptions[e].end))); if (jmpIns.definition instanceof JumpIns) { - int finStart = avm2code.adr2pos(this.avm2code.fixAddrAfterDebugLine(body.exceptions[e].end) + jmpIns.getBytesLength() + jmpIns.operands[0]); + int finStart = avm2code.adr2pos(avm2code.fixAddrAfterDebugLine(body.exceptions[e].end) + jmpIns.getBytesLength() + jmpIns.operands[0]); if (!finallyJumps.containsKey(e)) { finallyJumps.put(e, new ArrayList<>()); }