From a1bb35ba1c0926e8a1d482102e2bc8db8f144a66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Sun, 31 Jan 2021 09:13:36 +0100 Subject: [PATCH] better try..catch..finally detection --- libsrc/ffdec_lib/graphviz/try_finally_asc2.gv | 60 ++ .../ffdec_lib/graphviz/try_finally_asc2.png | Bin 0 -> 93388 bytes libsrc/ffdec_lib/graphviz/try_finally_flex.gv | 60 ++ .../ffdec_lib/graphviz/try_finally_flex.png | Bin 0 -> 91198 bytes .../graphviz/try_finally_swftools.gv | 44 + .../graphviz/try_finally_swftools.png | Bin 0 -> 71207 bytes .../decompiler/flash/abc/AVM2LocalData.java | 22 +- .../decompiler/flash/abc/avm2/AVM2Code.java | 40 +- .../flash/abc/avm2/graph/AVM2Graph.java | 788 +++++++++--------- .../flash/abc/types/MethodBody.java | 5 +- .../decompiler/flash/action/ActionGraph.java | 19 +- .../src/com/jpexs/decompiler/graph/Graph.java | 107 +-- .../decompiler/flash/ActionScript2Test.java | 2 + .../decompiler/flash/ActionScript3Test.java | 1 + .../testdata/cross_compile/bin/Main.air.swf | Bin 0 -> 2753 bytes .../testdata/cross_compile/bin/Main.flex.swf | Bin 0 -> 3629 bytes .../cross_compile/bin/Main.flex_apache.swf | Bin 0 -> 3617 bytes .../cross_compile/bin/Main.swftools.swf | Bin 0 -> 1525 bytes .../cross_compile/bin/expressInstall.swf | Bin 0 -> 773 bytes .../testdata/cross_compile/bin/index.html | 40 + .../cross_compile/bin/js/swfobject.js | 4 + .../cross_compile/build_air_debug.bat | 3 + .../testdata/cross_compile/build_debug.bat | 6 + .../cross_compile/build_flex_apache_debug.bat | 3 + .../cross_compile/build_flex_debug.bat | 3 + .../testdata/cross_compile/build_stub.bat | 19 + .../cross_compile/build_swftools_debug.bat | 4 + .../testdata/cross_compile/buildlog.air.txt | 3 + .../testdata/cross_compile/buildlog.flex.txt | 2 + .../cross_compile/buildlog.flex_apache.txt | 2 + .../cross_compile/buildlog.swftools.txt | 4 + .../cross_compile/cross_compile.as3proj | 95 +++ .../cross_compile/obj/cross_compileConfig.old | 48 ++ .../cross_compile/obj/cross_compileConfig.xml | 48 ++ .../testdata/cross_compile/src/Main.as | 34 + .../cross_compile/src/tests/TestTryCatch.as | 26 + .../src/tests/TestTryCatchExceptionUsage.as | 26 + .../src/tests/TestTryCatchIfInTry.as | 32 + .../src/tests/TestTryCatchLoop.as | 39 + .../cross_compile/src/tests/TestTryFinally.as | 30 + .../TestTryFinallyDirectReturnInFinally.as | 34 + .../src/tests/TestTryFinallyLoop.as | 38 + .../src/tests/TestTryFinallyLoopInFinally.as | 38 + .../src/tests/TestTryFinallyMultipleCatch.as | 35 + .../src/tests/TestTryFinallyReturn.as | 42 + .../tests/TestTryFinallyReturnInFinally.as | 44 + .../src/tests/TestTryFinallyReturnNested.as | 43 + .../src/tests/TestTryFinallyReturnVoid.as | 36 + nbproject/project.xml | 4 + 49 files changed, 1481 insertions(+), 452 deletions(-) create mode 100644 libsrc/ffdec_lib/graphviz/try_finally_asc2.gv create mode 100644 libsrc/ffdec_lib/graphviz/try_finally_asc2.png create mode 100644 libsrc/ffdec_lib/graphviz/try_finally_flex.gv create mode 100644 libsrc/ffdec_lib/graphviz/try_finally_flex.png create mode 100644 libsrc/ffdec_lib/graphviz/try_finally_swftools.gv create mode 100644 libsrc/ffdec_lib/graphviz/try_finally_swftools.png create mode 100644 libsrc/ffdec_lib/testdata/cross_compile/bin/Main.air.swf create mode 100644 libsrc/ffdec_lib/testdata/cross_compile/bin/Main.flex.swf create mode 100644 libsrc/ffdec_lib/testdata/cross_compile/bin/Main.flex_apache.swf create mode 100644 libsrc/ffdec_lib/testdata/cross_compile/bin/Main.swftools.swf create mode 100644 libsrc/ffdec_lib/testdata/cross_compile/bin/expressInstall.swf create mode 100644 libsrc/ffdec_lib/testdata/cross_compile/bin/index.html create mode 100644 libsrc/ffdec_lib/testdata/cross_compile/bin/js/swfobject.js create mode 100644 libsrc/ffdec_lib/testdata/cross_compile/build_air_debug.bat create mode 100644 libsrc/ffdec_lib/testdata/cross_compile/build_debug.bat create mode 100644 libsrc/ffdec_lib/testdata/cross_compile/build_flex_apache_debug.bat create mode 100644 libsrc/ffdec_lib/testdata/cross_compile/build_flex_debug.bat create mode 100644 libsrc/ffdec_lib/testdata/cross_compile/build_stub.bat create mode 100644 libsrc/ffdec_lib/testdata/cross_compile/build_swftools_debug.bat create mode 100644 libsrc/ffdec_lib/testdata/cross_compile/buildlog.air.txt create mode 100644 libsrc/ffdec_lib/testdata/cross_compile/buildlog.flex.txt create mode 100644 libsrc/ffdec_lib/testdata/cross_compile/buildlog.flex_apache.txt create mode 100644 libsrc/ffdec_lib/testdata/cross_compile/buildlog.swftools.txt create mode 100644 libsrc/ffdec_lib/testdata/cross_compile/cross_compile.as3proj create mode 100644 libsrc/ffdec_lib/testdata/cross_compile/obj/cross_compileConfig.old create mode 100644 libsrc/ffdec_lib/testdata/cross_compile/obj/cross_compileConfig.xml create mode 100644 libsrc/ffdec_lib/testdata/cross_compile/src/Main.as create mode 100644 libsrc/ffdec_lib/testdata/cross_compile/src/tests/TestTryCatch.as create mode 100644 libsrc/ffdec_lib/testdata/cross_compile/src/tests/TestTryCatchExceptionUsage.as create mode 100644 libsrc/ffdec_lib/testdata/cross_compile/src/tests/TestTryCatchIfInTry.as create mode 100644 libsrc/ffdec_lib/testdata/cross_compile/src/tests/TestTryCatchLoop.as create mode 100644 libsrc/ffdec_lib/testdata/cross_compile/src/tests/TestTryFinally.as create mode 100644 libsrc/ffdec_lib/testdata/cross_compile/src/tests/TestTryFinallyDirectReturnInFinally.as create mode 100644 libsrc/ffdec_lib/testdata/cross_compile/src/tests/TestTryFinallyLoop.as create mode 100644 libsrc/ffdec_lib/testdata/cross_compile/src/tests/TestTryFinallyLoopInFinally.as create mode 100644 libsrc/ffdec_lib/testdata/cross_compile/src/tests/TestTryFinallyMultipleCatch.as create mode 100644 libsrc/ffdec_lib/testdata/cross_compile/src/tests/TestTryFinallyReturn.as create mode 100644 libsrc/ffdec_lib/testdata/cross_compile/src/tests/TestTryFinallyReturnInFinally.as create mode 100644 libsrc/ffdec_lib/testdata/cross_compile/src/tests/TestTryFinallyReturnNested.as create mode 100644 libsrc/ffdec_lib/testdata/cross_compile/src/tests/TestTryFinallyReturnVoid.as diff --git a/libsrc/ffdec_lib/graphviz/try_finally_asc2.gv b/libsrc/ffdec_lib/graphviz/try_finally_asc2.gv new file mode 100644 index 000000000..f03124823 --- /dev/null +++ b/libsrc/ffdec_lib/graphviz/try_finally_asc2.gv @@ -0,0 +1,60 @@ + +digraph try_finally_asc2 { + label = "Try..Finally clause in ASC2"; + node[shape=rect]; + + start->before; + before->finally_init->in_try; + try_f_begin->in_try; + try_c_begin->in_try; + in_try->finally; + try_c_end->finally; + in_catch->finally; + try_c_target->in_catch; + try_f_end->finally; + try_f_target->catch_f->finally:ne; + + finally->lookupswitch; + + lookupswitch->after; + lookupswitch->finally_throw[label="X"]; + + after->end; + + finally_init[label="loc_N=0;"]; + catch_f[label="loc_E = exception;\lloc_N = X;\l"]; + finally_throw[label="throw loc_E;"]; + + try_c_target[shape=ellipse]; + try_c_begin[shape=ellipse]; + try_c_end[shape=ellipse]; + + try_f_target[shape=ellipse]; + try_f_begin[shape=ellipse]; + try_f_end[shape=ellipse]; + + start[shape=ellipse]; + end[shape=ellipse]; + + lookupswitch[label="lookupswitch(loc_N)"] + + in_try->in_try_ret[label=return]; + in_try_ret[label="loc_R = returnedValue;\lloc_N = Y;\l"] + in_try_ret->finally; + lookupswitch->finally_return[label="Y"]; + finally_return[label="return loc_R;"]; + + in_try->in_try_continue[label=continue]; + in_try_continue[label="loc_N = Z;"] + in_try_continue->finally; + lookupswitch->finally_continue[label="Z"]; + finally_continue[label="continue label;"]; + + /* + All ways go through finally clause. There is also lookupswitch with getlocal. + Local register is set before entering in_try block. + For every return/continue, there is local register set to specific value. + Lookupswitch then decides what will happen. + */ + +} \ No newline at end of file diff --git a/libsrc/ffdec_lib/graphviz/try_finally_asc2.png b/libsrc/ffdec_lib/graphviz/try_finally_asc2.png new file mode 100644 index 0000000000000000000000000000000000000000..5a726b7760018b0f6bcfb7ef3c5c85b24e69fce2 GIT binary patch literal 93388 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

