1
0
Fork 0

Decompiler: support for RETURN_BY_REF

This commit is contained in:
Xuefer 2015-06-21 16:14:29 +08:00
parent b72c808ac6
commit 2fade1672b
1 changed files with 23 additions and 1 deletions

View File

@ -2214,6 +2214,7 @@ class Decompiler
break;
// }}}
case XC_GENERATOR_RETURN:
case XC_RETURN_BY_REF:
case XC_RETURN: // {{{
$resvar = "return " . str($this->getOpVal($op1, $EX));
break;
@ -2652,6 +2653,7 @@ class Decompiler
{
$this->detectNamespace($func['op_array']['function_name']);
$returnByRef = '';
if ($nobody) {
$EX = array();
$EX['op_array'] = &$func['op_array'];
@ -2662,6 +2664,25 @@ class Decompiler
ob_start();
$EX = &$this->dop_array($func['op_array'], $indent . INDENT);
$body = ob_get_clean();
$hasReturn = false;
$hasReturnByRef = false;
foreach ($func['op_array']['opcodes'] as $op) {
switch ($op['opcode']) {
case XC_RETURN:
$hasReturn = true;
break;
case XC_RETURN_BY_REF:
$hasReturnByRef = true;
break;
}
}
if ($hasReturn && $hasReturnByRef) {
echo $indent, "// WARN: both return and return-by-ref present", PHP_EOL;
}
if ($hasReturnByRef) {
$returnByRef = '&';
}
}
$functionName = $this->stripNamespace($func['op_array']['function_name']);
@ -2674,7 +2695,7 @@ class Decompiler
if ($decorations) {
echo implode(' ', $decorations), ' ';
}
echo 'function', $functionName ? ' ' . $functionName : '', '(';
echo 'function', $functionName ? ' ' . $returnByRef . $functionName : '', '(';
$this->dargs($EX);
echo ")";
$this->duses($EX);
@ -3177,6 +3198,7 @@ foreach (array(
'XC_PRE_INC_OBJ' => -1,
'XC_QM_ASSIGN_VAR' => -1,
'XC_RAISE_ABSTRACT_ERROR' => -1,
'XC_RETURN_BY_REF' => -1,
'XC_THROW' => -1,
'XC_UNSET_DIM' => -1,
'XC_UNSET_DIM_OBJ' => -1,