Changeset 804 in svn for trunk/Decompiler.class.php


Ignore:
Timestamp:
2011-04-27T06:57:58+02:00 (4 years ago)
Author:
Xuefer
Message:

Decompiler: get value from result instead of op1/op2 if possible

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Decompiler.class.php

    r803 r804  
    750750
    751751            $this->recognizeAndDecompileClosedBlocks($EX, array($range[0], $range[0]), $indent . INDENT);
    752             $op1 = $this->getOpVal($firstOp['op1'], $EX, true);
     752            $op1 = $this->getOpVal($firstOp['result'], $EX, true);
    753753
    754754            $this->recognizeAndDecompileClosedBlocks($EX, array($range[0] + 1, $range[1]), $indent . INDENT);
    755             $op2 = $this->getOpVal($lastOp['op1'], $EX, true);
     755            $op2 = $this->getOpVal($lastOp['result'], $EX, true);
    756756
    757757            $T[$firstOp['result']['var']] = new Decompiler_Binop($this, $op1, $firstOp['opcode'], $op2);
     
    772772            $condition = $this->getOpVal($firstOp['op1'], $EX);
    773773            $this->recognizeAndDecompileClosedBlocks($EX, $trueRange, $indent . INDENT);
    774             $trueValue = $this->getOpVal($opcodes[$trueRange[1]]['op1'], $EX, true);
     774            $trueValue = $this->getOpVal($opcodes[$trueRange[1]]['result'], $EX, true);
    775775            $this->recognizeAndDecompileClosedBlocks($EX, $falseRange, $indent . INDENT);
    776             $falseValue = $this->getOpVal($opcodes[$falseRange[1]]['op1'], $EX, true);
     776            $falseValue = $this->getOpVal($opcodes[$falseRange[1]]['result'], $EX, true);
    777777            $T[$opcodes[$trueRange[1]]['result']['var']] = new Decompiler_TriOp($condition, $trueValue, $falseValue);
    778778            return false;
     
    877877            $this->beginComplexBlock($EX);
    878878
    879             echo $indent, 'switch (', str($this->getOpVal($caseOp['op1'], $EX, true, true), $EX), ") {", PHP_EOL;
     879            echo $indent, 'switch (', str($this->getOpVal($caseOp['op1'], $EX), $EX), ") {", PHP_EOL;
    880880            $caseIsOut = false;
    881881            foreach ($cases as $caseFirst => $caseLast) {
     
    19571957                $resvar = new Decompiler_Binop($this, $this->getOpVal($op1, $EX), XC_JMP_SET, null);
    19581958                break;
     1959            case XC_JMPZ_EX: // and
     1960            case XC_JMPNZ_EX: // or
     1961                $resvar = $this->getOpVal($op1, $EX);
     1962                break;
     1963
    19591964            case XC_JMPNZ: // while
    19601965            case XC_JMPZNZ: // for
    1961             case XC_JMPZ_EX: // and
    1962             case XC_JMPNZ_EX: // or
    19631966            case XC_JMPZ: // {{{
    19641967                if ($opc == XC_JMP_NO_CTOR && $EX['object']) {
     
    19781981                    var_dump($op);// exit;
    19791982                }
    1980                 if ($opc == XC_JMPZ_EX || $opc == XC_JMPNZ_EX) {
    1981                     $targetop = &$EX['opcodes'][$op2['opline_num']];
    1982                     if ($opc == XC_JMPNZ_EX) {
    1983                         $targetop['cond_true'][] = foldToCode($rvalue, $EX);
    1984                     }
    1985                     else {
    1986                         $targetop['cond_false'][] = foldToCode($rvalue, $EX);
    1987                     }
    1988                     unset($targetop);
    1989                 }
    1990                 else {
    1991                     $op['cond'] = $rvalue;
    1992                     $op['isjmp'] = true;
    1993                 }
     1983                $op['cond'] = $rvalue;
     1984                $op['isjmp'] = true;
    19941985                break;
    19951986                // }}}
Note: See TracChangeset for help on using the changeset viewer.