HGU2 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 + before->in_try; + try_f_begin->in_try; + try_c_begin->in_try; + in_try->pushbyteminusone; + try_c_end->pushbyteminusone; + in_catch->pushbyteminusone; + pushbyteminusone->finally; + try_c_target->in_catch; + try_f_end->finally; + try_f_target->catch_f->finally:ne; + + finally->lookupswitch; + + lookupswitch->after; + lookupswitch->finally_throw[label="X"]; + + after->end; + + pushbyteminusone[label="pushbyte -1"]; + catch_f[label="loc_E = exception;\lpushbyte X;\l"]; + finally_throw[label="throw loc_E;"]; + + try_c_target[shape=ellipse]; + try_c_begin[shape=ellipse]; + try_c_end[shape=ellipse]; + + try_f_target[shape=ellipse]; + try_f_begin[shape=ellipse]; + try_f_end[shape=ellipse]; + + start[shape=ellipse]; + end[shape=ellipse]; + + lookupswitch[label="lookupswitch(§§pop())"] + + in_try->in_try_ret[label=return]; + in_try_ret[label="loc_R = returnedValue;\lpushbyte Y;\l"] + in_try_ret->finally; + lookupswitch->finally_return[label="Y"]; + finally_return[label="return loc_R;"]; + + in_try->in_try_continue[label=continue]; + in_try_continue[label="pushbyte Z;"] + in_try_continue->finally; + lookupswitch->finally_continue[label="Z"]; + finally_continue[label="continue label;"]; + + /* + All ways go through finally clause. There is also lookupswitch which uses value on stack.. + Value -1 is pushed on stack after in_try and after catch bodys. + For every return/continue, there is also specific value pushed to stack. + Lookupswitch then decides what will happen. + */ + +} \ No newline at end of file diff --git a/libsrc/ffdec_lib/graphviz/try_finally_flex.png b/libsrc/ffdec_lib/graphviz/try_finally_flex.png new file mode 100644 index 0000000000000000000000000000000000000000..4c097bb3968c59893cf8b27149cd8463aa045a76 GIT binary patch literal 91198 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 + before->in_try; + try_f_begin->in_try; + try_c_begin->in_try; + in_try->finally; + try_c_end->finally; + in_catch->finally; + try_c_target->in_catch; + try_f_end->finally; + try_f_target->catch_f; + + finally->after; + + + + after->end; + + catch_f[label="finally;\lthrow exception;\l"]; + try_c_target[shape=ellipse]; + try_c_begin[shape=ellipse]; + try_c_end[shape=ellipse]; + + try_f_target[shape=ellipse]; + try_f_begin[shape=ellipse]; + try_f_end[shape=ellipse]; + + start[shape=ellipse]; + end[shape=ellipse]; + + in_try->in_try_ret[label=return]; + in_try_ret[label="§§push(returnedValue);\lfinally;\lreturn §§pop();\l"] + + in_try->in_try_continue[label=continue]; + in_try_continue[label="finally;\lcontinue label;\l"]; + + /* + Finally is inlined in every its usage. + In try_f_target there is finnally alone with throw - we can take it from there. + */ +} diff --git a/libsrc/ffdec_lib/graphviz/try_finally_swftools.png b/libsrc/ffdec_lib/graphviz/try_finally_swftools.png new file mode 100644 index 0000000000000000000000000000000000000000..dbd3826fab95a9d3778e1358d5fb8879352bcc40 GIT binary patch literal 71207 zcmeFZcQn_1{6DNxA$ujE2vKH3NaSON%#7?=h?KHd!wQjIQ9{ZnDiXW_^E>DMqHie7ru_v^7;|sMx8<$jE4psVeG{ zk&!Erk!|3h*o5Dd9NA7uMz)jen49=>|re>P2B-KjuM6MAX=m37RvOwn2E z9dEAR!@MrFu%+L!C#Ps%(0V)LlUBRbdUBX=t(QNVV6|(bZgi{R&wr`EzWvbI|M{1i5=wf8zdswfgLxGH{xHX} zh5h@rj<&S`>EEyAuccD__hG(jN~P81Us_JRB{X{tb8C~OE{ORrdj^Jt>=F{9w(wuz z8|lirI@j+*=TbSt+8n<(gidam{`lJT{e8hM_UNk2hStZ zGRD!jk6+@0Q=@s+gM)S9o>QMLk0pky?n$9mVq{`s*t#_Yf0uqNmf!Qs^+P)Y&pjJ% zjNY(u3#;O-eRkTof5mk3-o`k=*f-Tpw-4^kHh3I%_T#h9OOw?N_&Yl}Hy+|=T7GVF zpdm}|VZL1p>#L+gbi0%zjwXtjy)JUl>w0vODMKxu)L-EhEpAiKyd)y%e6rBCMqRWr zu)^!t;PpfO&wE{}ue%O6r=G~t6)-LmFb`O98*00=z30hkkCs)}p~lOH27H;Y0;HA2 z83uOtF#nZBtIqq!jLKa3W+w-tun0~5TS8@C>?TF)J=C-sdtWd=_M~0=>ABCg*NaF& zRQ3Z^M~D^6P*1de^WgaV>HxX6WT~r&r%wX`f86HZdrb7z)P-+7|NFbnSYH_vv2j&@ zR(+_sWZ2wB-zwqRAJ4`Mn@F6-p&vzhKQf(pFQSYHsec3;U?UUcEfMg_ct~ zkZHH(bK8BNN4j%V)zn^G-Ap(2`-fiQ=<2tWfOFs4I1%+5wu+k9{&@3n?GXp6cl`YM z^L>#6)7xCLGY5_NczD)V`phZk7(BlBZd9khT8Vkj35uRVy9?}ZnT3s+iyga3NfORt z7r$!@8Re5L%}q8uHYt^vilq0tTckaN+v0hsvJLajcE4^;6peBp|6sNF`^WoImmRAM z-*!a3b6s8bBBJT@=g*mX4Q>#mp>H0Ya^Iwx(#BA!RADNWWszh-qSzGhmmGR

g_M~A+x7o3i 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 literal 0 HcmV?d00001 diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/AVM2LocalData.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/AVM2LocalData.java index 646b8923b..acf1ace6e 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/AVM2LocalData.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/AVM2LocalData.java @@ -12,18 +12,21 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.abc; import com.jpexs.decompiler.flash.BaseLocalData; import com.jpexs.decompiler.flash.abc.avm2.AVM2Code; import com.jpexs.decompiler.flash.abc.avm2.AVM2ConstantPool; +import com.jpexs.decompiler.flash.abc.avm2.CodeStats; import com.jpexs.decompiler.flash.abc.types.ABCException; import com.jpexs.decompiler.flash.abc.types.InstanceInfo; import com.jpexs.decompiler.flash.abc.types.MethodBody; import com.jpexs.decompiler.flash.abc.types.MethodInfo; import com.jpexs.decompiler.flash.abc.types.ScriptInfo; import com.jpexs.decompiler.graph.DottedChain; +import com.jpexs.decompiler.graph.GraphPart; import com.jpexs.decompiler.graph.GraphTargetItem; import com.jpexs.decompiler.graph.ScopeStack; import java.util.ArrayList; @@ -57,11 +60,17 @@ public class AVM2LocalData extends BaseLocalData { public ArrayList parsedExceptions; - public Map> finallyJumps; + //public Map> finallyJumps; + /** + * Mapped jumps from pushbyte xx part to apropriate lookupswitch branch + */ + public Map finallyJumps = new HashMap<>(); - public Map ignoredSwitches; + //public Map ignoredSwitches; + //exception index => switchPart + public Map ignoredSwitches; - public List ignoredSwitches2; + //public List ignoredSwitches2; public Integer scriptIndex; @@ -77,6 +86,8 @@ public class AVM2LocalData extends BaseLocalData { public Map> setLocalPosToGetLocalPos = new HashMap<>(); + public CodeStats codeStats; + public AVM2LocalData() { } @@ -103,7 +114,7 @@ public class AVM2LocalData extends BaseLocalData { parsedExceptions = localData.parsedExceptions; finallyJumps = localData.finallyJumps; ignoredSwitches = localData.ignoredSwitches; - ignoredSwitches2 = localData.ignoredSwitches2; + //ignoredSwitches2 = localData.ignoredSwitches2; scriptIndex = localData.scriptIndex; localRegAssignmentIps = localData.localRegAssignmentIps; ip = localData.ip; @@ -111,6 +122,7 @@ public class AVM2LocalData extends BaseLocalData { code = localData.code; thisHasDefaultToPrimitive = localData.thisHasDefaultToPrimitive; setLocalPosToGetLocalPos = localData.setLocalPosToGetLocalPos; + codeStats = localData.codeStats; } public AVM2ConstantPool getConstants() { 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 76e844fba..d9ff67275 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 @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.abc.avm2; import com.jpexs.decompiler.flash.EndOfStreamException; @@ -1493,21 +1494,30 @@ public class AVM2Code implements Cloneable { } } - public int fixIPAfterDebugLine(int ip) { + public int getIpThroughJumpAndDebugLine(int ip) { if (code.isEmpty()) { return ip; } if (ip >= code.size()) { return code.size() - 1; } - while (code.get(ip).definition instanceof DebugLineIns) { - ip++; + while (ip < code.size()) { + if (code.get(ip).definition instanceof DebugLineIns) { + ip++; + } else if (code.get(ip).definition instanceof JumpIns) { + ip = adr2pos(pos2adr(ip + 1) + code.get(ip).operands[0]); + } else { + break; + } + } + if (ip >= code.size()) { + return code.size() - 1; } return ip; } - public long fixAddrAfterDebugLine(long addr) throws ConvertException { - return pos2adr(fixIPAfterDebugLine(adr2pos(addr, true))); + public long getAddrThroughJumpAndDebugLine(long addr) throws ConvertException { + return pos2adr(getIpThroughJumpAndDebugLine(adr2pos(addr, true))); } public ConvertOutput toSourceOutput(Map> setLocalPosToGetLocalPos, boolean thisHasDefaultToPrimitive, Reference lineStartItem, String path, GraphPart part, boolean processJumps, boolean isStatic, int scriptIndex, int classIndex, HashMap localRegs, TranslateStack stack, ScopeStack scopeStack, ABC abc, MethodBody body, int start, int end, HashMap localRegNames, List fullyQualifiedNames, boolean[] visited, HashMap localRegAssigmentIps, HashMap> refs) throws ConvertException, InterruptedException { @@ -2373,7 +2383,7 @@ public class AVM2Code implements Cloneable { } } - private boolean walkCode(CodeStats stats, int pos, int stack, int scope, ABC abc) { + private boolean walkCode(CodeStats stats, int pos, int stack, int scope, ABC abc, boolean autoFill) { while (pos < code.size()) { AVM2Instruction ins = code.get(pos); if (stats.instructionStats[pos].seen) { @@ -2383,7 +2393,9 @@ public class AVM2Code implements Cloneable { if (ins.definition instanceof NewFunctionIns) { MethodBody innerBody = abc.findBody(ins.operands[0]); - innerBody.autoFillStats(abc, stats.initscope + (stats.has_activation ? 1 : 0), false); + if (autoFill) { + innerBody.autoFillStats(abc, stats.initscope + (stats.has_activation ? 1 : 0), false); + } } stats.instructionStats[pos].seen = true; @@ -2445,7 +2457,7 @@ public class AVM2Code implements Cloneable { } else if (ins.definition instanceof IfTypeIns) { try { int newpos = adr2pos(ins.getTargetAddress()); - walkCode(stats, newpos, stack, scope, abc); + walkCode(stats, newpos, stack, scope, abc, autoFill); } catch (ConvertException ex) { return false; } @@ -2457,7 +2469,7 @@ public class AVM2Code implements Cloneable { } try { int newpos = adr2pos(pos2adr(pos) + ins.operands[i]); - if (!walkCode(stats, newpos, stack, scope, abc)) { + if (!walkCode(stats, newpos, stack, scope, abc, autoFill)) { return false; } } catch (ConvertException ex) { @@ -2470,10 +2482,10 @@ public class AVM2Code implements Cloneable { return true; } - public CodeStats getStats(ABC abc, MethodBody body, int initScope) { + public CodeStats getStats(ABC abc, MethodBody body, int initScope, boolean autoFill) { CodeStats stats = new CodeStats(this); stats.initscope = initScope; - if (!walkCode(stats, 0, 0, initScope, abc)) { + if (!walkCode(stats, 0, 0, initScope, abc, autoFill)) { return null; } int scopePos = -1; @@ -2490,7 +2502,7 @@ public class AVM2Code implements Cloneable { visited.add(i); } } - if (!walkCode(stats, adr2pos(ex.target), 1 + (ex.isFinally() ? 1 : 0), scopePos, abc)) { + if (!walkCode(stats, adr2pos(ex.target), 1, scopePos, abc, autoFill)) { return null; } int maxIp = 0; @@ -2516,7 +2528,7 @@ public class AVM2Code implements Cloneable { stats.instructionStats[i].seen = false; } // Rerun rest with new scopePos, stackPos - if (!walkCode(stats, nextIp, origStackPos + 1/*magic!*/, scopePos - 1 /*magic!*/, abc)) { + if (!walkCode(stats, nextIp, origStackPos + 1/*magic!*/, scopePos - 1 /*magic!*/, abc, autoFill)) { return null; } scopePos--; 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 2f44e29f1..99e330526 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 @@ -36,6 +36,7 @@ import com.jpexs.decompiler.flash.abc.avm2.instructions.localregs.SetLocalTypeIn import com.jpexs.decompiler.flash.abc.avm2.instructions.other.HasNext2Ins; import com.jpexs.decompiler.flash.abc.avm2.instructions.other2.DecLocalPIns; import com.jpexs.decompiler.flash.abc.avm2.instructions.other2.IncLocalPIns; +import com.jpexs.decompiler.flash.abc.avm2.instructions.stack.PushByteIns; import com.jpexs.decompiler.flash.abc.avm2.model.AVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.FilteredCheckAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.FullMultinameAVM2Item; @@ -70,6 +71,8 @@ import com.jpexs.decompiler.graph.GraphTargetItem; import com.jpexs.decompiler.graph.Loop; import com.jpexs.decompiler.graph.ScopeStack; import com.jpexs.decompiler.graph.TranslateStack; +import com.jpexs.decompiler.graph.model.BreakItem; +import com.jpexs.decompiler.graph.model.ContinueItem; import com.jpexs.decompiler.graph.model.ExitItem; import com.jpexs.decompiler.graph.model.GotoItem; import com.jpexs.decompiler.graph.model.IfItem; @@ -138,56 +141,119 @@ public class AVM2Graph extends Graph { } @Override - protected void beforePrintGraph(BaseLocalData localData, String path, Set allParts, List loops) { - Map ignoredSwitches = getIgnoredSwitches(allParts); - Map> setLocalPosToGetLocalPos = calculateLocalRegsUsage(new HashSet(ignoredSwitches.values()), path, allParts); + protected void beforePrintGraph(BaseLocalData localData, String path, Set allParts, List loops) throws InterruptedException { AVM2LocalData avm2LocalData = ((AVM2LocalData) localData); + avm2LocalData.codeStats = avm2LocalData.code.getStats(avm2LocalData.abc, avm2LocalData.methodBody, avm2LocalData.methodBody.init_scope_depth, false); + getIgnoredSwitches((AVM2LocalData) localData, allParts); + Set integerSwitchesIps = new HashSet<>(); + for (GraphPart p : ((AVM2LocalData) localData).ignoredSwitches.values()) { + integerSwitchesIps.add(p.end); + } + Map> setLocalPosToGetLocalPos = calculateLocalRegsUsage(integerSwitchesIps, path, allParts); avm2LocalData.setLocalPosToGetLocalPos = setLocalPosToGetLocalPos; - } - private Map getIgnoredSwitches(Set allParts) { - Map ignoredSwitches = new HashMap<>(); - int finStart; + private void getIgnoredSwitches(AVM2LocalData localData, Set allParts) throws InterruptedException { + for (int e = 0; e < body.exceptions.length; e++) { - if (body.exceptions[e].isFinally()) { - { - { - AVM2Instruction jmpIns = avm2code.code.get(code.adr2pos(avm2code.fixAddrAfterDebugLine(body.exceptions[e].end))); + ABCException ex = body.exceptions[e]; + if (!ex.isFinally()) { + continue; + } - if (jmpIns.definition instanceof JumpIns) { - finStart = code.adr2pos(avm2code.fixAddrAfterDebugLine(body.exceptions[e].end) + jmpIns.getBytesLength() + jmpIns.operands[0]); - - GraphPart fpart = null; - for (GraphPart p : allParts) { - if (p.start == finStart) { - fpart = p; - break; - } - } - int swPos = -1; - 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) { - swPos = f; - - break; - } - } - } - } - } - ignoredSwitches.put(e, swPos); - break; - } - } + GraphPart finallyTryTargetPart = null; + int targetIp = code.adr2pos(ex.target); + for (GraphPart p : allParts) { + if (targetIp >= p.start && targetIp <= p.end) { + finallyTryTargetPart = p; + break; } } + + GraphPart finallyPart = finallyTryTargetPart.nextParts.size() > 0 ? finallyTryTargetPart.nextParts.get(0) : null; + + TranslateStack finallyTryTargetStack = (TranslateStack) new TranslateStack("try_target"); + + AVM2LocalData localData2 = new AVM2LocalData(localData); + localData2.scopeStack = new ScopeStack(); + + List targetOutput = translatePart(localData2, finallyTryTargetPart, finallyTryTargetStack, 0 /*??*/, "try_target"); + + final int FINALLY_KIND_STACK_BASED = 0; + final int FINALLY_KIND_REGISTER_BASED = 1; + final int FINALLY_KIND_INLINED = 2; + final int FINALLY_KIND_UNKNOWN = -1; + + int switchedReg = -1; + int finallyKind = FINALLY_KIND_UNKNOWN; + if (finallyTryTargetStack.size() == 1) { + finallyKind = FINALLY_KIND_STACK_BASED; + } else if (targetOutput.size() >= 2 + && (targetOutput.get(targetOutput.size() - 1) instanceof SetLocalAVM2Item) + && (targetOutput.get(targetOutput.size() - 2) instanceof SetLocalAVM2Item)) { + switchedReg = ((SetLocalAVM2Item) targetOutput.get(targetOutput.size() - 1)).regIndex; + finallyKind = FINALLY_KIND_REGISTER_BASED; + } else if (!targetOutput.isEmpty() && (targetOutput.get(targetOutput.size() - 1) instanceof ThrowAVM2Item)) { + //inlined to single part + //TODO: maybe replace all instances of exit nodes of try block + finallyKind = FINALLY_KIND_INLINED; + } else { + //probably inlined code in more parts, cannot do :-( + } + + if (finallyKind == FINALLY_KIND_STACK_BASED) { + + /* + Search for a lookupswitch which first pops from the stack + */ + List foundIps = new ArrayList<>(); + List foundParts = new ArrayList<>(); + int stackAfter = localData.codeStats.instructionStats[finallyTryTargetPart.end].stackpos_after; + + //int stackAfter = localData.codeStats.instructionStats[finallyPart.start].stackpos; + findAllPops(localData, stackAfter, finallyPart, foundIps, foundParts, new HashSet<>()); + int switchIp = -1; + GraphPart switchPart = null; + for (int i = 0; i < foundIps.size(); i++) { + int ip = foundIps.get(i); + if (avm2code.code.get(ip).definition instanceof LookupSwitchIns) { + switchIp = ip; + switchPart = foundParts.get(i); + } + } + if (switchIp > -1 && switchPart != null) { + for (GraphPart r : finallyPart.refs) { + for (int ip = r.end; ip >= r.start; ip--) { + AVM2Instruction ins = avm2code.code.get(ip); + if (ins.definition instanceof JumpIns) { + continue; + } else if (ins.definition instanceof PushByteIns) { + int val = ins.operands[0]; + if (val < 0 || val > switchPart.nextParts.size() - 2) { + localData.finallyJumps.put(r, switchPart.nextParts.get(0)); //default branch + } else { + localData.finallyJumps.put(r, switchPart.nextParts.get(1 + val)); + } + } + } + } + + //return in finally block is joined after switch decision + for (GraphPart p : switchPart.nextParts) { + for (GraphPart r : p.refs) { + if (r != switchPart) { + localData.finallyJumps.put(r, p); + } + } + } + + localData.ignoredSwitches.put(e, switchPart); + } else { + //there is probably return in all branches and no other way outside finally + } + + } } - return ignoredSwitches; } public Map> calculateLocalRegsUsage(Set ignoredSwitches, String path, Set allParts) { @@ -345,315 +411,231 @@ public class AVM2Graph extends Graph { for (GraphPart p : allBlocks) { if (avm2code.pos2adr(p.start) >= ex.start && avm2code.pos2adr(p.end) <= ex.end && target != null) { //Logger.getLogger(Graph.class.getName()).fine("ADDING throwpart " + target + " to " + p); - p.throwParts.add(target); - target.refs.add(p); + //p.throwParts.add(target); + //target.refs.add(p); } } } } + private void findNearestPartOutsideTry(AVM2LocalData localData, GraphPart part, int tryEndIp, Set visited, Set result) { + if (visited.contains(part)) { + return; + } + + if (part.start >= tryEndIp || part.end >= tryEndIp) { + result.add(part); + return; + } + + if (localData.finallyJumps.containsKey(part)) { + GraphPart afterSwitchPart = localData.finallyJumps.get(part); + GraphPart switchPart = null; + for (GraphPart r : afterSwitchPart.refs) { + if (localData.ignoredSwitches.containsValue(r)) { + switchPart = r; + } + } + + if (switchPart != null) { + return; + } + } + + for (GraphPart n : part.nextParts) { + findNearestPartOutsideTry(localData, n, tryEndIp, visited, result); + } + } + + private Set findNearestPartOutsideTry(AVM2LocalData localData, GraphPart start, int tryEndIp) { + Set result = new HashSet<>(); + findNearestPartOutsideTry(localData, start, tryEndIp, new HashSet<>(), result); + return result; + } + + private void findAllPops(AVM2LocalData localData, int stackLevel, GraphPart part, List foundIps, List foundParts, Set visited) { + if (visited.contains(part)) { + return; + } + visited.add(part); + for (int ip = part.start; ip <= part.end; ip++) { + if (localData.codeStats.instructionStats[ip].stackpos_after == stackLevel - 1) { + foundIps.add(ip); + foundParts.add(part); + return; + } + } + for (GraphPart n : part.nextParts) { + findAllPops(localData, stackLevel, n, foundIps, foundParts, visited); + } + } + + private List checkTry(List output, List foundGotos, Map> partCodes, Map partCodePos, AVM2LocalData localData, GraphPart part, List stopPart, List loops, Set allParts, TranslateStack stack, int staticOperation, String path) throws InterruptedException { + if (localData.parsedExceptions == null) { + localData.parsedExceptions = new ArrayList<>(); + } + List parsedExceptions = localData.parsedExceptions; + if (localData.finallyJumps == null) { + localData.finallyJumps = new HashMap<>(); + } + if (localData.ignoredSwitches == null) { + localData.ignoredSwitches = new HashMap<>(); + } + long addr = avm2code.getAddrThroughJumpAndDebugLine(avm2code.pos2adr(part.start)); + long maxEndAddr = -1; + List catchedExceptions = new ArrayList<>(); + ABCException finallyException = null; + int endIp = -1; + int finallyIndex = -1; + for (int e = 0; e < body.exceptions.length; e++) { + if (addr == avm2code.getAddrThroughJumpAndDebugLine(body.exceptions[e].start)) { + if (!parsedExceptions.contains(body.exceptions[e])) { + long endAddr = avm2code.getAddrThroughJumpAndDebugLine(body.exceptions[e].end); + if (endAddr > maxEndAddr) { + catchedExceptions.clear(); + finallyException = null; + finallyIndex = -1; + maxEndAddr = avm2code.getAddrThroughJumpAndDebugLine(body.exceptions[e].end); + endIp = avm2code.adr2pos(maxEndAddr); + catchedExceptions.add(body.exceptions[e]); + } else if (endAddr == maxEndAddr) { + catchedExceptions.add(body.exceptions[e]); + } + if (body.exceptions[e].isFinally()) { + finallyException = body.exceptions[e]; + finallyIndex = e; + } + } + } + } + if (catchedExceptions.size() > 0) { + parsedExceptions.addAll(catchedExceptions); + if (finallyException != null) { + catchedExceptions.remove(finallyException); + } + List tryCommands = new ArrayList<>(); + List> catchCommands = new ArrayList<>(); + List finallyCommands = new ArrayList<>(); + + GraphPart afterPart = null; + for (GraphPart p : allParts) { + if (endIp >= p.start && endIp <= p.end) { + afterPart = p; + break; + } + } + + stack.clear(); //If the original code (before check()) had "if" in it, there would be something on stack + + for (ABCException ex : catchedExceptions) { + + TranslateStack st2 = (TranslateStack) stack.clone(); + st2.clear(); + st2.add(new ExceptionAVM2Item(ex)); + + GraphPart catchPart = null; + for (GraphPart p : allParts) { + if (p.start == avm2code.adr2pos(ex.target)) { + catchPart = p; + break; + } + } + AVM2LocalData localData2 = new AVM2LocalData(localData); + localData2.scopeStack = new ScopeStack(); + + List stopPart2 = new ArrayList<>(stopPart); + stopPart2.add(afterPart); + + List currentCatchCommands = printGraph(foundGotos, partCodes, partCodePos, localData2, st2, allParts, null, catchPart, stopPart2, loops, staticOperation, path); + if (!currentCatchCommands.isEmpty() && (currentCatchCommands.get(0) instanceof SetLocalAVM2Item)) { + if (currentCatchCommands.get(0).value.getNotCoerced() instanceof ExceptionAVM2Item) { + currentCatchCommands.remove(0); + } + } + catchCommands.add(currentCatchCommands); + } + + if (finallyException == null) { + List stopPart2 = new ArrayList<>(stopPart); + stopPart2.add(afterPart); + tryCommands = printGraph(foundGotos, partCodes, partCodePos, localData, stack, allParts, null, part, stopPart2, loops, staticOperation, path); + } + + if (finallyException != null) { + afterPart = null; + GraphPart finallyTryTargetPart = null; + int targetPos = avm2code.adr2pos(finallyException.target); + for (GraphPart p : allParts) { + if (p.start == targetPos) { + finallyTryTargetPart = p; + break; + } + } + + GraphPart finallyPart = finallyTryTargetPart.nextParts.isEmpty() ? null : finallyTryTargetPart.nextParts.get(0); + + List tryStopPart = new ArrayList<>(stopPart); + if (finallyPart != null) { + tryStopPart.add(finallyPart); + } + tryCommands = printGraph(foundGotos, partCodes, partCodePos, localData, stack, allParts, null, part, tryStopPart, loops, staticOperation, path); + makeAllCommands(tryCommands, stack); + processIfs(tryCommands); + + //there should be §§push(-1) left + if (!tryCommands.isEmpty() + && (tryCommands.get(tryCommands.size() - 1) instanceof PushItem) + && (tryCommands.get(tryCommands.size() - 1).value instanceof IntegerValueAVM2Item)) { + tryCommands.remove(tryCommands.size() - 1); + } + + List finallyStopPart = new ArrayList<>(stopPart); + GraphPart switchPart = localData.ignoredSwitches.containsKey(finallyIndex) ? localData.ignoredSwitches.get(finallyIndex) : null; + if (switchPart != null) { + finallyStopPart.add(switchPart); + } + if (finallyPart != null) { + finallyCommands = printGraph(foundGotos, partCodes, partCodePos, localData, stack, allParts, null, finallyPart, finallyStopPart, loops, staticOperation, path); + } + if (switchPart != null) { + finallyCommands.addAll(translatePart(localData, switchPart, stack, staticOperation, path)); + afterPart = switchPart.nextParts.get(0); //take the default branch + } + stack.pop(); + + if (tryCommands.size() == 1 + && (tryCommands.get(0) instanceof TryAVM2Item) + && catchCommands.isEmpty() + && ((TryAVM2Item) tryCommands.get(0)).finallyCommands.isEmpty()) { + catchCommands = ((TryAVM2Item) tryCommands.get(0)).catchCommands; + catchedExceptions = ((TryAVM2Item) tryCommands.get(0)).catchExceptions; + tryCommands = ((TryAVM2Item) tryCommands.get(0)).tryCommands; + } + } + if (catchCommands.isEmpty() && finallyCommands.isEmpty() && tryCommands.isEmpty()) { + return null; + } + List ret = new ArrayList<>(); + ret.add(new TryAVM2Item(tryCommands, catchedExceptions, catchCommands, finallyCommands, "TODO")); + + if (afterPart != null) { + ret.addAll(printGraph(foundGotos, partCodes, partCodePos, localData, stack, allParts, null, afterPart, stopPart, loops, staticOperation, path)); + } + return ret; + } + return null; + } + @Override protected List check(List foundGotos, Map> partCodes, Map partCodePos, GraphSource code, BaseLocalData localData, Set allParts, TranslateStack stack, GraphPart parent, GraphPart part, List stopPart, List loops, List output, Loop currentLoop, int staticOperation, String path) throws InterruptedException { List ret = null; AVM2LocalData aLocalData = (AVM2LocalData) localData; - if (aLocalData.parsedExceptions == null) { - aLocalData.parsedExceptions = new ArrayList<>(); - } - List parsedExceptions = aLocalData.parsedExceptions; - if (aLocalData.finallyJumps == null) { - aLocalData.finallyJumps = new HashMap<>(); - } - Map> finallyJumps = aLocalData.finallyJumps; - if (aLocalData.ignoredSwitches == null) { - aLocalData.ignoredSwitches = new HashMap<>(); - } - Map ignoredSwitches = aLocalData.ignoredSwitches; - if (aLocalData.ignoredSwitches2 == null) { - aLocalData.ignoredSwitches2 = new ArrayList<>(); - } - List ignoredSwitches2 = aLocalData.ignoredSwitches2; - int ip = part.start; - 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 == 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 = avm2code.fixAddrAfterDebugLine(body.exceptions[e].end); - catchedExceptions.add(body.exceptions[e]); - } else if (avm2code.fixAddrAfterDebugLine(body.exceptions[e].end) == maxend) { - catchedExceptions.add(body.exceptions[e]); - } - catchedFinallys.add(e); - - } - } else if (body.exceptions[e].isFinally()) { - parsedExceptions.add(body.exceptions[e]); - } - } - } - if (catchedExceptions.size() > 0) { - parsedExceptions.addAll(catchedExceptions); - 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 (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 (int) (t.avm2code.fixAddrAfterDebugLine(o1.target) - t.avm2code.fixAddrAfterDebugLine(o2.target)); - } - }); - - List finallyCommands = new ArrayList<>(); - boolean hasFinally = false; - int returnPos = afterCatchPos; - int finStart; - for (int e = 0; e < body.exceptions.length; e++) { - if (body.exceptions[e].isFinally()) { - if (addr == avm2code.fixAddrAfterDebugLine(body.exceptions[e].start)) { - if (afterCatchPos + 1 == code.adr2pos(avm2code.fixAddrAfterDebugLine(body.exceptions[e].end))) { - catchedFinallys.add(e); - AVM2Instruction jmpIns = avm2code.code.get(code.adr2pos(avm2code.fixAddrAfterDebugLine(body.exceptions[e].end))); - - if (jmpIns.definition instanceof JumpIns) { - finStart = code.adr2pos(avm2code.fixAddrAfterDebugLine(body.exceptions[e].end) + jmpIns.getBytesLength() + jmpIns.operands[0]); - - GraphPart fpart = null; - for (GraphPart p : allParts) { - if (p.start == finStart) { - fpart = p; - break; - } - } - TranslateStack st = (TranslateStack) stack.clone(); - st.clear(); - int swPos = -1; - 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) { - //st.push(new ExceptionAVM2Item(body.exceptions[e])); - GraphPart fepart = null; - for (GraphPart p : allParts) { - if (p.start == f + 1) { - fepart = p; - break; - } - } - //this.code.code.get(f).ignored = true; - //ignoredSwitches.add(f); - swPos = f; - - List stopPart2 = new ArrayList<>(stopPart); - stopPart2.add(fepart); - //finallyCommands = printGraph(new ArrayList(), localData, stack, allParts, parent, fpart, stopPart2, loops, staticOperation, path); - returnPos = f + 1; - break; - } - } - } - } - } - //ignoredSwitches.add(-1); - //int igs_size=ignoredSwitches.size(); - Map> oldFinallyJumps = new HashMap<>(finallyJumps); - finallyJumps.clear(); - ignoredSwitches.put(e, swPos); - st.push(new PopItem(null, aLocalData.lineStartInstruction)); - finallyCommands = printGraph(foundGotos, partCodes, partCodePos, localData, st, allParts, parent, fpart, null, loops, staticOperation, path); - //ignoredSwitches.remove(igs_size-1); - finallyJumps.putAll(oldFinallyJumps); - if (!finallyJumps.containsKey(e)) { - finallyJumps.put(e, new ArrayList<>()); - } - finallyJumps.get(e).add(finStart); - hasFinally = true; - break; - } - } - } - } - } - - GraphPart retPart = null; - for (GraphPart p : allParts) { - if (p.start == returnPos) { - retPart = p; - break; - } - } - List catchParts = new ArrayList<>(); - for (int e = 0; e < catchedExceptions.size(); e++) { - int eendpos; - if (e < catchedExceptions.size() - 1) { - eendpos = code.adr2pos(avm2code.fixAddrAfterDebugLine(catchedExceptions.get(e + 1).target)) - 2; - } else { - eendpos = afterCatchPos - 1; - } - - GraphPart npart = null; - int findpos = code.adr2pos(catchedExceptions.get(e).target); - for (GraphPart p : allParts) { - if (p.start == findpos) { - npart = p; - catchParts.add(p); - break; - } - } - - GraphPart nepart = null; - for (GraphPart p : allParts) { - if (p.start == eendpos + 1) { - nepart = p; - break; - } - } - TranslateStack st2 = (TranslateStack) stack.clone(); - st2.clear(); - st2.add(new ExceptionAVM2Item(catchedExceptions.get(e))); - AVM2LocalData localData2 = new AVM2LocalData(aLocalData); - localData2.scopeStack = new ScopeStack(localData2.scriptIndex); - List stopPart2 = new ArrayList<>(stopPart); - stopPart2.add(nepart); - if (retPart != null) { - stopPart2.add(retPart); - } - - List ncatchedCommands = printGraph(foundGotos, partCodes, partCodePos, localData2, st2, allParts, parent, npart, stopPart2, loops, staticOperation, path); - //hack for findGotos - FIXME - if (hasFinally && !ncatchedCommands.isEmpty()) { - for (int k = 0; k < ncatchedCommands.size(); k++) { - if (ncatchedCommands.get(k) instanceof GotoItem) { - GotoItem gi = (GotoItem) ncatchedCommands.get(k); - for (GotoItem g : foundGotos) { - if (gi.labelName.equals(g.labelName) && g.targetCommands != null) { - if (!g.targetCommands.isEmpty()) { - if (g.targetCommands.get(0) instanceof PushItem) { - if (g.targetCommands.get(0).value instanceof IntegerValueAVM2Item) { - if (((IntegerValueAVM2Item) g.targetCommands.get(0).value).value == -1) { - ncatchedCommands.remove(gi); - } - } - } - } - break; - } - } - } - } - } - if (catchedExceptions.get(e).isFinally() && (catchedExceptions.size() > 1 || hasFinally)) { - catchedExceptions.remove(e); - e--; - } else { - catchedCommands.add(ncatchedCommands); - if (retPart != null && avm2code.code.get(retPart.start).isExit() && !(!ncatchedCommands.isEmpty() && (ncatchedCommands.get(ncatchedCommands.size() - 1) instanceof ExitItem))) { - avm2code.code.get(retPart.start).translate(localData, st2, ncatchedCommands, staticOperation, path); - } - if (catchedExceptions.get(e).isFinally()) { - //endposStartBlock = -1; - if (!ncatchedCommands.isEmpty() && (ncatchedCommands.get(0) instanceof SetLocalAVM2Item)) { - SetLocalAVM2Item sl = (SetLocalAVM2Item) ncatchedCommands.get(0); - if (sl.value.getNotCoerced() instanceof ExceptionAVM2Item) { - finCatchName = AVM2Item.localRegName(new HashMap<>(), sl.regIndex); - } - } - } else { - //No kill ins - if (!ncatchedCommands.isEmpty() && (ncatchedCommands.get(0) instanceof SetLocalAVM2Item)) { - SetLocalAVM2Item sl = (SetLocalAVM2Item) ncatchedCommands.get(0); - if (sl.value.getThroughDuplicate().getNotCoerced() instanceof ExceptionAVM2Item) { - ncatchedCommands.remove(0); - } - } - } - } - } - - GraphPart nepart = null; - - for (GraphPart p : allParts) { - if (p.start == endposStartBlock) { - nepart = p; - break; - } - } - List stopPart2 = new ArrayList<>();//stopPart); - if (nepart != null) { - stopPart2.add(nepart); - } - stopPart2.addAll(catchParts); - - if (retPart != null) { - stopPart2.add(retPart); - } - TranslateStack st = (TranslateStack) stack.clone(); - st.clear(); - List tryCommands = printGraph(foundGotos, partCodes, partCodePos, localData, st, allParts, parent, part, stopPart2, loops, staticOperation, path); - if (retPart != null && avm2code.code.get(retPart.start).isExit() && !(!tryCommands.isEmpty() && (tryCommands.get(tryCommands.size() - 1) instanceof ExitItem))) { - avm2code.code.get(retPart.start).translate(localData, st, tryCommands, staticOperation, path); - } - output.clear(); - stack.clear(); - makeAllCommands(tryCommands, st); - output.add(new TryAVM2Item(tryCommands, catchedExceptions, catchedCommands, finallyCommands, finCatchName)); - for (int fin_e : catchedFinallys) { - if (finallyJumps.containsKey(fin_e)) { - finallyJumps.get(fin_e).clear(); - } - //.remove((Integer) finStart); - } - ip = returnPos; - } - - } - - if (ip != part.start) { - part = null; - for (GraphPart p : allParts) { - List ps = p.getSubParts(); - for (GraphPart p2 : ps) { - if (p2.start == ip) { - part = p2; - break; - } - } - } - ret = new ArrayList<>(); - ret.addAll(output); - GraphTargetItem lop = checkLoop(new ArrayList(), part, stopPart, loops); - if (lop == null) { - TranslateStack st = (TranslateStack) stack.clone(); - st.clear(); - - ret.addAll(printGraph(foundGotos, partCodes, partCodePos, localData, st, allParts, null, part, stopPart, loops, staticOperation, path)); - } else { - ret.add(lop); - } + ret = checkTry(output, foundGotos, partCodes, partCodePos, aLocalData, part, stopPart, loops, allParts, stack, staticOperation, path); + if (ret != null) { return ret; } - - 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; - } - + //Detect switch if ((part.nextParts.size() == 2) && (!stack.isEmpty()) && (stack.peek() instanceof StrictEqAVM2Item)) { GraphSourceItem switchStartItem = code.get(part.start); @@ -737,7 +719,6 @@ public class AVM2Graph extends Graph { defaultPart = defaultPart.nextParts.get(0); } - ret = new ArrayList<>(); ret.addAll(output); Reference nextRef = new Reference<>(null); @@ -758,13 +739,37 @@ public class AVM2Graph extends Graph { return ret; } + @Override + protected List getNextParts(BaseLocalData localData, GraphPart part) { + AVM2LocalData aLocalData = (AVM2LocalData) localData; + /*if (aLocalData.finallyJumps.containsKey(part)) { + List ret = new ArrayList<>(); + ret.add(aLocalData.finallyJumps.get(part)); + return ret; + }*/ + return super.getNextParts(localData, part); + } + @Override protected GraphPart checkPart(TranslateStack stack, BaseLocalData localData, GraphPart prev, GraphPart next, Set allParts) { AVM2LocalData aLocalData = (AVM2LocalData) localData; if (aLocalData.finallyJumps == null) { aLocalData.finallyJumps = new HashMap<>(); } - Map> finallyJumps = aLocalData.finallyJumps; + if (aLocalData.ignoredSwitches == null) { + aLocalData.ignoredSwitches = new HashMap<>(); + } + + if (prev != null) { + if (aLocalData.ignoredSwitches.containsValue(prev)) { + return null; + } + if (aLocalData.finallyJumps.containsKey(prev)) { + return aLocalData.finallyJumps.get(prev); + } + } + + /*Map> finallyJumps = aLocalData.finallyJumps; if (aLocalData.ignoredSwitches == null) { aLocalData.ignoredSwitches = new HashMap<>(); } @@ -786,7 +791,7 @@ public class AVM2Graph extends Graph { nip = branches.get(1 + val); } for (GraphPart p : allParts) { - if (avm2code.fixIPAfterDebugLine(p.start) == avm2code.fixIPAfterDebugLine(nip)) { + if (avm2code.getIpThroughJumpAndDebugLine(p.start) == avm2code.getIpThroughJumpAndDebugLine(nip)) { return p; } } @@ -801,14 +806,14 @@ public class AVM2Graph extends Graph { } int pos = next.start; - long addr = avm2code.fixAddrAfterDebugLine(avm2code.pos2adr(pos)); + long addr = avm2code.getAddrThroughJumpAndDebugLine(avm2code.pos2adr(pos)); for (int e = 0; e < body.exceptions.length; e++) { if (body.exceptions[e].isFinally()) { - if (addr == avm2code.fixAddrAfterDebugLine(body.exceptions[e].start)) { + if (addr == avm2code.getAddrThroughJumpAndDebugLine(body.exceptions[e].start)) { if (true) { //afterCatchPos + 1 == code.adr2pos(this.code.fixAddrAfterDebugLine(body.exceptions[e].end))) { - AVM2Instruction jmpIns = avm2code.code.get(avm2code.adr2pos(avm2code.fixAddrAfterDebugLine(body.exceptions[e].end))); + AVM2Instruction jmpIns = avm2code.code.get(avm2code.adr2pos(avm2code.getAddrThroughJumpAndDebugLine(body.exceptions[e].end))); if (jmpIns.definition instanceof JumpIns) { - int finStart = avm2code.adr2pos(avm2code.fixAddrAfterDebugLine(body.exceptions[e].end) + jmpIns.getBytesLength() + jmpIns.operands[0]); + int finStart = avm2code.adr2pos(avm2code.getAddrThroughJumpAndDebugLine(body.exceptions[e].end) + jmpIns.getBytesLength() + jmpIns.operands[0]); if (!finallyJumps.containsKey(e)) { finallyJumps.put(e, new ArrayList<>()); } @@ -832,8 +837,7 @@ public class AVM2Graph extends Graph { } } } - } - + }*/ return next; } @@ -1050,6 +1054,7 @@ public class AVM2Graph extends Graph { } return false; } + @Override protected void finalProcess(List list, int level, FinalProcessLocalData localData, String path) throws InterruptedException { @@ -1061,13 +1066,6 @@ public class AVM2Graph extends Graph { } } - /*for (int i = 0; i < list.size(); i++) { - - if (list.get(i) instanceof WhileItem) { - WhileItem w = (WhileItem) list.get(i); - - } - }*/ for (int i = 0; i < list.size(); i++) { if (list.get(i) instanceof SetLocalAVM2Item) { SetLocalAVM2Item ri = (SetLocalAVM2Item) list.get(i); @@ -1105,30 +1103,42 @@ public class AVM2Graph extends Graph { } } - if (i + 2 < list.size()) { - if (isIntegerOrPopInteger(list.get(i + 1)) && (list.get(i + 2) instanceof ReturnValueAVM2Item) - && (list.get(i + 2).value instanceof LocalRegAVM2Item) - && (((LocalRegAVM2Item) list.get(i + 2).value).regIndex == ri.regIndex)) { - ReturnValueAVM2Item r = (ReturnValueAVM2Item) list.get(i + 2); - r.value = ri.value; - list.remove(i + 1); - list.remove(i); - i--; - continue; - } - if (isIntegerOrPopInteger(list.get(i + 1)) && (list.get(i + 2) instanceof ThrowAVM2Item) - && (list.get(i + 2).value instanceof LocalRegAVM2Item) - && (((LocalRegAVM2Item) list.get(i + 2).value).regIndex == ri.regIndex)) { - ThrowAVM2Item t = (ThrowAVM2Item) list.get(i + 2); - t.value = ri.value; - list.remove(i + 1); - list.remove(i); - i--; - continue; - } - } else if (i + 1 < list.size() && usages.isEmpty()) { - if (isIntegerOrPopInteger(list.get(i + 1))) { - list.remove(i + 1); + //§§push(int) in every return/throw in try..finally block + //there may be multiple pushes as finnaly clauses may be nested + int numPushes = 0; + while (i + 1 + numPushes < list.size() && isIntegerOrPopInteger(list.get(i + 1 + numPushes))) { + numPushes++; + } + if (numPushes > 0) { + if (i + 1 + numPushes < list.size()) { + if (numPushes > 0 && (list.get(i + 1 + numPushes) instanceof ReturnValueAVM2Item) + && (list.get(i + 1 + numPushes).value instanceof LocalRegAVM2Item) + && (((LocalRegAVM2Item) list.get(i + 1 + numPushes).value).regIndex == ri.regIndex)) { + ReturnValueAVM2Item r = (ReturnValueAVM2Item) list.get(i + 1 + numPushes); + r.value = ri.value; + for (int n = 0; n < numPushes; n++) { + list.remove(i + 1); + } + list.remove(i); + i--; + continue; + } + if (numPushes > 0 && (list.get(i + 1 + numPushes) instanceof ThrowAVM2Item) + && (list.get(i + 1 + numPushes).value instanceof LocalRegAVM2Item) + && (((LocalRegAVM2Item) list.get(i + 1 + numPushes).value).regIndex == ri.regIndex)) { + ThrowAVM2Item t = (ThrowAVM2Item) list.get(i + 1 + numPushes); + t.value = ri.value; + for (int n = 0; n < numPushes; n++) { + list.remove(i + 1); + } + list.remove(i); + i--; + continue; + } + } else if (i + numPushes < list.size() && usages.isEmpty()) { + for (int n = 0; n < numPushes; n++) { + list.remove(i + 1); + } list.remove(i); i--; continue; @@ -1136,6 +1146,20 @@ public class AVM2Graph extends Graph { } } } + + //§§push(int) before every continue/returnvoid in try..finally block + //there may be multiple pushes as finnaly clauses may be nested + //TODO: handle this better - actually remove only really needed + if ((list.get(i) instanceof ContinueItem) || (list.get(i) instanceof BreakItem) || (list.get(i) instanceof ReturnVoidAVM2Item)) { + for (int j = i - 1; j >= 0; j--) { + if (isIntegerOrPopInteger(list.get(j))) { + list.remove(j); + i--; + } else { + break; + } + } + } } List ret = list; @@ -1241,4 +1265,12 @@ public class AVM2Graph extends Graph { switchItem.switchedObject = setLocal.value; } } + + @Override + protected boolean partIsSwitch(GraphPart part) { + if (part.end < 0) { + return false; + } + return avm2code.code.get(part.end).definition instanceof LookupSwitchIns; + } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/MethodBody.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/MethodBody.java index ae5da289e..32d7c7ded 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/MethodBody.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/MethodBody.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.abc.types; import com.jpexs.decompiler.flash.SWFInputStream; @@ -445,7 +446,7 @@ public final class MethodBody implements Cloneable { public boolean autoFillStats(ABC abc, int initScope, boolean hasThis) { //System.out.println("--------------"); - CodeStats stats = getCode().getStats(abc, this, initScope); + CodeStats stats = getCode().getStats(abc, this, initScope, true); if (stats == null) { return false; } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraph.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraph.java index 016437aaa..b75277638 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraph.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraph.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.action; import com.jpexs.decompiler.flash.BaseLocalData; @@ -53,6 +54,7 @@ import com.jpexs.decompiler.graph.model.ContinueItem; import com.jpexs.decompiler.graph.model.DefaultItem; import com.jpexs.decompiler.graph.model.GotoItem; import com.jpexs.decompiler.graph.model.IfItem; +import com.jpexs.decompiler.graph.model.ScriptEndItem; import com.jpexs.decompiler.graph.model.SwitchItem; import com.jpexs.decompiler.graph.model.WhileItem; import com.jpexs.helpers.Helper; @@ -159,6 +161,21 @@ public class ActionGraph extends Graph { @Override protected void finalProcess(List list, int level, FinalProcessLocalData localData, String path) throws InterruptedException { + if (level == 0) { + List removed = new ArrayList<>(); + for (int i = list.size() - 1; i >= 0; i--) { + if (list.get(i) instanceof ScriptEndItem) { + continue; + } + if (list.get(i) instanceof FunctionActionItem) { + removed.add(0, list.remove(i)); + } else { + break; + } + } + list.addAll(0, removed); + } + if (insideDoInitAction) { ActionScript2ClassDetector detector = new ActionScript2ClassDetector(); detector.checkClass(list, path); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/Graph.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/Graph.java index a4e445958..c6871fc45 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/Graph.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/Graph.java @@ -238,7 +238,7 @@ public class Graph { GraphPartQueue newParts = new GraphPartQueue(); loopnext: - for (GraphPart nextRaw : part.nextParts) { + for (GraphPart nextRaw : getNextParts(localData, part)) { GraphPart next = checkPart(null, localData, part, nextRaw, null); if (next == null) { @@ -276,7 +276,7 @@ public class Graph { } public GraphPart getNextCommonPart(BaseLocalData localData, GraphPart part, List loops) throws InterruptedException { - return getCommonPart(localData, part, part.nextParts, loops); + return getCommonPart(localData, part, getNextParts(localData, part), loops); } //TODO: Make this faster! @@ -374,7 +374,7 @@ public class Graph { } } - loopi: + /*loopi: for (int i = 0; i < parts.size(); i++) { for (int j = 0; j < parts.size(); j++) { if (j == i) { @@ -386,7 +386,7 @@ public class Graph { continue loopi; } } - } + }*/ List> reachable = new ArrayList<>(); Set allReachable = new LinkedHashSet<>(); for (GraphPart p : parts) { @@ -410,7 +410,7 @@ public class Graph { continue; } visited.add(p); - int commonLevel = 1; + int commonLevel = 0; for (Set r : reachable) { if (r.contains(p)) { commonLevel++; @@ -426,6 +426,9 @@ public class Graph { //System.err.println("maxclevel = " + maxCommonLevel); //System.err.println("maxclevelpart = " + maxCommonLevelPart); + if (maxCommonLevel <= 1) { + return null; + } return maxCommonLevelPart; } @@ -440,7 +443,7 @@ public class Graph { for (int i = part.start; i <= part.end; i++) { GraphSourceItem src = code.get(i); if (src.isJump()) { - part = part.nextParts.get(0); + part = getNextParts(localData, part).get(0); if(st.isEmpty()){ startPart = part; } @@ -480,11 +483,11 @@ public class Graph { System.err.println("parts:"); for (GraphPart p : allParts) { System.err.print(p); - if (!p.nextParts.isEmpty()) { + if (!getNextParts(localData, p).isEmpty()) { System.err.print(", next: "); } boolean first = true; - for (GraphPart n : p.nextParts) { + for (GraphPart n : getNextParts(localData, p)) { if (!first) { System.err.print(","); } @@ -552,7 +555,7 @@ public class Graph { return new FinalProcessLocalData(loops); } - protected void beforePrintGraph(BaseLocalData localData, String path, Set allParts, List loops) { + protected void beforePrintGraph(BaseLocalData localData, String path, Set allParts, List loops) throws InterruptedException { } @@ -604,7 +607,7 @@ public class Graph { /**/ - //if (ref.nextParts) + //if (getNextParts(localData, ref)) private void getBackEdges(BaseLocalData localData, List loops) throws InterruptedException { clearLoops(loops); for (Loop el : loops) { @@ -843,7 +846,7 @@ public class Graph { } } - private void processIfs(List list) { + protected void processIfs(List list) { for (int i = 0; i < list.size(); i++) { GraphTargetItem item = list.get(i); if ((item instanceof LoopItem) && (item instanceof Block)) { @@ -1192,7 +1195,7 @@ public class Graph { //loopContinues.add(part); } - if (part.nextParts.size() == 2) { + if (part.nextParts.size() == 2 && !partIsSwitch(part)) { List nps;/* = new ArrayList<>(part.nextParts); for(int i=0;i 2) { + } else if (part.nextParts.size() > 2 || partIsSwitch(part)) { GraphPart next = getNextCommonPart(localData, part, loops); for (GraphPart p : part.nextParts) { @@ -1411,6 +1414,10 @@ public class Graph { } } + protected List getNextParts(BaseLocalData localData, GraphPart part) { + return part.nextParts; + } + protected List printGraph(List foundGotos, Map> partCodes, Map partCodePos, Set visited, BaseLocalData localData, TranslateStack stack, Set allParts, GraphPart parent, GraphPart part, List stopPart, List loops, List ret, int staticOperation, String path, int recursionLevel) throws InterruptedException { if (Thread.currentThread().isInterrupted()) { throw new InterruptedException(); @@ -1428,7 +1435,7 @@ public class Graph { //try { if (debugPrintGraph) { - System.err.println("PART " + part + " nextsize:" + part.nextParts.size()); + System.err.println("PART " + part + " nextsize:" + getNextParts(localData, part).size()); } /*while (((part != null) && (part.getHeight() == 1)) && (code.size() > part.start) && (code.get(part.start).isJump())) { //Parts with only jump in it gets ignored @@ -1436,9 +1443,9 @@ public class Graph { if (part == stopPart) { return ret; } - GraphTargetItem lop = checkLoop(part.nextParts.get(0), stopPart, loops); + GraphTargetItem lop = checkLoop(getNextParts(localData, part).get(0), stopPart, loops); if (lop == null) { - part = part.nextParts.get(0); + part = getNextParts(localData, part).get(0); } else { break; } @@ -1584,8 +1591,11 @@ public class Graph { parts = ((GraphPartMulti) part).parts; } else { parts.add(part); - while (part.nextParts.size() == 1 && part.nextParts.get(0).refs.size() == 1) { - part = part.nextParts.get(0); + while (getNextParts(localData, part).size() == 1 && getNextParts(localData, part).get(0).refs.size() == 1) { + if (stopPart.contains(getNextParts(localData, part).get(0))) { //it might be referenced with try statement + break; + } + part = getNextParts(localData, part).get(0); parts.add(part); } } @@ -1594,7 +1604,7 @@ public class Graph { int start = p.start; output.addAll(code.translatePart(p, localData, stack, start, end, staticOperation, path)); - if ((end >= code.size() - 1) && p.nextParts.isEmpty()) { + if ((end >= code.size() - 1) && getNextParts(localData, p).isEmpty()) { output.add(new ScriptEndItem()); } } @@ -1614,7 +1624,7 @@ public class Graph { //********************************END PART DECOMPILING if (parseNext) { - if (part.nextParts.size() > 2) { + if (getNextParts(localData, part).size() > 2 || partIsSwitch(part)) { GraphTargetItem originalSwitchedItem = stack.pop(); makeAllCommands(currentRet, stack); GraphTargetItem switchedItem = originalSwitchedItem; @@ -1742,11 +1752,11 @@ public class Graph { pos = 0; //This is tied to AS3 switch implementation which has nextparts switched from index 1. TODO: Make more universal - GraphPart defaultPart = hasExpr ? part.nextParts.get(1 + defaultBranch) : part.nextParts.get(0); + GraphPart defaultPart = hasExpr ? getNextParts(localData, part).get(1 + defaultBranch) : getNextParts(localData, part).get(0); List caseBodyParts = new ArrayList<>(); - for (int i = 1; i < part.nextParts.size(); i++) { + for (int i = 1; i < getNextParts(localData, part).size(); i++) { if (!hasExpr) { - if (part.nextParts.get(i) == defaultPart) { + if (getNextParts(localData, part).get(i) == defaultPart) { pos++; continue; } @@ -1763,7 +1773,7 @@ public class Graph { pos++; continue; } - caseBodyParts.add(part.nextParts.get(i)); + caseBodyParts.add(getNextParts(localData, part).get(i)); pos++; } Reference nextRef = new Reference<>(null); @@ -1783,7 +1793,7 @@ public class Graph { pos++; } //else GraphPart nextOnePart = null; - if (part.nextParts.size() == 2) { + if (getNextParts(localData, part).size() == 2 && !partIsSwitch(part)) { GraphTargetItem expr = stack.pop(); /*if (expr instanceof LogicalOpItem) { expr = ((LogicalOpItem) expr).invert(); @@ -1793,7 +1803,7 @@ public class Graph { if (nextOnePart == null) { List nps; - nps = part.nextParts; + nps = getNextParts(localData, part); boolean isEmpty = nps.get(0) == nps.get(1); GraphPart next = getCommonPart(localData, part, nps, loops); @@ -1896,11 +1906,16 @@ public class Graph { } } } //else - if (part.nextParts.size() == 1) { - nextOnePart = part.nextParts.get(0); + if (getNextParts(localData, part).size() == 1) { + nextOnePart = getNextParts(localData, part).get(0); } + + if (getNextParts(localData, part).isEmpty()) { + makeAllCommands(currentRet, stack); + } + if (nextOnePart != null) { - printGraph(foundGotos, partCodes, partCodePos, visited, localData, stack, allParts, part, part.nextParts.get(0), stopPart, loops, currentRet, staticOperation, path, recursionLevel + 1); + printGraph(foundGotos, partCodes, partCodePos, visited, localData, stack, allParts, part, getNextParts(localData, part).get(0), stopPart, loops, currentRet, staticOperation, path, recursionLevel + 1); } } @@ -2415,29 +2430,17 @@ public class Graph { if (p instanceof FunctionActionItem) { commands.add(clen, p); } else { - if (isExit) { + /*if (isExit) { //ASC2 leaves some function calls unpopped on stack before returning from a method commands.add(clen, p); - } else { + } else {*/ commands.add(clen, new PushItem(p)); - } + //} } } } } - protected void removeEdgeToFromList(List edges, GraphPart to) { - for (int i = edges.size() - 1; i >= 0; i--) { - if (edges.get(i).to.equals(to)) { - edges.remove(i); - } - } - while (isPartEmpty(to) && !to.nextParts.isEmpty()) { - to = to.nextParts.get(0); - removeEdgeToFromList(edges, to); - } - } - protected SwitchItem handleSwitch(GraphTargetItem switchedObject, GraphSourceItem switchStartItem, List foundGotos, Map> partCodes, Map partCodePos, Set allParts, TranslateStack stack, List stopPart, List loops, BaseLocalData localData, int staticOperation, String path, List caseValuesMap, GraphPart defaultPart, List caseBodyParts, Reference nextRef, Reference tiRef) throws InterruptedException { @@ -2570,16 +2573,12 @@ public class Graph { for (int i = 0; i < caseBodies.size(); i++) { List currentCaseCommands = new ArrayList<>(); - GraphPart nextCase = next; - if (next != null) { - if (i < caseBodies.size() - 1) { - if (!caseBodies.get(i).leadsTo(localData, this, code, caseBodies.get(i + 1), loops)) { - currentCaseCommands.add(new BreakItem(null, localData.lineStartInstruction, currentLoop.id)); - } else { - nextCase = caseBodies.get(i + 1); - } + if (i < caseBodies.size() - 1) { + if (!caseBodies.get(i).leadsTo(localData, this, code, caseBodies.get(i + 1), loops)) { + currentCaseCommands.add(new BreakItem(null, localData.lineStartInstruction, currentLoop.id)); } } + List stopPart2x = new ArrayList<>(stopPart); for (GraphPart b : caseBodies) { if (b != caseBodies.get(i)) { @@ -2638,4 +2637,8 @@ public class Graph { return new SwitchItem(null, switchStartItem, currentLoop, switchedObject, caseValuesMap, caseCommands, valuesMapping); } + + protected boolean partIsSwitch(GraphPart part) { + return false; + } } diff --git a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript2Test.java b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript2Test.java index 56947bf35..1fff7833f 100644 --- a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript2Test.java +++ b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript2Test.java @@ -2006,6 +2006,8 @@ public class ActionScript2Test extends ActionScript2TestBase { + "case \"C\":\r\n" + "trace(\"Ret 5\");\r\n" + "return 5;\r\n" + + "default:\r\n" + + "continue;\r\n" + "}\r\n" + "}\r\n" + "trace(\"Final\");\r\n" diff --git a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript3Test.java b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript3Test.java index aabbd2a7f..a2a007374 100644 --- a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript3Test.java +++ b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript3Test.java @@ -1415,6 +1415,7 @@ public class ActionScript3Test extends ActionScriptTestBase { + "{\r\n" + "trace(\"a\");\r\n" + "}\r\n" + + "continue;\r\n" + "}\r\n" + "catch(e:EOFError)\r\n" + "{\r\n" diff --git a/libsrc/ffdec_lib/testdata/cross_compile/bin/Main.air.swf b/libsrc/ffdec_lib/testdata/cross_compile/bin/Main.air.swf new file mode 100644 index 0000000000000000000000000000000000000000..217d90f13f19563d3dbab2e3a7785f1d8a501176 GIT binary patch literal 2753 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 HOPa_p7>rTn literal 0 HcmV?d00001 diff --git a/libsrc/ffdec_lib/testdata/cross_compile/bin/Main.flex.swf b/libsrc/ffdec_lib/testdata/cross_compile/bin/Main.flex.swf new file mode 100644 index 0000000000000000000000000000000000000000..a327e86c89ef5e9562b0b26387f1b0036abcec73 GIT binary patch literal 3629 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 npM3te literal 0 HcmV?d00001 diff --git a/libsrc/ffdec_lib/testdata/cross_compile/bin/Main.swftools.swf b/libsrc/ffdec_lib/testdata/cross_compile/bin/Main.swftools.swf new file mode 100644 index 0000000000000000000000000000000000000000..7c6ef7ed986d8f321ffb32cbf569ec66912df4e3 GIT binary patch literal 1525 zcmVFs`xR4sXSw94-~qpkg{)oK%{J{E+Uj4&_$&#y7so}qMQB?dhT2gj6<4-G7I~= z=bp!RzH>(QHcCA~=(iuy5JorB8bavzzJClP9}`_bQ~~fw%<&4Fj#p_k_La(}Z?{x1 z_^o{nzG@Y}wiT<|o6VLjZ1i4vJ$~Xp7s2yfhRqwbrsq4}j$ME#4FZ9=T+PP-nKm`I!&kZ8w|E?PS-mEae*SJ>GCyQ0JcQ z@3g!%uWQWo`iLyUr%lK1&)wbHY52}|!wwkq_1?)s){BhC>GChSy$v?IKKP=m&p|_W ztKxY2t>&&{UvD_usq(Jv`8S;QcA$GJAz-7jFI7#ic`*M<&3ATfY0356Uxz({bg+>3 zw_A>HD?T{eN-%kBbJuPQ@wISekm3WYc4D(pX>VPq%S?tm*@8zqJP7Z$n)@jCVeaGH zQf?8AafYVKj=)pdy+?(+DaLG5BBv=NTml#;DE|7GtUsXIwRy#XbPrx&hTG`+A2%;FJd zM#wB7lr5iDcI@=9;P)5W7akZ45Z6Va&Lq%T@1GJcWu#UrtYuP0=vST6tWm?nEJg%P zNI}yL4(UCq4Gazc* zP^cOo1zS2oArn%_LPGk37=+Y4c9_`=bdNR_m_|_ zLiSNecDx8=$1j7+K!ogINOnl5`NiqwnTssXfLxwYv9^+L=Cwpyq2W4N@No?&9o!~NxDWKBU<%rFp9%y5;w(XhL;Ae;J3yeYGTL0d!JwU)MgU>gqR4-()% zkB%P8Hz;go1e&>c37WaM49yfG&729FIU6c3a#`JO^qy|Aq4Zk!ng=q!Twm>2UoEPy znGiwJg&(_csXUEcSy15PQ}AiHz<4~uxEL}%Cm7o=QC~lKF;?Dc8CIg|O+>g%hFqq= bTk9I(?}4TXqn^d!FaC(4MF9T+2yH=Yk@MhP literal 0 HcmV?d00001 diff --git a/libsrc/ffdec_lib/testdata/cross_compile/bin/expressInstall.swf b/libsrc/ffdec_lib/testdata/cross_compile/bin/expressInstall.swf new file mode 100644 index 0000000000000000000000000000000000000000..86958bf3a726d6e946e36fb5d34aaf315c9f0b24 GIT binary patch literal 773 zcmV+g1N!_!S5pQ-1pokeoP|`)Pt-sZ|8;lSEwI4K*P@gUAu&n}HSvZZ1PFwL1zA83 z#=~qoK%v_y{QdanFT+{w@Z$&6T61KWAk)|Bv_e13 zkzQ;4o&u7j&L%&Rbo@gZgY7bt`wO<^ArQVUco)Icx1Iz$4zdt3Vd!_J~za6aTSF^ zv*wWj_qQlBDW*%Qh0S3w+b%KVVDs71dTF1GvFIK}IVLX)XduinxNUQ@0WC30>N}o! zfs~oyyJbqvCJncY%}OA6838v!-x3v2KKE$REi=oZhS;l>^CCrO`0sUmoQT`uOOu;q$6 z<1wpLl5wyqJ7`kX;<6{Fxuz}PE2`~CqyDMTstKsdnp_h_xh7Y--z9J#Qch{r3^Ix| zY?;Y7Ii^WhkbL|$fhUn|CW@qLyV8B;f9`SK)?zc-Ru5WDQM`J@cCFfi%&#QSu{?Cr z+dO47+WT0El2ODo)ND#oJJ!}4Kqmp6SAi}9x(K+2g<_uQx;mdgu9>dfO#WmHmO~fB zwl@V6VL+ECF##orl&8!NIZCpil=6m7F5}+VAx1_(hoWP3OC?`ddg2}8P?yWZU&#pU zyAA|S`>(kLz(c%xfPHqz0>igFF-4=}MthU|rRVb?Scz+2sQcc%_lSyYh1whUsV`!p zKbnU;b*BUBKqL9hX!lleS`s;^YU+TtJS}a8{^W9)Z0I-Gn1C1`i8`)kF72nuKvgp> z7h-#+EfR^Hl + + + + asc2 + + + + + + + +

+ + \ No newline at end of file diff --git a/libsrc/ffdec_lib/testdata/cross_compile/bin/js/swfobject.js b/libsrc/ffdec_lib/testdata/cross_compile/bin/js/swfobject.js new file mode 100644 index 000000000..8eafe9dd8 --- /dev/null +++ b/libsrc/ffdec_lib/testdata/cross_compile/bin/js/swfobject.js @@ -0,0 +1,4 @@ +/* SWFObject v2.2 + is released under the MIT License +*/ +var swfobject=function(){var D="undefined",r="object",S="Shockwave Flash",W="ShockwaveFlash.ShockwaveFlash",q="application/x-shockwave-flash",R="SWFObjectExprInst",x="onreadystatechange",O=window,j=document,t=navigator,T=false,U=[h],o=[],N=[],I=[],l,Q,E,B,J=false,a=false,n,G,m=true,M=function(){var aa=typeof j.getElementById!=D&&typeof j.getElementsByTagName!=D&&typeof j.createElement!=D,ah=t.userAgent.toLowerCase(),Y=t.platform.toLowerCase(),ae=Y?/win/.test(Y):/win/.test(ah),ac=Y?/mac/.test(Y):/mac/.test(ah),af=/webkit/.test(ah)?parseFloat(ah.replace(/^.*webkit\/(\d+(\.\d+)?).*$/,"$1")):false,X=!+"\v1",ag=[0,0,0],ab=null;if(typeof t.plugins!=D&&typeof t.plugins[S]==r){ab=t.plugins[S].description;if(ab&&!(typeof t.mimeTypes!=D&&t.mimeTypes[q]&&!t.mimeTypes[q].enabledPlugin)){T=true;X=false;ab=ab.replace(/^.*\s+(\S+\s+\S+$)/,"$1");ag[0]=parseInt(ab.replace(/^(.*)\..*$/,"$1"),10);ag[1]=parseInt(ab.replace(/^.*\.(.*)\s.*$/,"$1"),10);ag[2]=/[a-zA-Z]/.test(ab)?parseInt(ab.replace(/^.*[a-zA-Z]+(.*)$/,"$1"),10):0}}else{if(typeof O.ActiveXObject!=D){try{var ad=new ActiveXObject(W);if(ad){ab=ad.GetVariable("$version");if(ab){X=true;ab=ab.split(" ")[1].split(",");ag=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)]}}}catch(Z){}}}return{w3:aa,pv:ag,wk:af,ie:X,win:ae,mac:ac}}(),k=function(){if(!M.w3){return}if((typeof j.readyState!=D&&j.readyState=="complete")||(typeof j.readyState==D&&(j.getElementsByTagName("body")[0]||j.body))){f()}if(!J){if(typeof j.addEventListener!=D){j.addEventListener("DOMContentLoaded",f,false)}if(M.ie&&M.win){j.attachEvent(x,function(){if(j.readyState=="complete"){j.detachEvent(x,arguments.callee);f()}});if(O==top){(function(){if(J){return}try{j.documentElement.doScroll("left")}catch(X){setTimeout(arguments.callee,0);return}f()})()}}if(M.wk){(function(){if(J){return}if(!/loaded|complete/.test(j.readyState)){setTimeout(arguments.callee,0);return}f()})()}s(f)}}();function f(){if(J){return}try{var Z=j.getElementsByTagName("body")[0].appendChild(C("span"));Z.parentNode.removeChild(Z)}catch(aa){return}J=true;var X=U.length;for(var Y=0;Y0){for(var af=0;af0){var ae=c(Y);if(ae){if(F(o[af].swfVersion)&&!(M.wk&&M.wk<312)){w(Y,true);if(ab){aa.success=true;aa.ref=z(Y);ab(aa)}}else{if(o[af].expressInstall&&A()){var ai={};ai.data=o[af].expressInstall;ai.width=ae.getAttribute("width")||"0";ai.height=ae.getAttribute("height")||"0";if(ae.getAttribute("class")){ai.styleclass=ae.getAttribute("class")}if(ae.getAttribute("align")){ai.align=ae.getAttribute("align")}var ah={};var X=ae.getElementsByTagName("param");var ac=X.length;for(var ad=0;ad'}}aa.outerHTML='"+af+"";N[N.length]=ai.id;X=c(ai.id)}else{var Z=C(r);Z.setAttribute("type",q);for(var ac in ai){if(ai[ac]!=Object.prototype[ac]){if(ac.toLowerCase()=="styleclass"){Z.setAttribute("class",ai[ac])}else{if(ac.toLowerCase()!="classid"){Z.setAttribute(ac,ai[ac])}}}}for(var ab in ag){if(ag[ab]!=Object.prototype[ab]&&ab.toLowerCase()!="movie"){e(Z,ab,ag[ab])}}aa.parentNode.replaceChild(Z,aa);X=Z}}return X}function e(Z,X,Y){var aa=C("param");aa.setAttribute("name",X);aa.setAttribute("value",Y);Z.appendChild(aa)}function y(Y){var X=c(Y);if(X&&X.nodeName=="OBJECT"){if(M.ie&&M.win){X.style.display="none";(function(){if(X.readyState==4){b(Y)}else{setTimeout(arguments.callee,10)}})()}else{X.parentNode.removeChild(X)}}}function b(Z){var Y=c(Z);if(Y){for(var X in Y){if(typeof Y[X]=="function"){Y[X]=null}}Y.parentNode.removeChild(Y)}}function c(Z){var X=null;try{X=j.getElementById(Z)}catch(Y){}return X}function C(X){return j.createElement(X)}function i(Z,X,Y){Z.attachEvent(X,Y);I[I.length]=[Z,X,Y]}function F(Z){var Y=M.pv,X=Z.split(".");X[0]=parseInt(X[0],10);X[1]=parseInt(X[1],10)||0;X[2]=parseInt(X[2],10)||0;return(Y[0]>X[0]||(Y[0]==X[0]&&Y[1]>X[1])||(Y[0]==X[0]&&Y[1]==X[1]&&Y[2]>=X[2]))?true:false}function v(ac,Y,ad,ab){if(M.ie&&M.mac){return}var aa=j.getElementsByTagName("head")[0];if(!aa){return}var X=(ad&&typeof ad=="string")?ad:"screen";if(ab){n=null;G=null}if(!n||G!=X){var Z=C("style");Z.setAttribute("type","text/css");Z.setAttribute("media",X);n=aa.appendChild(Z);if(M.ie&&M.win&&typeof j.styleSheets!=D&&j.styleSheets.length>0){n=j.styleSheets[j.styleSheets.length-1]}G=X}if(M.ie&&M.win){if(n&&typeof n.addRule==r){n.addRule(ac,Y)}}else{if(n&&typeof j.createTextNode!=D){n.appendChild(j.createTextNode(ac+" {"+Y+"}"))}}}function w(Z,X){if(!m){return}var Y=X?"visible":"hidden";if(J&&c(Z)){c(Z).style.visibility=Y}else{v("#"+Z,"visibility:"+Y)}}function L(Y){var Z=/[\\\"<>\.;]/;var X=Z.exec(Y)!=null;return X&&typeof encodeURIComponent!=D?encodeURIComponent(Y):Y}var d=function(){if(M.ie&&M.win){window.attachEvent("onunload",function(){var ac=I.length;for(var ab=0;ab buildlog.%COMPILERKIND%.txt 2>&1 \ No newline at end of file diff --git a/libsrc/ffdec_lib/testdata/cross_compile/build_debug.bat b/libsrc/ffdec_lib/testdata/cross_compile/build_debug.bat new file mode 100644 index 000000000..914701057 --- /dev/null +++ b/libsrc/ffdec_lib/testdata/cross_compile/build_debug.bat @@ -0,0 +1,6 @@ +@echo off +call build_air_debug.bat +call build_flex_debug.bat +call build_flex_apache_debug.bat +call build_swftools_debug.bat +pause \ No newline at end of file diff --git a/libsrc/ffdec_lib/testdata/cross_compile/build_flex_apache_debug.bat b/libsrc/ffdec_lib/testdata/cross_compile/build_flex_apache_debug.bat new file mode 100644 index 000000000..c7617f10c --- /dev/null +++ b/libsrc/ffdec_lib/testdata/cross_compile/build_flex_apache_debug.bat @@ -0,0 +1,3 @@ +@echo off +set COMPILERKIND=flex_apache +call c:\flex_apache\bin\mxmlc.bat -warnings=false -debug=true -output bin/Main.%COMPILERKIND%.swf src/Main.as 1> buildlog.%COMPILERKIND%.txt 2>&1 \ No newline at end of file diff --git a/libsrc/ffdec_lib/testdata/cross_compile/build_flex_debug.bat b/libsrc/ffdec_lib/testdata/cross_compile/build_flex_debug.bat new file mode 100644 index 000000000..76c857b14 --- /dev/null +++ b/libsrc/ffdec_lib/testdata/cross_compile/build_flex_debug.bat @@ -0,0 +1,3 @@ +@echo off +set COMPILERKIND=flex +c:\flex\bin\mxmlc.exe -warnings=false -debug=true -output bin/Main.%COMPILERKIND%.swf src/Main.as 1> buildlog.%COMPILERKIND%.txt 2>&1 \ No newline at end of file diff --git a/libsrc/ffdec_lib/testdata/cross_compile/build_stub.bat b/libsrc/ffdec_lib/testdata/cross_compile/build_stub.bat new file mode 100644 index 000000000..b153e4d13 --- /dev/null +++ b/libsrc/ffdec_lib/testdata/cross_compile/build_stub.bat @@ -0,0 +1,19 @@ +@echo off +set ISDEBUG=false +if "%1" == "debug" goto blockset +goto block2 +:blockset +set ISDEBUG=true +:block2 +set COMPILERPATH=%2 +set COMPILERKIND=%3 +rem if not exist %COMPILERPATH% goto notex +%COMPILERPATH% -warnings=false -debug=%ISDEBUG% -output bin/Main.%COMPILERKIND%.swf src/Main.as > buildlog.%COMPILERKIND%.txt +if errorlevel==1 goto failed +goto end +:notex +echo Flex/AIR SDK not found. Download and unpack Flex/AIR SDK into some directory and add it to PATH variable +goto end +:failed +pause +:end diff --git a/libsrc/ffdec_lib/testdata/cross_compile/build_swftools_debug.bat b/libsrc/ffdec_lib/testdata/cross_compile/build_swftools_debug.bat new file mode 100644 index 000000000..2ccf2fb56 --- /dev/null +++ b/libsrc/ffdec_lib/testdata/cross_compile/build_swftools_debug.bat @@ -0,0 +1,4 @@ +@echo off +set COMPILERKIND=swftools +cd src +c:\swftools\as3compile.exe Main.as -o ..\bin\Main.%COMPILERKIND%.swf 1> ../buildlog.%COMPILERKIND%.txt 2>&1 \ No newline at end of file diff --git a/libsrc/ffdec_lib/testdata/cross_compile/buildlog.air.txt b/libsrc/ffdec_lib/testdata/cross_compile/buildlog.air.txt new file mode 100644 index 000000000..758330a34 --- /dev/null +++ b/libsrc/ffdec_lib/testdata/cross_compile/buildlog.air.txt @@ -0,0 +1,3 @@ +Loading configuration: c:\air\frameworks\flex-config.xml + +2753 bytes written to C:\Dropbox\Programovani\JavaSE\FFDec\libsrc\ffdec_lib\testdata\cross_compile\bin\Main.air.swf in 0,459 seconds diff --git a/libsrc/ffdec_lib/testdata/cross_compile/buildlog.flex.txt b/libsrc/ffdec_lib/testdata/cross_compile/buildlog.flex.txt new file mode 100644 index 000000000..f6277bc21 --- /dev/null +++ b/libsrc/ffdec_lib/testdata/cross_compile/buildlog.flex.txt @@ -0,0 +1,2 @@ +Loading configuration file C:\flex\frameworks\flex-config.xml +C:\Dropbox\Programovani\JavaSE\FFDec\libsrc\ffdec_lib\testdata\asc2\bin\Main.flex.swf (1083 bytes) diff --git a/libsrc/ffdec_lib/testdata/cross_compile/buildlog.flex_apache.txt b/libsrc/ffdec_lib/testdata/cross_compile/buildlog.flex_apache.txt new file mode 100644 index 000000000..258b0a3de --- /dev/null +++ b/libsrc/ffdec_lib/testdata/cross_compile/buildlog.flex_apache.txt @@ -0,0 +1,2 @@ +Loading configuration file C:\flex_apache\frameworks\flex-config.xml +C:\Dropbox\Programovani\JavaSE\FFDec\libsrc\ffdec_lib\testdata\cross_compile\bin\Main.flex_apache.swf (3617 bytes) diff --git a/libsrc/ffdec_lib/testdata/cross_compile/buildlog.swftools.txt b/libsrc/ffdec_lib/testdata/cross_compile/buildlog.swftools.txt new file mode 100644 index 000000000..18f232b14 --- /dev/null +++ b/libsrc/ffdec_lib/testdata/cross_compile/buildlog.swftools.txt @@ -0,0 +1,4 @@ +Stack mismatch at pos 61 +Should be: 1:1, is: 0:1 +Stack mismatch at pos 61 +Should be: 1:1, is: 0:1 diff --git a/libsrc/ffdec_lib/testdata/cross_compile/cross_compile.as3proj b/libsrc/ffdec_lib/testdata/cross_compile/cross_compile.as3proj new file mode 100644 index 000000000..19d21f07d --- /dev/null +++ b/libsrc/ffdec_lib/testdata/cross_compile/cross_compile.as3proj @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + build_air_debug.bat +build_flex_apache_debug.bat +build_swftools_debug.bat + + + + + + \ No newline at end of file diff --git a/libsrc/ffdec_lib/testdata/cross_compile/obj/cross_compileConfig.old b/libsrc/ffdec_lib/testdata/cross_compile/obj/cross_compileConfig.old new file mode 100644 index 000000000..90790e11c --- /dev/null +++ b/libsrc/ffdec_lib/testdata/cross_compile/obj/cross_compileConfig.old @@ -0,0 +1,48 @@ + + + + + 25.0 + false + true + + + CONFIG::debug + true + + + CONFIG::release + false + + + CONFIG::timeStamp + '31.01.2021' + + + CONFIG::air + false + + + CONFIG::mobile + false + + + CONFIG::desktop + false + + true + + C:\Dropbox\Programovani\JavaSE\FFDec\libsrc\ffdec_lib\testdata\cross_compile\src + C:\Program Files (x86)\FlashDevelop\Library\AS3\classes + + + + C:\Dropbox\Programovani\JavaSE\FFDec\libsrc\ffdec_lib\testdata\cross_compile\src\Main.as + + #FFFFFF + 30 + + 800 + 600 + + \ No newline at end of file diff --git a/libsrc/ffdec_lib/testdata/cross_compile/obj/cross_compileConfig.xml b/libsrc/ffdec_lib/testdata/cross_compile/obj/cross_compileConfig.xml new file mode 100644 index 000000000..90790e11c --- /dev/null +++ b/libsrc/ffdec_lib/testdata/cross_compile/obj/cross_compileConfig.xml @@ -0,0 +1,48 @@ + + + + + 25.0 + false + true + + + CONFIG::debug + true + + + CONFIG::release + false + + + CONFIG::timeStamp + '31.01.2021' + + + CONFIG::air + false + + + CONFIG::mobile + false + + + CONFIG::desktop + false + + true + + C:\Dropbox\Programovani\JavaSE\FFDec\libsrc\ffdec_lib\testdata\cross_compile\src + C:\Program Files (x86)\FlashDevelop\Library\AS3\classes + + + + C:\Dropbox\Programovani\JavaSE\FFDec\libsrc\ffdec_lib\testdata\cross_compile\src\Main.as + + #FFFFFF + 30 + + 800 + 600 + + \ No newline at end of file diff --git a/libsrc/ffdec_lib/testdata/cross_compile/src/Main.as b/libsrc/ffdec_lib/testdata/cross_compile/src/Main.as new file mode 100644 index 000000000..257c1c562 --- /dev/null +++ b/libsrc/ffdec_lib/testdata/cross_compile/src/Main.as @@ -0,0 +1,34 @@ +package +{ + import flash.display.MovieClip; + import flash.events.Event; + import tests.*; + + /** + * ... + * @author JPEXS + */ + public class Main extends MovieClip + { + TestTryCatch; + TestTryCatchIfInTry; + TestTryCatchLoop; + TestTryCatchExceptionUsage + TestTryFinally; + TestTryFinallyDirectReturnInFinally; + TestTryFinallyLoop; + TestTryFinallyLoopInFinally; + TestTryFinallyMultipleCatch; + TestTryFinallyReturn; + TestTryFinallyReturnInFinally; + TestTryFinallyReturnNested; + TestTryFinallyReturnVoid; + + public function Main() + { + + } + + } + +} \ No newline at end of file diff --git a/libsrc/ffdec_lib/testdata/cross_compile/src/tests/TestTryCatch.as b/libsrc/ffdec_lib/testdata/cross_compile/src/tests/TestTryCatch.as new file mode 100644 index 000000000..18490e38a --- /dev/null +++ b/libsrc/ffdec_lib/testdata/cross_compile/src/tests/TestTryCatch.as @@ -0,0 +1,26 @@ +package tests +{ + /** + * ... + * @author JPEXS + */ + public class TestTryCatch + { + + public function run() : void + { + trace("before try"); + try + { + trace("in try"); + } + catch (e:Error) + { + trace("in catch"); + } + trace("after"); + } + + } + +} \ No newline at end of file diff --git a/libsrc/ffdec_lib/testdata/cross_compile/src/tests/TestTryCatchExceptionUsage.as b/libsrc/ffdec_lib/testdata/cross_compile/src/tests/TestTryCatchExceptionUsage.as new file mode 100644 index 000000000..6a8c98a9d --- /dev/null +++ b/libsrc/ffdec_lib/testdata/cross_compile/src/tests/TestTryCatchExceptionUsage.as @@ -0,0 +1,26 @@ +package tests +{ + /** + * ... + * @author JPEXS + */ + public class TestTryCatchExceptionUsage + { + + public function run() : void + { + trace("before try"); + try + { + trace("in try"); + } + catch (e:Error) + { + trace("catched exception: "+e.message); + } + trace("after"); + } + + } + +} \ No newline at end of file diff --git a/libsrc/ffdec_lib/testdata/cross_compile/src/tests/TestTryCatchIfInTry.as b/libsrc/ffdec_lib/testdata/cross_compile/src/tests/TestTryCatchIfInTry.as new file mode 100644 index 000000000..306e8a995 --- /dev/null +++ b/libsrc/ffdec_lib/testdata/cross_compile/src/tests/TestTryCatchIfInTry.as @@ -0,0 +1,32 @@ +package tests +{ + /** + * ... + * @author JPEXS + */ + public class TestTryCatchIfInTry + { + + public function run() : void + { + var a:Boolean = true; + trace("before"); + try + { + if (a) + { + trace("ret"); + return; + } + trace("in try"); + } + catch (e:Error) + { + trace("in catch"); + } + trace("after"); + } + + } + +} \ No newline at end of file diff --git a/libsrc/ffdec_lib/testdata/cross_compile/src/tests/TestTryCatchLoop.as b/libsrc/ffdec_lib/testdata/cross_compile/src/tests/TestTryCatchLoop.as new file mode 100644 index 000000000..1d7cad3af --- /dev/null +++ b/libsrc/ffdec_lib/testdata/cross_compile/src/tests/TestTryCatchLoop.as @@ -0,0 +1,39 @@ +package tests +{ + import flash.errors.EOFError; + + /** + * ... + * @author JPEXS + */ + public class TestTryCatchLoop + { + + public function run() : void + { + var j:* = undefined; + for (var i:* = 0; i < 100; i++) + { + try + { + for (j = 0; j < 20; j++) + { + trace("a"); + } + } + catch (e:EOFError) + { + continue; + } + catch (e:Error) + { + continue; + } + trace("after_try"); + } + trace("end"); + } + + } + +} \ No newline at end of file diff --git a/libsrc/ffdec_lib/testdata/cross_compile/src/tests/TestTryFinally.as b/libsrc/ffdec_lib/testdata/cross_compile/src/tests/TestTryFinally.as new file mode 100644 index 000000000..33192f187 --- /dev/null +++ b/libsrc/ffdec_lib/testdata/cross_compile/src/tests/TestTryFinally.as @@ -0,0 +1,30 @@ +package tests +{ + /** + * ... + * @author JPEXS + */ + public class TestTryFinally + { + + public function run() : void + { + trace("before try"); + try + { + trace("in try"); + } + catch (e:Error) + { + trace("in catch"); + } + finally + { + trace("in finally"); + } + trace("after"); + } + + } + +} \ No newline at end of file diff --git a/libsrc/ffdec_lib/testdata/cross_compile/src/tests/TestTryFinallyDirectReturnInFinally.as b/libsrc/ffdec_lib/testdata/cross_compile/src/tests/TestTryFinallyDirectReturnInFinally.as new file mode 100644 index 000000000..815c73f6c --- /dev/null +++ b/libsrc/ffdec_lib/testdata/cross_compile/src/tests/TestTryFinallyDirectReturnInFinally.as @@ -0,0 +1,34 @@ +package tests +{ + /** + * ... + * @author JPEXS + */ + public class TestTryFinallyDirectReturnInFinally + { + + public function run() : String + { + + var str:String = "xxx"; + try + { + } + catch (e:Error) + { + trace("error"); + } + finally + { + trace("hi "); + if (5 == 4) + { + return str; + } + return "hu" + str; + } + } + + } + +} \ No newline at end of file diff --git a/libsrc/ffdec_lib/testdata/cross_compile/src/tests/TestTryFinallyLoop.as b/libsrc/ffdec_lib/testdata/cross_compile/src/tests/TestTryFinallyLoop.as new file mode 100644 index 000000000..06a3d7056 --- /dev/null +++ b/libsrc/ffdec_lib/testdata/cross_compile/src/tests/TestTryFinallyLoop.as @@ -0,0 +1,38 @@ +package tests +{ + /** + * ... + * @author JPEXS + */ + public class TestTryFinallyLoop + { + + public function run() : void + { + for (var i:int = 0; i < 10; i++) + { + trace("before try"); + try + { + trace("in try"); + if (i == 5) + { + trace("continue for"); + continue; + } + } + catch (e:Error) + { + trace("in catch"); + } + finally + { + trace("in finally"); + } + trace("after"); + } + } + + } + +} \ No newline at end of file diff --git a/libsrc/ffdec_lib/testdata/cross_compile/src/tests/TestTryFinallyLoopInFinally.as b/libsrc/ffdec_lib/testdata/cross_compile/src/tests/TestTryFinallyLoopInFinally.as new file mode 100644 index 000000000..4c3342857 --- /dev/null +++ b/libsrc/ffdec_lib/testdata/cross_compile/src/tests/TestTryFinallyLoopInFinally.as @@ -0,0 +1,38 @@ +package tests +{ + /** + * ... + * @author JPEXS + */ + public class TestTryFinallyLoopInFinally + { + + public function run() : void + { + for (var i:int = 0; i < 10; i++) + { + trace("before try"); + try + { + trace("in try"); + } + catch (e:Error) + { + trace("in catch"); + } + finally + { + if (i == 5) + { + trace("continue for"); + continue; + } + trace("in finally"); + } + trace("after"); + } + } + + } + +} \ No newline at end of file diff --git a/libsrc/ffdec_lib/testdata/cross_compile/src/tests/TestTryFinallyMultipleCatch.as b/libsrc/ffdec_lib/testdata/cross_compile/src/tests/TestTryFinallyMultipleCatch.as new file mode 100644 index 000000000..4cd44de0c --- /dev/null +++ b/libsrc/ffdec_lib/testdata/cross_compile/src/tests/TestTryFinallyMultipleCatch.as @@ -0,0 +1,35 @@ +package tests +{ + import flash.errors.EOFError; + /** + * ... + * @author JPEXS + */ + public class TestTryFinallyMultipleCatch + { + + public function run() : void + { + trace("before try"); + try + { + trace("in try"); + } + catch (e:Error) + { + trace("in catch Error"); + } + catch (e:EOFError) + { + trace("in catch EOFError"); + } + finally + { + trace("in finally"); + } + trace("after"); + } + + } + +} \ No newline at end of file diff --git a/libsrc/ffdec_lib/testdata/cross_compile/src/tests/TestTryFinallyReturn.as b/libsrc/ffdec_lib/testdata/cross_compile/src/tests/TestTryFinallyReturn.as new file mode 100644 index 000000000..4c75f1b84 --- /dev/null +++ b/libsrc/ffdec_lib/testdata/cross_compile/src/tests/TestTryFinallyReturn.as @@ -0,0 +1,42 @@ +package tests +{ + /** + * ... + * @author JPEXS + */ + public class TestTryFinallyReturn + { + + public function run() : String + { + trace("before try"); + try + { + trace("in try"); + var a:int = 5; + if (a > 4) + { + return "RET"; + } + trace("between"); + if (a < 3) + { + return "RE2"; + } + trace("in try2"); + } + catch (e:Error) + { + trace("in catch"); + } + finally + { + trace("in finally"); + } + trace("after"); + return "RETFINAL"; + } + + } + +} \ No newline at end of file diff --git a/libsrc/ffdec_lib/testdata/cross_compile/src/tests/TestTryFinallyReturnInFinally.as b/libsrc/ffdec_lib/testdata/cross_compile/src/tests/TestTryFinallyReturnInFinally.as new file mode 100644 index 000000000..045d50786 --- /dev/null +++ b/libsrc/ffdec_lib/testdata/cross_compile/src/tests/TestTryFinallyReturnInFinally.as @@ -0,0 +1,44 @@ +package tests +{ + /** + * ... + * @author JPEXS + */ + public class TestTryFinallyReturnInFinally + { + + public function run() : String + { + trace("before try"); + try + { + trace("in try"); + var a:int = 5; + if (a > 4) + { + return "RET"; + } + } + catch (e:Error) + { + trace("in catch"); + } + finally + { + trace("in finally"); + if (a > 6){ + return "FINRET1"; + } + trace("xx"); + if (a > 5){ + return "FINRET2"; + } + trace("nofinret"); + } + trace("after"); + return "RETEXIT"; + } + + } + +} \ No newline at end of file diff --git a/libsrc/ffdec_lib/testdata/cross_compile/src/tests/TestTryFinallyReturnNested.as b/libsrc/ffdec_lib/testdata/cross_compile/src/tests/TestTryFinallyReturnNested.as new file mode 100644 index 000000000..dc9d6d4da --- /dev/null +++ b/libsrc/ffdec_lib/testdata/cross_compile/src/tests/TestTryFinallyReturnNested.as @@ -0,0 +1,43 @@ +package tests +{ + /** + * ... + * @author JPEXS + */ + public class TestTryFinallyReturnNested + { + + public function run() : String + { + try + { + trace("before try2"); + try + { + trace("in try2"); + var a:int = 5; + if (a > 4) + { + return "RET"; + } + } + catch (e:Error) + { + trace("in catch"); + } + finally + { + trace("in finally2"); + } + trace("after"); + } + finally + { + trace("in finally1"); + } + return "RETFINAL"; + } + + } + +} \ No newline at end of file diff --git a/libsrc/ffdec_lib/testdata/cross_compile/src/tests/TestTryFinallyReturnVoid.as b/libsrc/ffdec_lib/testdata/cross_compile/src/tests/TestTryFinallyReturnVoid.as new file mode 100644 index 000000000..c18fb4b7e --- /dev/null +++ b/libsrc/ffdec_lib/testdata/cross_compile/src/tests/TestTryFinallyReturnVoid.as @@ -0,0 +1,36 @@ +package tests +{ + /** + * ... + * @author JPEXS + */ + public class TestTryFinallyReturnVoid + { + + public function run() : void + { + trace("before try"); + try + { + trace("in try"); + var a:int = 5; + if (a > 4) + { + return; + } + trace("in try2"); + } + catch (e:Error) + { + trace("in catch"); + } + finally + { + trace("in finally"); + } + trace("after"); + } + + } + +} \ No newline at end of file diff --git a/nbproject/project.xml b/nbproject/project.xml index 405584824..dbfce67c3 100644 --- a/nbproject/project.xml +++ b/nbproject/project.xml @@ -249,6 +249,10 @@ libsrc/ffdec_lib/lexers + + + libsrc/ffdec_lib/graphviz + build.xml