Changeset 720 for trunk


Ignore:
Timestamp:
2011-04-09T13:02:07+02:00 (4 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.