Changeset 1329


Ignore:
Timestamp:
2013-07-17T11:10:44+02:00 (15 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.