Changeset 735 in svn for trunk


Ignore:
Timestamp:
2011-04-10T16:09:17+02:00 (4 years ago)
Author:
Xuefer
Message:

decompiler: fix array assoc handling, remove default return

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Decompiler.class.php

    r733 r735  
    252252        $exp = "array(";
    253253        $indent = $indent . INDENT;
    254         $assoclen = 0;
     254        $assocWidth = 0;
    255255        $multiline = 0;
    256256        $i = 0;
    257257        foreach ($this->value as $k => $v) {
    258258            if ($i !== $k) {
     259                $assocWidth = 1;
     260            }
     261            ++$i;
     262        }
     263        foreach ($this->value as $k => $v) {
     264            if ($assocWidth) {
    259265                $len = strlen($k);
    260                 if ($assoclen < $len) {
    261                     $assoclen = $len;
     266                if ($assocWidth < $len) {
     267                    $assocWidth = $len;
    262268                }
    263269            }
     
    266272                $multiline ++;
    267273            }
    268             ++ $i;
    269         }
    270         if ($assoclen) {
    271             $assoclen += 2;
     274        }
     275        if ($assocWidth) {
     276            $assocWidth += 2;
    272277        }
    273278
     
    289294
    290295            $k = var_export($k, true);
    291             if ($multiline) {
    292                 $exp .= sprintf("%{$assoclen}s => ", $k);
    293             }
    294             else if ($assoclen) {
    295                 $exp .= $k . ' => ';
     296            if ($assocWidth) {
     297                if ($multiline) {
     298                    $exp .= sprintf("%{$assocWidth}s => ", $k);
     299                }
     300                else {
     301                    $exp .= $k . ' => ';
     302                }
    296303            }
    297304
     
    447454    }
    448455    // }}}
    449     function &fixOpcode($opcodes, $removeTailing = false) // {{{
    450     {
    451         if ($removeTailing) {
    452             $last = count($opcodes) - 1;
    453             if ($opcodes[$last]['opcode'] == XC_HANDLE_EXCEPTION) {
    454                 unset($opcodes[$last]);
    455             }
    456         }
     456    function &fixOpcode($opcodes, $removeTailing = false, $defaultReturnValue = null) // {{{
     457    {
    457458        for ($i = 0, $cnt = count($opcodes); $i < $cnt; $i ++) {
    458459            if (function_exists('xcache_get_fixed_opcode')) {
     
    486487            }
    487488        }
     489
     490        if ($removeTailing) {
     491            $last = count($opcodes) - 1;
     492            if ($opcodes[$last]['opcode'] == XC_HANDLE_EXCEPTION) {
     493                unset($opcodes[$last]);
     494                --$last;
     495            }
     496            if ($opcodes[$last]['opcode'] == XC_RETURN) {
     497                $op1 = $opcodes[$last]['op1'];
     498                if ($op1['op_type'] == XC_IS_CONST && array_key_exists('constant', $op1) && $op1['constant'] === $defaultReturnValue) {
     499                    unset($opcodes[$last]);
     500                    --$last;
     501                }
     502            }
     503        }
    488504        return $opcodes;
    489505    }
     
    491507    function &dop_array($op_array, $indent = '') // {{{
    492508    {
    493         $op_array['opcodes'] = $this->fixOpcode($op_array['opcodes'], true);
     509        $op_array['opcodes'] = $this->fixOpcode($op_array['opcodes'], true, $indent == '' ? 1 : null);
    494510        $opcodes = &$op_array['opcodes'];
    495511        $EX['indent'] = '';
Note: See TracChangeset for help on using the changeset viewer.