Ignore:
Timestamp:
2011-04-09T13:02:07+02:00 (3 years ago)
Author:
moo
Message:

improve method call decompiler

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Decompiler.class.php

    r717 r720  
    573573        // func call 
    574574        $EX['object'] = null; 
     575        $EX['called_scope'] = null; 
    575576        $EX['fbc'] = null; 
    576577        $EX['argstack'] = array(); 
     
    783784                switch ($opc) { 
    784785                case XC_NEW: // {{{ 
    785                     array_push($EX['arg_types_stack'], array($EX['object'], $EX['fbc'])); 
     786                    array_push($EX['arg_types_stack'], array($EX['fbc'], $EX['object'], $EX['called_scope'])); 
    786787                    $EX['object'] = (int) $res['var']; 
     788                    $EX['called_scope'] = null; 
    787789                    $EX['fbc'] = 'new ' . $this->unquoteName($this->getOpVal($op1, $EX)); 
    788790                    if (PHP_VERSION < 5) { 
     
    10531055                    break; 
    10541056                    // }}} 
     1057                case XC_INIT_STATIC_METHOD_CALL: 
    10551058                case XC_INIT_METHOD_CALL: 
    10561059                case XC_INIT_FCALL_BY_FUNC: 
     
    10591062                        break; 
    10601063                    } 
    1061                     array_push($EX['arg_types_stack'], array($EX['object'], $EX['fbc'])); 
    1062                     if ($opc == XC_INIT_METHOD_CALL || $op1['op_type'] != XC_IS_UNUSED) { 
     1064                    array_push($EX['arg_types_stack'], array($EX['fbc'], $EX['object'], $EX['called_scope'])); 
     1065                    if ($opc == XC_INIT_STATIC_METHOD_CALL) { 
     1066                        $EX['object'] = null; 
     1067                        $EX['called_scope'] = $op1['var']; 
     1068                    } 
     1069                    else if ($opc == XC_INIT_METHOD_CALL || $op1['op_type'] != XC_IS_UNUSED) { 
    10631070                        $obj = $this->getOpVal($op1, $EX); 
    10641071                        if (!isset($obj)) { 
    10651072                            $obj = '$this'; 
    10661073                        } 
    1067                         $EX['object'] = $obj; 
     1074                        // looks like PHP4 only 
     1075                        if (isset($op1['constant'])) { 
     1076                            $EX['object'] = null; 
     1077                            $EX['called_scope'] = $this->unquoteName($obj); 
     1078                        } 
     1079                        else { 
     1080                            $EX['object'] = $obj; 
     1081                            $EX['called_scope'] = null; 
     1082                        } 
    10681083                        if ($res['op_type'] != XC_IS_UNUSED) { 
    10691084                            $resvar = '$obj call$'; 
     
    10721087                    else { 
    10731088                        $EX['object'] = null; 
     1089                        $EX['called_scope'] = null; 
    10741090                    } 
    10751091 
     
    11061122                    $resvar = 
    11071123                        (isset($object) ? $object . '->' : '' ) 
     1124                        . (isset($EX['called_scope']) ? $EX['called_scope'] . '::' : '' ) 
    11081125                        . $fname . "($args)"; 
    11091126                    unset($args); 
     
    11131130                        $resvar = null; 
    11141131                    } 
    1115                     list($EX['object'], $EX['fbc']) = array_pop($EX['arg_types_stack']); 
     1132                    list($EX['fbc'], $EX['object'], $EX['called_scope']) = array_pop($EX['arg_types_stack']); 
    11161133                    break; 
    11171134                    // }}} 
     
    19131930    'XC_ISSET_ISEMPTY_PROP_OBJ' => -1, 
    19141931    'XC_ISSET_ISEMPTY_VAR' => -1, 
     1932    'XC_INIT_STATIC_METHOD_CALL' => -1, 
    19151933    'XC_INIT_METHOD_CALL' => -1, 
    19161934    'XC_VERIFY_ABSTRACT_CLASS' => -1, 
Note: See TracChangeset for help on using the changeset viewer.