|
|
|
@ -1163,7 +1163,7 @@ class Decompiler
|
|
|
|
|
// }}}
|
|
|
|
|
|
|
|
|
|
// {{{ search firstJmpOp
|
|
|
|
|
$firstJmp = null;
|
|
|
|
|
$firstJmp = -1;
|
|
|
|
|
$firstJmpOp = null;
|
|
|
|
|
for ($i = $range[0]; $i <= $range[1]; ++$i) {
|
|
|
|
|
if (!empty($opcodes[$i]['jmpouts'])) {
|
|
|
|
@ -1173,13 +1173,24 @@ class Decompiler
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// }}}
|
|
|
|
|
// {{{ search lastJmpOp
|
|
|
|
|
$lastJmp = -1;
|
|
|
|
|
$lastJmpOp = null;
|
|
|
|
|
for ($i = $range[1]; $i > $firstJmp; --$i) {
|
|
|
|
|
if (!empty($opcodes[$i]['jmpouts'])) {
|
|
|
|
|
$lastJmp = $i;
|
|
|
|
|
$lastJmpOp = &$opcodes[$lastJmp];
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// }}}
|
|
|
|
|
|
|
|
|
|
// {{{ while
|
|
|
|
|
if (isset($firstJmpOp)
|
|
|
|
|
&& $firstJmpOp['opcode'] == XC_JMPZ
|
|
|
|
|
&& $firstJmpOp['jmpouts'][0] > $range[1]
|
|
|
|
|
&& $lastOp['opcode'] == XC_JMP && !empty($lastOp['jmpouts'])
|
|
|
|
|
&& $lastOp['jmpouts'][0] == $range[0]) {
|
|
|
|
|
&& $lastOp['opcode'] == XC_JMP
|
|
|
|
|
&& !empty($lastOp['jmpouts']) && $lastOp['jmpouts'][0] == $range[0]) {
|
|
|
|
|
$this->removeJmpInfo($EX, $firstJmp);
|
|
|
|
|
$this->removeJmpInfo($EX, $range[1]);
|
|
|
|
|
$this->beginComplexBlock($EX);
|
|
|
|
@ -1201,11 +1212,12 @@ class Decompiler
|
|
|
|
|
// {{{ foreach
|
|
|
|
|
if (isset($firstJmpOp)
|
|
|
|
|
&& $firstJmpOp['opcode'] == XC_FE_FETCH
|
|
|
|
|
&& $firstJmpOp['jmpouts'][0] > $range[1]
|
|
|
|
|
&& $lastOp['opcode'] == XC_JMP && !empty($lastOp['jmpouts'])
|
|
|
|
|
&& $lastOp['jmpouts'][0] == $firstJmp) {
|
|
|
|
|
&& !empty($firstJmpOp['jmpouts']) && $firstJmpOp['jmpouts'][0] > $lastJmp
|
|
|
|
|
&& isset($lastJmpOp)
|
|
|
|
|
&& $lastJmpOp['opcode'] == XC_JMP
|
|
|
|
|
&& !empty($lastJmpOp['jmpouts']) && $lastJmpOp['jmpouts'][0] == $firstJmp) {
|
|
|
|
|
$this->removeJmpInfo($EX, $firstJmp);
|
|
|
|
|
$this->removeJmpInfo($EX, $range[1]);
|
|
|
|
|
$this->removeJmpInfo($EX, $lastJmp);
|
|
|
|
|
$this->beginComplexBlock($EX);
|
|
|
|
|
|
|
|
|
|
ob_start();
|
|
|
|
@ -1224,8 +1236,8 @@ class Decompiler
|
|
|
|
|
echo $indent, '}', PHP_EOL;
|
|
|
|
|
|
|
|
|
|
$this->endComplexBlock($EX);
|
|
|
|
|
if ($opcodes[$range[1] + 1]['opcode'] == XC_SWITCH_FREE) {
|
|
|
|
|
$this->removeJmpInfo($EX, $range[1] + 1);
|
|
|
|
|
if ($lastOp['opcode'] == XC_SWITCH_FREE) {
|
|
|
|
|
$this->removeJmpInfo($EX, $range[1]);
|
|
|
|
|
}
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
@ -1350,8 +1362,8 @@ class Decompiler
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
case XC_SWITCH_FREE:
|
|
|
|
|
$op['jmpouts'] = array($i + 1);
|
|
|
|
|
$opcodes[$i + 1]['jmpins'][] = $i;
|
|
|
|
|
$op['jmpins'] = array($i - 1);
|
|
|
|
|
$opcodes[$i - 1]['jmpouts'][] = $i;
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case XC_CASE:
|
|
|
|
|