Changeset 1335 in svn


Ignore:
Timestamp:
2013-07-19T08:50:48+02:00 (2 years ago)
Author:
Xuefer
Message:

Decompiler: update PHP4 support for static method call

Location:
trunk
Files:
2 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);
  • trunk/mod_disassembler/sample.cpp.php

    r1334 r1335  
    11<?php
    22#if PHP_VERSION >= 500
    3 #   define ClassClassName ClassName
    43#   define PublicMethod public
    54#else
    6 #   define ClassClassName classname
     5#   define ClassName classname
    76#   define PublicMethod
    87#   define abstract
     
    2120#endif
    2221
    23 abstract class ClassClassName
     22abstract class ClassName
    2423{
    2524#if PHP_VERSION >= 500
     
    118117        echo $GLOBALS['var']->indexProp;
    119118        ClassName::__construct();
     119        ClassName::$func();
    120120        echo __CLASS__;
    121121        echo __METHOD__;
Note: See TracChangeset for help on using the changeset viewer.