|
|
|
@ -601,6 +601,10 @@ class Decompiler
|
|
|
|
|
// }}}
|
|
|
|
|
function stripNamespace($name) // {{{
|
|
|
|
|
{
|
|
|
|
|
if (!isset($name)) {
|
|
|
|
|
return $name;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$name = str($name);
|
|
|
|
|
$len = strlen($this->namespace) + 1;
|
|
|
|
|
if (substr($name, 0, $len) == $this->namespace . '\\') {
|
|
|
|
@ -1819,30 +1823,24 @@ class Decompiler
|
|
|
|
|
case XC_INIT_STATIC_METHOD_CALL:
|
|
|
|
|
case XC_INIT_METHOD_CALL: // {{{
|
|
|
|
|
array_push($EX['arg_types_stack'], array($EX['fbc'], $EX['object'], $EX['called_scope']));
|
|
|
|
|
if ($opc == XC_INIT_STATIC_METHOD_CALL || $opc == XC_INIT_METHOD_CALL || $op1['op_type'] != XC_IS_UNUSED) {
|
|
|
|
|
if ($opc == XC_INIT_STATIC_METHOD_CALL) {
|
|
|
|
|
$EX['object'] = null;
|
|
|
|
|
$EX['called_scope'] = $this->stripNamespace(isset($op1['constant']) ? $op1['constant'] : $this->getOpVal($op1, $EX));
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
$obj = $this->getOpVal($op1, $EX);
|
|
|
|
|
if (!isset($obj)) {
|
|
|
|
|
$obj = '$this';
|
|
|
|
|
}
|
|
|
|
|
if ($opc == XC_INIT_STATIC_METHOD_CALL || /* PHP4 */ isset($op1['constant'])) {
|
|
|
|
|
$EX['object'] = null;
|
|
|
|
|
$EX['called_scope'] = $this->stripNamespace(unquoteName($obj, $EX));
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
$EX['object'] = $obj;
|
|
|
|
|
$EX['called_scope'] = null;
|
|
|
|
|
}
|
|
|
|
|
if ($res['op_type'] != XC_IS_UNUSED) {
|
|
|
|
|
$resvar = '$obj call$';
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
$EX['object'] = null;
|
|
|
|
|
$EX['object'] = $obj;
|
|
|
|
|
$EX['called_scope'] = null;
|
|
|
|
|
}
|
|
|
|
|
if ($res['op_type'] != XC_IS_UNUSED) {
|
|
|
|
|
$resvar = '$obj call$';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$EX['fbc'] = isset($op2['constant']) ? $op2['constant'] : $this->getOpVal($op2, $EX);
|
|
|
|
|
if (($opc == XC_INIT_STATIC_METHOD_CALL || $opc == XC_INIT_METHOD_CALL) && !isset($EX['fbc'])) {
|
|
|
|
|
if (!isset($EX['fbc'])) {
|
|
|
|
|
$EX['fbc'] = '__construct';
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
@ -1853,9 +1851,21 @@ class Decompiler
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
array_push($EX['arg_types_stack'], array($EX['fbc'], $EX['object'], $EX['called_scope']));
|
|
|
|
|
$EX['object'] = null;
|
|
|
|
|
$EX['called_scope'] = null;
|
|
|
|
|
$EX['fbc'] = $this->getOpVal($op2, $EX);
|
|
|
|
|
if (!ZEND_ENGINE_2 && ($ext & ZEND_MEMBER_FUNC_CALL)) {
|
|
|
|
|
if (isset($op1['constant'])) {
|
|
|
|
|
$EX['object'] = null;
|
|
|
|
|
$EX['called_scope'] = $this->stripNamespace($op1['constant']);
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
$EX['object'] = $this->getOpVal($op1, $EX);
|
|
|
|
|
$EX['called_scope'] = null;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
$EX['object'] = null;
|
|
|
|
|
$EX['called_scope'] = null;
|
|
|
|
|
}
|
|
|
|
|
$EX['fbc'] = isset($op2['constant']) ? $op2['constant'] : $this->getOpVal($op2, $EX);
|
|
|
|
|
break;
|
|
|
|
|
// }}}
|
|
|
|
|
case XC_INIT_FCALL_BY_FUNC: // {{{ deprecated even in PHP 4?
|
|
|
|
@ -1879,17 +1889,16 @@ class Decompiler
|
|
|
|
|
case XC_DO_FCALL_BY_NAME: // {{{
|
|
|
|
|
$object = null;
|
|
|
|
|
|
|
|
|
|
$fname = unquoteName($EX['fbc'], $EX);
|
|
|
|
|
if (!is_int($EX['object'])) {
|
|
|
|
|
$object = $EX['object'];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$args = $this->popargs($EX, $ext);
|
|
|
|
|
|
|
|
|
|
$prefix = (isset($object) ? $object . '->' : '' )
|
|
|
|
|
. (isset($EX['called_scope']) ? $EX['called_scope'] . '::' : '' );
|
|
|
|
|
$prefix = (isset($object) ? str($object) . '->' : '' )
|
|
|
|
|
. (isset($EX['called_scope']) ? str($EX['called_scope']) . '::' : '' );
|
|
|
|
|
$resvar = $prefix
|
|
|
|
|
. (!$prefix ? $this->stripNamespace($fname) : $fname)
|
|
|
|
|
. (!$prefix ? $this->stripNamespace($EX['fbc']) : str($EX['fbc']))
|
|
|
|
|
. "($args)";
|
|
|
|
|
unset($args);
|
|
|
|
|
|
|
|
|
|