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


Ignore:
Timestamp:
2011-04-10T09:31:17Z (4 years ago)
Author:
Xuefer
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.