Ignore:
Timestamp:
2013-07-17T11:10:44+02:00 (23 months ago)
Author:
moo
Message:

Decompiler: avoid duplicate switch result

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/lib/Decompiler.class.php

    r1322 r1329  
    11641164
    11651165        // {{{ search firstJmpOp
    1166         $firstJmp = null;
     1166        $firstJmp = -1;
    11671167        $firstJmpOp = null;
    11681168        for ($i = $range[0]; $i <= $range[1]; ++$i) {
     
    11741174        }
    11751175        // }}}
     1176        // {{{ search lastJmpOp
     1177        $lastJmp = -1;
     1178        $lastJmpOp = null;
     1179        for ($i = $range[1]; $i > $firstJmp; --$i) {
     1180            if (!empty($opcodes[$i]['jmpouts'])) {
     1181                $lastJmp = $i;
     1182                $lastJmpOp = &$opcodes[$lastJmp];
     1183                break;
     1184            }
     1185        }
     1186        // }}}
    11761187
    11771188        // {{{ while
     
    11791190         && $firstJmpOp['opcode'] == XC_JMPZ
    11801191         && $firstJmpOp['jmpouts'][0] > $range[1]
    1181          && $lastOp['opcode'] == XC_JMP && !empty($lastOp['jmpouts'])
    1182          && $lastOp['jmpouts'][0] == $range[0]) {
     1192         && $lastOp['opcode'] == XC_JMP
     1193         && !empty($lastOp['jmpouts']) && $lastOp['jmpouts'][0] == $range[0]) {
    11831194            $this->removeJmpInfo($EX, $firstJmp);
    11841195            $this->removeJmpInfo($EX, $range[1]);
     
    12021213        if (isset($firstJmpOp)
    12031214         && $firstJmpOp['opcode'] == XC_FE_FETCH
    1204          && $firstJmpOp['jmpouts'][0] > $range[1]
    1205          && $lastOp['opcode'] == XC_JMP && !empty($lastOp['jmpouts'])
    1206          && $lastOp['jmpouts'][0] == $firstJmp) {
     1215         && !empty($firstJmpOp['jmpouts']) && $firstJmpOp['jmpouts'][0] > $lastJmp
     1216         && isset($lastJmpOp)
     1217         && $lastJmpOp['opcode'] == XC_JMP
     1218         && !empty($lastJmpOp['jmpouts']) && $lastJmpOp['jmpouts'][0] == $firstJmp) {
    12071219            $this->removeJmpInfo($EX, $firstJmp);
    1208             $this->removeJmpInfo($EX, $range[1]);
     1220            $this->removeJmpInfo($EX, $lastJmp);
    12091221            $this->beginComplexBlock($EX);
    12101222
     
    12251237
    12261238            $this->endComplexBlock($EX);
    1227             if ($opcodes[$range[1] + 1]['opcode'] == XC_SWITCH_FREE) {
    1228                 $this->removeJmpInfo($EX, $range[1] + 1);
     1239            if ($lastOp['opcode'] == XC_SWITCH_FREE) {
     1240                $this->removeJmpInfo($EX, $range[1]);
    12291241            }
    12301242            return;
     
    13511363
    13521364            case XC_SWITCH_FREE:
    1353                 $op['jmpouts'] = array($i + 1);
    1354                 $opcodes[$i + 1]['jmpins'][] = $i;
     1365                $op['jmpins'] = array($i - 1);
     1366                $opcodes[$i - 1]['jmpouts'][] = $i;
    13551367                break;
    13561368
Note: See TracChangeset for help on using the changeset viewer.