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(ABC abc, 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 {
}
}