Changeset 732


Ignore:
Timestamp:
2011-04-10T11:31:17+02:00 (3 years ago)
Author:
moo
Message:

disassembler/decompiler: fix multiline array and indention

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Decompiler.class.php

    r731 r732  
    99} 
    1010 
    11 function str($src, $indent = '') // {{{ 
     11function toCode($src, $indent = '') // {{{ 
    1212{ 
    1313    if (is_array($indent)) { 
     
    1515    } 
    1616 
    17     /* 
    18     $e = xcache_get_special_value($src); 
    19     if (isset($e)) { 
    20         if (is_array($e)) { 
    21             $src = $e; 
    22         } 
    23         else { 
    24             return $e; 
    25         } 
    26     } 
    27     */ 
    28  
    29     if (is_array($src)) { 
    30         exit('array str'); 
    31         $src = new Decompiler_Array($src, $indent); 
    32         return $src->__toString(); 
    33     } 
    34  
    3517    if (is_object($src)) { 
    36         if (!method_exists($src, '__toString')) { 
     18        if (!method_exists($src, 'toCode')) { 
    3719            var_dump($src); 
    38             exit('no __toString'); 
    39         } 
    40         return $src->__toString(); 
     20            exit('no toCode'); 
     21        } 
     22        return $src->toCode($indent); 
    4123    } 
    4224 
     
    8062    } 
    8163 
    82     function __toString() 
     64    function toCode($indent) 
    8365    { 
    8466        return var_export($this->value, true); 
     
    9577    } 
    9678 
    97     function __toString() 
     79    function toCode($indent) 
    9880    { 
    9981        return $this->src; 
     
    10789    var $op2; 
    10890    var $parent; 
     91    var $indent; 
    10992 
    11093    function Decompiler_Binop($parent, $op1, $opc, $op2) 
     
    11699    } 
    117100 
    118     function __toString() 
    119     { 
    120         $op1 = str($this->op1); 
     101    function toCode($indent) 
     102    { 
     103        $op1 = toCode($this->op1, $indent); 
    121104        if (is_a($this->op1, 'Decompiler_Binop') && $this->op1->opc != $this->opc) { 
    122105            $op1 = "($op1)"; 
     
    124107        $opstr = $this->parent->binops[$this->opc]; 
    125108        if ($op1 == '0' && $this->opc == XC_SUB) { 
    126             return $opstr . str($this->op2); 
    127         } 
    128         return $op1 . ' ' . $opstr . ' ' . str($this->op2); 
     109            return $opstr . toCode($this->op2, $indent); 
     110        } 
     111        return $op1 . ' ' . $opstr . ' ' . toCode($this->op2, $indent); 
    129112    } 
    130113} 
     
    142125    } 
    143126 
    144     function __toString() 
     127    function toCode($indent) 
    145128    { 
    146129        switch ($this->fetchType) { 
     
    168151    } 
    169152 
    170     function __toString() 
    171     { 
    172         return $this->obj->__toString(); 
     153    function toCode($indent) 
     154    { 
     155        return $this->obj->toCode($indent); 
    173156    } 
    174157} 
     
    180163    var $assign = null; 
    181164 
    182     function __toString() 
     165    function toCode($indent) 
    183166    { 
    184167        if (is_a($this->value, 'Decompiler_ListBox')) { 
    185             $exp = str($this->value->obj->src); 
     168            $exp = toCode($this->value->obj->src, $indent); 
    186169        } 
    187170        else { 
    188             $exp = str($this->value); 
     171            $exp = toCode($this->value, $indent); 
    189172        } 
    190173        foreach ($this->offsets as $dim) { 
    191             $exp .= '[' . str($dim) . ']'; 
     174            $exp .= '[' . toCode($dim, $indent) . ']'; 
    192175        } 
    193176        return $exp; 
     
    205188    var $everLocked = false; 
    206189 
    207     function __toString() 
     190    function toCode($indent) 
    208191    { 
    209192        if (count($this->dims) == 1 && !$this->everLocked) { 
     
    212195            $dim->value = $this->src; 
    213196            if (!isset($dim->assign)) { 
    214                 return str($dim); 
    215             } 
    216             return str($this->dims[0]->assign) . ' = ' . str($dim); 
     197                return toCode($dim, $indent); 
     198            } 
     199            return toCode($this->dims[0]->assign, $indent) . ' = ' . toCode($dim, $indent); 
    217200        } 
    218201        /* flatten dims */ 
     
    223206                $assign = &$assign[$offset]; 
    224207            } 
    225             $assign = str($dim->assign); 
    226         } 
    227         return $this->toList($assigns) . ' = ' . str($this->src); 
     208            $assign = toCode($dim->assign, $indent); 
     209        } 
     210        return $this->toList($assigns) . ' = ' . toCode($this->src, $indent); 
    228211    } 
    229212 
     
    260243class Decompiler_Array extends Decompiler_Value // {{{ 
    261244{ 
    262     var $indent = ''; 
    263  
    264     function Decompiler_Array($value = array(), $indent = '') 
     245    function Decompiler_Array($value = array()) 
    265246    { 
    266247        $this->value = $value; 
    267         $this->indent = $indent; 
    268     } 
    269  
    270     function __toString() 
     248    } 
     249 
     250    function toCode($indent) 
    271251    { 
    272252        $exp = "array("; 
    273         $indent = $this->indent . INDENT; 
     253        $indent = $indent . INDENT; 
    274254        $assoclen = 0; 
    275255        $multiline = 0; 
     
    282262                } 
    283263            } 
    284             if (is_array(value($v))) { 
     264            $spec = xcache_get_special_value($v); 
     265            if (is_array(isset($spec) ? $spec : $v)) { 
    285266                $multiline ++; 
    286267            } 
     
    315296            } 
    316297 
    317             $exp .= str(value($v), $subindent); 
     298            $exp .= toCode(value($v), $subindent); 
    318299 
    319300            $i ++; 
    320301        } 
    321302        if ($multiline) { 
    322             $exp .= "$indent);"; 
     303            $exp .= "\n$indent)"; 
    323304        } 
    324305        else { 
     
    333314    var $iskey; 
    334315 
    335     function __toString() 
     316    function toCode($indent) 
    336317    { 
    337318        return 'foreach (' . ''; 
     
    417398                    $curticks = $toticks; 
    418399                } 
    419                 echo $indent, str($op['php']), ";\n"; 
     400                echo $indent, toCode($op['php'], $indent), ";\n"; 
    420401            } 
    421402        } 
     
    429410        switch ($op['op_type']) { 
    430411        case XC_IS_CONST: 
    431             return str(value($op['constant'])); 
     412            return toCode(value($op['constant']), $EX); 
    432413 
    433414        case XC_IS_VAR: 
     
    436417            $ret = $T[$op['var']]; 
    437418            if ($tostr) { 
    438                 $ret = str($ret, $EX); 
     419                $ret = toCode($ret, $EX); 
    439420            } 
    440421            if ($free) { 
     
    641622            $body = ob_get_clean(); 
    642623 
    643             $as = str($op['fe_as']); 
     624            $as = toCode($op['fe_as'], $EX); 
    644625            if (isset($op['fe_key'])) { 
    645                 $as = str($op['fe_key']) . ' => ' . $as; 
    646             } 
    647             echo "{$indent}foreach (" . str($op['fe_src']) . " as $as) {\n"; 
     626                $as = toCode($op['fe_key'], $EX) . ' => ' . $as; 
     627            } 
     628            echo "{$indent}foreach (" . toCode($op['fe_src'], $EX) . " as $as) {\n"; 
    648629            echo $body; 
    649630            echo "{$indent}}"; 
     
    869850                    } 
    870851                    if ($opc == XC_UNSET_VAR) { 
    871                         $op['php'] = "unset(" . str($rvalue) . ")"; 
     852                        $op['php'] = "unset(" . toCode($rvalue, $EX) . ")"; 
    872853                        $lastphpop = &$op; 
    873854                    } 
     
    930911                        ++ $i; 
    931912                        $rvalue = $this->getOpVal($opcodes[$i]['op1'], $EX); 
    932                         $resvar = str($lvalue) . ' = ' . $rvalue; 
     913                        $resvar = toCode($lvalue, $EX) . ' = ' . $rvalue; 
    933914                    } 
    934915                    else if ($opc == XC_UNSET_DIM) { 
    935                         $op['php'] = "unset(" . str($rvalue) . ")"; 
     916                        $op['php'] = "unset(" . toCode($rvalue, $EX) . ")"; 
    936917                        $lastphpop = &$op; 
    937918                    } 
     
    954935                        $dim->assign = $lvalue; 
    955936                        if ($dim->isLast) { 
    956                             $resvar = str($dim->value); 
     937                            $resvar = toCode($dim->value, $EX); 
    957938                        } 
    958939                        unset($dim); 
    959940                        break; 
    960941                    } 
    961                     $resvar = "$lvalue = " . str($rvalue, $EX); 
     942                    $resvar = "$lvalue = " . toCode($rvalue, $EX); 
    962943                    break; 
    963944                    // }}} 
     
    966947                    $rvalue = $this->getOpVal($op2, $EX, false); 
    967948                    if (is_a($rvalue, 'Decompiler_Fetch')) { 
    968                         $src = str($rvalue->src); 
     949                        $src = toCode($rvalue->src, $EX); 
    969950                        if (substr($src, 1, -1) == substr($lvalue, 1)) { 
    970951                            switch ($rvalue->fetchType) { 
     
    980961                                    $var = $statics[$name]; 
    981962                                    $resvar .= ' = '; 
    982                                     $resvar .= str(value($var), $EX); 
     963                                    $resvar .= toCode(value($var), $EX); 
    983964                                } 
    984965                                unset($statics); 
     
    989970                    } 
    990971                    // TODO: PHP_6 global 
    991                     $rvalue = str($rvalue); 
     972                    $rvalue = toCode($rvalue, $EX); 
    992973                    $resvar = "$lvalue = &$rvalue"; 
    993974                    break; 
     
    12021183                    switch ($opc) { 
    12031184                    case XC_ADD_CHAR: 
    1204                         $op2val = str(chr($op2val), $EX); 
     1185                        $op2val = toCode(chr($op2val), $EX); 
    12051186                        break; 
    12061187                    case XC_ADD_STRING: 
    1207                         $op2val = str($op2val, $EX); 
     1188                        $op2val = toCode($op2val, $EX); 
    12081189                        break; 
    12091190                    case XC_ADD_VAR: 
     
    13451326                        $targetop = &$EX['opcodes'][$op2['opline_num']]; 
    13461327                        if ($opc == XC_JMPNZ_EX) { 
    1347                             $targetop['cond_true'][] = str($rvalue); 
     1328                            $targetop['cond_true'][] = toCode($rvalue, $EX); 
    13481329                        } 
    13491330                        else { 
    1350                             $targetop['cond_false'][] = str($rvalue); 
     1331                            $targetop['cond_false'][] = toCode($rvalue, $EX); 
    13511332                        } 
    13521333                        unset($targetop); 
     
    14161397                case XC_END_SILENCE: // {{{ 
    14171398                    $EX['silence'] --; 
    1418                     $lastresvar = '@' . str($lastresvar); 
     1399                    $lastresvar = '@' . toCode($lastresvar, $EX); 
    14191400                    break; 
    14201401                    // }}} 
     
    14861467            $a = array_pop($EX['argstack']); 
    14871468            if (is_array($a)) { 
    1488                 array_unshift($args, str($a, $EX)); 
     1469                array_unshift($args, toCode($a, $EX)); 
    14891470            } 
    14901471            else { 
     
    15431524    function dargs(&$EX, $indent) // {{{ 
    15441525    { 
    1545         $EX['indent'] = $indent; 
    15461526        $op_array = &$EX['op_array']; 
    15471527 
     
    16021582                } 
    16031583                $arg = $EX['recvs'][$i + 1]; 
    1604                 echo str($arg[0]); 
     1584                echo toCode($arg[0], $indent); 
    16051585                if (isset($arg[1])) { 
    1606                     echo ' = ', str($arg[1]); 
     1586                    echo ' = ', toCode($arg[1], $indent); 
    16071587                } 
    16081588            } 
     
    16811661                    echo $newindent; 
    16821662                    echo $prefix, $name, ' = '; 
    1683                     echo str(value($v), $EX); 
     1663                    echo toCode(value($v), $newindent); 
    16841664                    echo ";\n"; 
    16851665                } 
     
    17551735                if (isset($value)) { 
    17561736                    echo ' = '; 
    1757                     echo str(value($value)); 
     1737                    echo toCode(value($value), $newindent); 
    17581738                } 
    17591739                echo ";\n"; 
Note: See TracChangeset for help on using the changeset viewer.