mirror of
https://git.huckle.dev/Huckles-Minecraft-Archive/jpexs-decompiler.git
synced 2026-05-23 03:55:36 +00:00
plugin to fix the "bug" in issue #786
This commit is contained in:
74
libsrc/plugins/src/AS3JumpOverflowFix.java
Normal file
74
libsrc/plugins/src/AS3JumpOverflowFix.java
Normal file
@@ -0,0 +1,74 @@
|
||||
|
||||
import com.jpexs.decompiler.flash.SWF;
|
||||
import com.jpexs.decompiler.flash.abc.ABC;
|
||||
import com.jpexs.decompiler.flash.abc.types.MethodBody;
|
||||
import com.jpexs.decompiler.flash.abc.types.traits.Trait;
|
||||
import com.jpexs.decompiler.flash.action.Action;
|
||||
import com.jpexs.decompiler.flash.action.ActionList;
|
||||
import com.jpexs.decompiler.flash.action.swf4.ActionIf;
|
||||
import com.jpexs.decompiler.flash.action.swf4.ActionJump;
|
||||
import com.jpexs.decompiler.flash.helpers.SWFDecompilerListener;
|
||||
import com.jpexs.decompiler.graph.GraphTargetItem;
|
||||
import java.util.List;
|
||||
|
||||
public class AS3JumpOverflowFix implements SWFDecompilerListener {
|
||||
|
||||
@Override
|
||||
public byte[] proxyFileCatched(byte[] data) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void actionListParsed(ActionList actions, SWF swf) {
|
||||
if (actions.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
long startAddress = actions.get(0).getAddress();
|
||||
long endAddress = actions.get(actions.size() - 1).getAddress();
|
||||
for (int i = 0; i < actions.size(); i++) {
|
||||
Action action = actions.get(i);
|
||||
if (action instanceof ActionIf || action instanceof ActionJump) {
|
||||
Action container = (Action) actions.getContainer(i);
|
||||
long containerStartAddress = startAddress;
|
||||
if (container != null) {
|
||||
containerStartAddress = container.getAddress();
|
||||
}
|
||||
|
||||
if (action instanceof ActionIf) {
|
||||
ActionIf aIf = (ActionIf) action;
|
||||
long target = aIf.getTargetAddress();
|
||||
if (target < containerStartAddress && target + 0xffff < endAddress) {
|
||||
aIf.setJumpOffset(aIf.getJumpOffset() + 0xffff);
|
||||
}
|
||||
} else if (action instanceof ActionJump) {
|
||||
ActionJump aJump = (ActionJump) action;
|
||||
long target = aJump.getTargetAddress();
|
||||
if (target < containerStartAddress && target + 0xffff < endAddress) {
|
||||
aJump.setJumpOffset(aJump.getJumpOffset() + 0xffff);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void actionTreeCreated(List<GraphTargetItem> tree, SWF swf) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void swfParsed(SWF swf) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void abcParsed(ABC abc, SWF swf) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void methodBodyParsed(MethodBody body, SWF swf) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void avm2CodeRemoveTraps(String path, int classIndex, boolean isStatic, int scriptIndex, ABC abc, Trait trait, int methodInfo, MethodBody body) throws InterruptedException {
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user