Ignore:
Timestamp:
2013-07-19T08:50:48+02:00 (9 months ago)
Author:
moo
Message:

Decompiler: update PHP4 support for static method call

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/lib/Decompiler.class.php

    r1333 r1335  
    602602    function stripNamespace($name) // {{{ 
    603603    { 
     604        if (!isset($name)) { 
     605            return $name; 
     606        } 
     607 
    604608        $name = str($name); 
    605609        $len = strlen($this->namespace) + 1; 
     
    18201824            case XC_INIT_METHOD_CALL: // {{{ 
    18211825                array_push($EX['arg_types_stack'], array($EX['fbc'], $EX['object'], $EX['called_scope'])); 
    1822                 if ($opc == XC_INIT_STATIC_METHOD_CALL || $opc == XC_INIT_METHOD_CALL || $op1['op_type'] != XC_IS_UNUSED) { 
     1826                if ($opc == XC_INIT_STATIC_METHOD_CALL) { 
     1827                    $EX['object'] = null; 
     1828                    $EX['called_scope'] = $this->stripNamespace(isset($op1['constant']) ? $op1['constant'] : $this->getOpVal($op1, $EX)); 
     1829                } 
     1830                else { 
    18231831                    $obj = $this->getOpVal($op1, $EX); 
    18241832                    if (!isset($obj)) { 
    18251833                        $obj = '$this'; 
    18261834                    } 
    1827                     if ($opc == XC_INIT_STATIC_METHOD_CALL || /* PHP4 */ isset($op1['constant'])) { 
    1828                         $EX['object'] = null; 
    1829                         $EX['called_scope'] = $this->stripNamespace(unquoteName($obj, $EX)); 
    1830                     } 
    1831                     else { 
    1832                         $EX['object'] = $obj; 
    1833                         $EX['called_scope'] = null; 
    1834                     } 
    1835                     if ($res['op_type'] != XC_IS_UNUSED) { 
    1836                         $resvar = '$obj call$'; 
    1837                     } 
    1838                 } 
    1839                 else { 
    1840                     $EX['object'] = null; 
     1835                    $EX['object'] = $obj; 
    18411836                    $EX['called_scope'] = null; 
    18421837                } 
     1838                if ($res['op_type'] != XC_IS_UNUSED) { 
     1839                    $resvar = '$obj call$'; 
     1840                } 
    18431841 
    18441842                $EX['fbc'] = isset($op2['constant']) ? $op2['constant'] : $this->getOpVal($op2, $EX); 
    1845                 if (($opc == XC_INIT_STATIC_METHOD_CALL || $opc == XC_INIT_METHOD_CALL) && !isset($EX['fbc'])) { 
     1843                if (!isset($EX['fbc'])) { 
    18461844                    $EX['fbc'] = '__construct'; 
    18471845                } 
     
    18541852                } 
    18551853                array_push($EX['arg_types_stack'], array($EX['fbc'], $EX['object'], $EX['called_scope'])); 
    1856                 $EX['object'] = null; 
    1857                 $EX['called_scope'] = null; 
    1858                 $EX['fbc'] = $this->getOpVal($op2, $EX); 
     1854                if (!ZEND_ENGINE_2 && ($ext & ZEND_MEMBER_FUNC_CALL)) { 
     1855                    if (isset($op1['constant'])) { 
     1856                        $EX['object'] = null; 
     1857                        $EX['called_scope'] = $this->stripNamespace($op1['constant']); 
     1858                    } 
     1859                    else { 
     1860                        $EX['object'] = $this->getOpVal($op1, $EX); 
     1861                        $EX['called_scope'] = null; 
     1862                    } 
     1863                } 
     1864                else { 
     1865                    $EX['object'] = null; 
     1866                    $EX['called_scope'] = null; 
     1867                } 
     1868                $EX['fbc'] = isset($op2['constant']) ? $op2['constant'] : $this->getOpVal($op2, $EX); 
    18591869                break; 
    18601870                // }}} 
     
    18801890                $object = null; 
    18811891 
    1882                 $fname = unquoteName($EX['fbc'], $EX); 
    18831892                if (!is_int($EX['object'])) { 
    18841893                    $object = $EX['object']; 
     
    18871896                $args = $this->popargs($EX, $ext); 
    18881897 
    1889                 $prefix = (isset($object) ? $object . '->' : '' ) 
    1890                     . (isset($EX['called_scope']) ? $EX['called_scope'] . '::' : '' ); 
     1898                $prefix = (isset($object) ? str($object) . '->' : '' ) 
     1899                    . (isset($EX['called_scope']) ? str($EX['called_scope']) . '::' : '' ); 
    18911900                $resvar = $prefix 
    1892                     . (!$prefix ? $this->stripNamespace($fname) : $fname) 
     1901                    . (!$prefix ? $this->stripNamespace($EX['fbc']) : str($EX['fbc'])) 
    18931902                    . "($args)"; 
    18941903                unset($args); 
Note: See TracChangeset for help on using the changeset viewer.