- Timestamp:
- 2011-04-16T21:01:39+02:00 (2 years ago)
- Location:
- trunk
- Files:
-
- 4 edited
-
Decompiler.class.php (modified) (52 diffs)
-
decompilesample.php (modified) (9 diffs)
-
disassembler.c (modified) (2 diffs)
-
utils.c (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Decompiler.class.php
r746 r749 71 71 } 72 72 // }}} 73 function unquoteProperty($str, $indent = '') // {{{ 74 { 75 $str = str($str, $indent); 76 if (preg_match("!^'[\\w_][\\w\\d_]*'\$!", $str)) { 77 return substr($str, 1, -1); 78 } 79 else { 80 return "{" . $str . "}"; 81 } 82 } 83 // }}} 84 function unquoteName($str, $indent = '') // {{{ 85 { 86 $str = str($str, $indent); 87 if (preg_match("!^'[\\w_][\\w\\d_]*'\$!", $str)) { 88 return substr($str, 1, -1); 89 } 90 else { 91 return $str; 92 } 93 } 94 // }}} 73 95 class Decompiler_Object // {{{ 74 96 { … … 154 176 return '$' . substr($this->src, 1, -1); 155 177 case ZEND_FETCH_STATIC: 178 if (ZEND_ENGINE_2_3) { 179 // closure local variable? 180 return str($this->src); 181 } 156 182 die('static fetch cant to string'); 157 183 case ZEND_FETCH_GLOBAL: … … 184 210 var $offsets = array(); 185 211 var $isLast = false; 212 var $isObject = false; 186 213 var $assign = null; 187 214 … … 189 216 { 190 217 if (is_a($this->value, 'Decompiler_ListBox')) { 191 $exp = foldToCode($this->value->obj->src, $indent);218 $exp = str($this->value->obj->src, $indent); 192 219 } 193 220 else { 194 $exp = foldToCode($this->value, $indent); 195 } 196 foreach ($this->offsets as $dim) { 197 $exp .= '[' . foldToCode($dim, $indent) . ']'; 221 $exp = str($this->value, $indent); 222 } 223 $last = count($this->offsets) - 1; 224 foreach ($this->offsets as $i => $dim) { 225 if ($this->isObject && $i == $last) { 226 $exp .= '->' . unquoteProperty($dim, $indent); 227 } 228 else { 229 $exp .= '[' . str($dim, $indent) . ']'; 230 } 198 231 } 199 232 return $exp; … … 220 253 return foldToCode($dim, $indent); 221 254 } 222 return foldToCode($this->dims[0]->assign, $indent) . ' = ' . foldToCode($dim, $indent);255 return foldToCode($this->dims[0]->assign, $indent) . ' = ' . str($dim, $indent); 223 256 } 224 257 /* flatten dims */ … … 231 264 $assign = foldToCode($dim->assign, $indent); 232 265 } 233 return $this->toList($assigns) . ' = ' . foldToCode($this->src, $indent);266 return $this->toList($assigns) . ' = ' . str($this->src, $indent); 234 267 } 235 268 … … 377 410 { 378 411 var $rName = '!^[\\w_][\\w\\d_]*$!'; 379 var $rQuotedName = "!^'[\\w_][\\w\\d_]*'\$!";380 412 381 413 function Decompiler() … … 439 471 $curticks = $toticks; 440 472 if (!$curticks) { 441 echo $origindent, "}\n ";473 echo $origindent, "}\n\n"; 442 474 $indent = $origindent; 443 475 } 444 476 else { 445 477 if ($oldticks) { 446 echo $origindent, "}\n ";478 echo $origindent, "}\n\n"; 447 479 } 448 480 else if (!$oldticks) { … … 569 601 $op['line'] = $i; 570 602 switch ($op['opcode']) { 603 case XC_GOTO: 571 604 case XC_JMP: 572 605 $target = $op['op1']['var']; … … 587 620 case XC_JMPZ_EX: 588 621 case XC_JMPNZ_EX: 622 case XC_JMP_SET: 589 623 // case XC_FE_RESET: 590 624 case XC_FE_FETCH: … … 772 806 } 773 807 // }}} 774 function unquoteName($str) // {{{775 {776 $str = str($str);777 if (preg_match($this->rQuotedName, $str)) {778 $str = substr($str, 1, -1);779 }780 return $str;781 }782 // }}}783 808 function dasmBasicBlock(&$EX, $opline, $last) // {{{ 784 809 { … … 843 868 $EX['object'] = (int) $res['var']; 844 869 $EX['called_scope'] = null; 845 $EX['fbc'] = 'new ' . $this->unquoteName($this->getOpVal($op1, $EX));870 $EX['fbc'] = 'new ' . unquoteName($this->getOpVal($op1, $EX), $EX); 846 871 if (!ZEND_ENGINE_2) { 847 872 $resvar = '$new object$'; 848 873 } 874 break; 875 // }}} 876 case XC_THROW: // {{{ 877 $resvar = 'throw ' . str($this->getOpVal($op1, $EX)); 878 break; 879 // }}} 880 case XC_CLONE: // {{{ 881 $resvar = 'clone ' . str($this->getOpVal($op1, $EX)); 882 break; 883 // }}} 884 case XC_CATCH: // {{{ 885 $resvar = 'catch (' . str($this->getOpVal($op1, $EX)) . ' ' . str($this->getOpVal($op2, $EX)) . ')'; 886 break; 887 // }}} 888 case XC_INSTANCEOF: // {{{ 889 $resvar = str($this->getOpVal($op1, $EX)) . ' instanceof ' . str($this->getOpVal($op2, $EX)); 849 890 break; 850 891 // }}} … … 865 906 } 866 907 else { 867 $class = $ op2['constant'];868 if (is _object($class)) {869 $class = get_class($class);908 $class = $this->getOpVal($op2, $EX); 909 if (isset($op2['constant'])) { 910 $class = unquoteName($class); 870 911 } 871 912 } … … 874 915 // }}} 875 916 case XC_FETCH_CONSTANT: // {{{ 917 if ($op1['op_type'] == XC_IS_UNUSED) { 918 $resvar = $op2['constant']; 919 break; 920 } 921 876 922 if ($op1['op_type'] == XC_IS_CONST) { 877 923 $resvar = $op1['constant']; 878 924 } 879 else if ($op1['op_type'] == XC_IS_UNUSED) {880 $resvar = $op2['constant'];881 }882 925 else { 883 $ class = $T[$op1['var']];884 assert($class[0] == 'class');885 $resvar = $class[1] . '::' . $op2['constant']; 886 }926 $resvar = $this->getOpVal($op1, $EX); 927 } 928 929 $resvar = str($resvar) . '::' . unquoteName($this->getOpVal($op2, $EX)); 887 930 break; 888 931 // }}} … … 905 948 case ZEND_FETCH_STATIC_MEMBER: 906 949 $class = $this->getOpVal($op2, $EX); 907 $rvalue = $class . '::$' . $this->unquoteName($rvalue);950 $rvalue = str($class) . '::$' . unquoteName($rvalue, $EX); 908 951 break; 909 952 default: 910 $name = $this->unquoteName($rvalue);911 $globalname = xcache_is_autoglobal($name) ? "\$$name" : "\$GLOBALS[ $rvalue]";953 $name = unquoteName($rvalue, $EX); 954 $globalname = xcache_is_autoglobal($name) ? "\$$name" : "\$GLOBALS[" . str($rvalue) . "]"; 912 955 $rvalue = new Decompiler_Fetch($rvalue, $fetchtype, $globalname); 913 956 break; … … 931 974 case XC_FETCH_DIM_IS: 932 975 case XC_ASSIGN_DIM: 976 case XC_UNSET_DIM_OBJ: // PHP 4 only 933 977 case XC_UNSET_DIM: 934 case XC_UNSET_ DIM_OBJ:978 case XC_UNSET_OBJ: 935 979 $src = $this->getOpVal($op1, $EX, false); 936 980 if (is_a($src, "Decompiler_ForeachBox")) { … … 939 983 break; 940 984 } 941 else if (is_a($src, "Decompiler_DimBox")) { 985 986 if (is_a($src, "Decompiler_DimBox")) { 942 987 $dimbox = $src; 943 988 } 944 989 else { 945 990 if (!is_a($src, "Decompiler_ListBox")) { 946 $list = new Decompiler_List($this->getOpVal($op1, $EX, false)); 991 $op1val = $this->getOpVal($op1, $EX, false); 992 $list = new Decompiler_List(isset($op1val) ? $op1val : '$this'); 947 993 948 994 $src = new Decompiler_ListBox($list); … … 968 1014 $dim->isLast = true; 969 1015 } 1016 if ($opc == XC_UNSET_OBJ) { 1017 $dim->isObject = true; 1018 } 970 1019 unset($dim); 971 1020 $rvalue = $dimbox; 1021 unset($dimbox); 972 1022 973 1023 if ($opc == XC_ASSIGN_DIM) { … … 975 1025 ++ $i; 976 1026 $rvalue = $this->getOpVal($opcodes[$i]['op1'], $EX); 977 $resvar = str($lvalue, $EX) . ' = ' . $rvalue;978 } 979 else if ($opc == XC_UNSET_DIM ) {1027 $resvar = str($lvalue, $EX) . ' = ' . str($rvalue); 1028 } 1029 else if ($opc == XC_UNSET_DIM || $opc == XC_UNSET_OBJ) { 980 1030 $op['php'] = "unset(" . str($rvalue, $EX) . ")"; 981 1031 $lastphpop = &$op; … … 1011 1061 $rvalue = $this->getOpVal($op2, $EX, false); 1012 1062 if (is_a($rvalue, 'Decompiler_Fetch')) { 1013 $src = foldToCode($rvalue->src, $EX);1063 $src = str($rvalue->src, $EX); 1014 1064 if (substr($src, 1, -1) == substr($lvalue, 1)) { 1015 1065 switch ($rvalue->fetchType) { … … 1050 1100 $obj = '$this'; 1051 1101 } 1052 $prop = $this->getOpVal($op2, $EX); 1053 if (preg_match($this->rQuotedName, $prop)) { 1054 $prop = substr($prop, 1, -1);; 1055 $rvalue = "{$obj}->$prop"; 1056 } 1057 else { 1058 $rvalue = "{$obj}->{" . "$prop}"; 1059 } 1102 $rvalue = str($obj) . "->" . unquoteProperty($this->getOpVal($op2, $EX), $EX); 1060 1103 if ($res['op_type'] != XC_IS_UNUSED) { 1061 1104 $resvar = $rvalue; … … 1065 1108 $lvalue = $rvalue; 1066 1109 $rvalue = $this->getOpVal($opcodes[$i]['op1'], $EX); 1067 $resvar = "$lvalue = $rvalue";1110 $resvar = "$lvalue = " . str($rvalue); 1068 1111 } 1069 1112 break; … … 1125 1168 // }}} 1126 1169 case XC_INIT_STATIC_METHOD_CALL: 1127 case XC_INIT_METHOD_CALL: 1128 case XC_INIT_FCALL_BY_FUNC: 1129 case XC_INIT_FCALL_BY_NAME: // {{{ 1130 if (($ext & ZEND_CTOR_CALL)) { 1131 break; 1132 } 1170 case XC_INIT_METHOD_CALL: // {{{ 1133 1171 array_push($EX['arg_types_stack'], array($EX['fbc'], $EX['object'], $EX['called_scope'])); 1134 1172 if ($opc == XC_INIT_STATIC_METHOD_CALL || $opc == XC_INIT_METHOD_CALL || $op1['op_type'] != XC_IS_UNUSED) { … … 1139 1177 if ($opc == XC_INIT_STATIC_METHOD_CALL || /* PHP4 */ isset($op1['constant'])) { 1140 1178 $EX['object'] = null; 1141 $EX['called_scope'] = $this->unquoteName($obj);1179 $EX['called_scope'] = unquoteName($obj, $EX); 1142 1180 } 1143 1181 else { … … 1154 1192 } 1155 1193 1156 if ($opc == XC_INIT_FCALL_BY_FUNC) { 1157 $which = $op1['var']; 1158 $EX['fbc'] = $EX['op_array']['funcs'][$which]['name']; 1159 } 1160 else { 1161 $EX['fbc'] = $this->getOpVal($op2, $EX, false); 1162 } 1194 $EX['fbc'] = $this->getOpVal($op2, $EX, false); 1195 if (($opc == XC_INIT_STATIC_METHOD_CALL || $opc == XC_INIT_METHOD_CALL) && !isset($EX['fbc'])) { 1196 $EX['fbc'] = '__construct'; 1197 } 1198 break; 1199 // }}} 1200 case XC_INIT_FCALL_BY_NAME: // {{{ 1201 if (!ZEND_ENGINE_2 && ($ext & ZEND_CTOR_CALL)) { 1202 break; 1203 } 1204 $EX['object'] = null; 1205 $EX['called_scope'] = null; 1206 $EX['fbc'] = $this->getOpVal($op2, $EX); 1207 break; 1208 // }}} 1209 case XC_INIT_FCALL_BY_FUNC: // {{{ deprecated even in PHP 4? 1210 $EX['object'] = null; 1211 $EX['called_scope'] = null; 1212 $which = $op1['var']; 1213 $EX['fbc'] = $EX['op_array']['funcs'][$which]['name']; 1163 1214 break; 1164 1215 // }}} … … 1170 1221 break; 1171 1222 case XC_DO_FCALL: 1172 $fname = $this->unquoteName($this->getOpVal($op1, $EX, false));1223 $fname = unquoteName($this->getOpVal($op1, $EX, false), $EX); 1173 1224 $args = $this->popargs($EX, $ext); 1174 1225 $resvar = $fname . "($args)"; … … 1177 1228 $object = null; 1178 1229 1179 $fname = $this->unquoteName($EX['fbc']);1230 $fname = unquoteName($EX['fbc'], $EX); 1180 1231 if (!is_int($EX['object'])) { 1181 1232 $object = $EX['object']; … … 1211 1262 } 1212 1263 $class = &$this->dc['class_table'][$key]; 1213 $class['name'] = $this->unquoteName($this->getOpVal($op2, $EX));1264 $class['name'] = unquoteName($this->getOpVal($op2, $EX), $EX); 1214 1265 if ($opc == XC_DECLARE_INHERITED_CLASS || $opc == XC_DECLARE_INHERITED_CLASS_DELAYED) { 1215 1266 $ext /= XC_SIZEOF_TEMP_VARIABLE; … … 1221 1272 } 1222 1273 1223 while ($i + 2 < $ic 1224 && $opcodes[$i + 2]['opcode'] == XC_ADD_INTERFACE 1225 && $opcodes[$i + 2]['op1']['var'] == $res['var'] 1226 && $opcodes[$i + 1]['opcode'] == XC_FETCH_CLASS) { 1274 for (;;) { 1275 if ($i + 1 < $ic 1276 && $opcodes[$i + 1]['opcode'] == XC_ADD_INTERFACE 1277 && $opcodes[$i + 1]['op1']['var'] == $res['var']) { 1278 // continue 1279 } 1280 else if ($i + 2 < $ic 1281 && $opcodes[$i + 2]['opcode'] == XC_ADD_INTERFACE 1282 && $opcodes[$i + 2]['op1']['var'] == $res['var'] 1283 && $opcodes[$i + 1]['opcode'] == XC_FETCH_CLASS) { 1284 // continue 1285 } 1286 else { 1287 break; 1288 } 1289 1227 1290 $fetchop = &$opcodes[$i + 1]; 1228 $impl = $this->unquoteName($this->getOpVal($fetchop['op2'], $EX));1291 $impl = unquoteName($this->getOpVal($fetchop['op2'], $EX), $EX); 1229 1292 $addop = &$opcodes[$i + 2]; 1230 1293 $class['interfaces'][$addop['extended_value']] = $impl; … … 1233 1296 } 1234 1297 $this->dclass($class); 1298 echo "\n"; 1235 1299 unset($class); 1236 1300 break; … … 1247 1311 switch ($opc) { 1248 1312 case XC_ADD_CHAR: 1249 $op2val = foldToCode(chr($op2val), $EX);1313 $op2val = value(chr(str($op2val))); 1250 1314 break; 1251 1315 case XC_ADD_STRING: 1252 $op2val = foldToCode($op2val, $EX);1253 1316 break; 1254 1317 case XC_ADD_VAR: 1255 1318 break; 1256 1319 } 1257 if ( $op1val== "''") {1320 if (str($op1val) == "''") { 1258 1321 $rvalue = $op2val; 1259 1322 } 1260 else if ( $op2val== "''") {1323 else if (str($op2val) == "''") { 1261 1324 $rvalue = $op1val; 1262 1325 } … … 1328 1391 $type = $op2['var']; // hack 1329 1392 $keyword = $this->includeTypes[$type]; 1330 $resvar = "$keyword (" . str($this->getOpVal($op1, $EX)) . ")";1393 $resvar = "$keyword " . str($this->getOpVal($op1, $EX)); 1331 1394 break; 1332 1395 // }}} … … 1366 1429 case XC_JMP_NO_CTOR: 1367 1430 break; 1431 case XC_JMP_SET: // ?: 1368 1432 case XC_JMPNZ: // while 1369 1433 case XC_JMPZNZ: // for … … 1403 1467 break; 1404 1468 // }}} 1469 case XC_GOTO: 1405 1470 case XC_JMP: // {{{ 1406 1471 $op['cond'] = null; … … 1437 1502 $flags = array_flip(explode('_', $opname)); 1438 1503 if (isset($flags['OBJ'])) { 1439 $resvar = $this->getOpVal($op1, $EX); 1440 $prop = $this->unquoteName($this->getOpVal($op2, $EX)); 1441 if ($prop{0} == '$') { 1442 $resvar = $resvar . "{" . $prop . "}"; 1443 } 1444 else { 1445 $resvar = $resvar . "->" . $prop; 1446 } 1504 $resvar = $this->getOpVal($op1, $EX) . '->' . unquoteProperty($this->getOpVal($op2, $EX), $EX); 1447 1505 } 1448 1506 else { … … 1451 1509 $opstr = isset($flags['DEC']) ? '--' : '++'; 1452 1510 if (isset($flags['POST'])) { 1453 $resvar .= ' ' .$opstr;1511 $resvar .= $opstr; 1454 1512 } 1455 1513 else { 1456 $resvar = "$opstr $resvar";1514 $resvar = "$opstr$resvar"; 1457 1515 } 1458 1516 break; … … 1492 1550 case XC_EXT_NOP: 1493 1551 break; 1552 case XC_DECLARE_LAMBDA_FUNCTION: 1553 ob_start(); 1554 $this->dfunction($this->dc['function_table'][$op1['constant']], $EX['indent']); 1555 $resvar = ob_get_clean(); 1556 $istmpres = true; 1557 break; 1494 1558 case XC_DECLARE_FUNCTION_OR_CLASS: 1495 1559 /* always removed by compiler */ … … 1498 1562 $lastphpop['ticks'] = $this->getOpVal($op1, $EX); 1499 1563 // $EX['tickschanged'] = true; 1564 break; 1565 case XC_RAISE_ABSTRACT_ERROR: 1566 // abstract function body is empty, don't need this code 1567 break; 1568 case XC_USER_OPCODE: 1569 echo '// ZEND_USER_OPCODE, impossible to decompile'; 1570 break; 1571 case XC_OP_DATA: 1500 1572 break; 1501 1573 default: // {{{ … … 1559 1631 $d[$kk] = '$' . $op[$k]['var']; 1560 1632 if ($kk != 'res') { 1561 $d[$kk] .= ':' . $this->getOpVal($op[$k], $EX);1633 $d[$kk] .= ':' . str($this->getOpVal($op[$k], $EX)); 1562 1634 } 1563 1635 break; … … 1566 1638 $d[$kk] = '#' . $op[$k]['var']; 1567 1639 if ($kk != 'res') { 1568 $d[$kk] .= ':' . $this->getOpVal($op[$k], $EX);1640 $d[$kk] .= ':' . str($this->getOpVal($op[$k], $EX)); 1569 1641 } 1570 1642 break; … … 1661 1733 { 1662 1734 if ($nobody) { 1663 $body = ";\n";1664 1735 $EX = array(); 1665 1736 $EX['op_array'] = &$func['op_array']; … … 1676 1747 } 1677 1748 1678 echo 'function ', $func['op_array']['function_name'], '('; 1749 $functionName = $func['op_array']['function_name']; 1750 if ($functionName == '{closure}') { 1751 $functionName = ''; 1752 } 1753 echo 'function ', $functionName, '('; 1679 1754 $this->dargs($EX, $indent); 1680 echo ")\n"; 1681 echo $indent, "{\n"; 1682 echo $body; 1683 echo "$indent}\n"; 1755 echo ")"; 1756 if ($nobody) { 1757 echo ";\n"; 1758 } 1759 else { 1760 if ($functionName !== '') { 1761 echo "\n"; 1762 echo $indent, "{\n"; 1763 } 1764 else { 1765 echo " {\n"; 1766 } 1767 1768 echo $body; 1769 echo "$indent}"; 1770 if ($functionName !== '') { 1771 echo "\n"; 1772 } 1773 } 1684 1774 } 1685 1775 // }}} … … 1695 1785 if (!empty($class['ce_flags'])) { 1696 1786 if ($class['ce_flags'] & ZEND_ACC_INTERFACE) { 1697 echo 'interface ';1698 1787 $isinterface = true; 1699 1788 } 1700 1789 else { 1701 if ($class['ce_flags'] & ZEND_ACC_IMPLICIT_ABSTRACT ) {1790 if ($class['ce_flags'] & ZEND_ACC_IMPLICIT_ABSTRACT_CLASS) { 1702 1791 echo "abstract "; 1703 1792 } 1704 if ($class['ce_flags'] & ZEND_ACC_FINAL ) {1793 if ($class['ce_flags'] & ZEND_ACC_FINAL_CLASS) { 1705 1794 echo "final "; 1706 1795 } 1707 1796 } 1708 1797 } 1709 echo 'class ', $class['name'];1798 echo $isinterface ? 'interface ' : 'class ', $class['name']; 1710 1799 if ($class['parent']) { 1711 1800 echo ' extends ', $class['parent']; … … 1822 1911 } 1823 1912 echo $newindent; 1913 $isAbstractMethod = false; 1824 1914 if (isset($opa['fn_flags'])) { 1825 if ( $opa['fn_flags'] & ZEND_ACC_ABSTRACT) {1915 if (($opa['fn_flags'] & ZEND_ACC_ABSTRACT) && !$isinterface) { 1826 1916 echo "abstract "; 1917 $isAbstractMethod = true; 1827 1918 } 1828 1919 if ($opa['fn_flags'] & ZEND_ACC_FINAL) { … … 1848 1939 } 1849 1940 } 1850 $this->dfunction($func, $newindent, $isinterface );1941 $this->dfunction($func, $newindent, $isinterface || $isAbstractMethod); 1851 1942 if ($opa['function_name'] == 'Decompiler') { 1852 1943 //exit; … … 1879 1970 function output() // {{{ 1880 1971 { 1881 echo "<?". "php\n ";1972 echo "<?". "php\n\n"; 1882 1973 foreach ($this->dc['class_table'] as $key => $class) { 1883 1974 if ($key{0} != "\0") { 1975 $this->dclass($class); 1884 1976 echo "\n"; 1885 $this->dclass($class);1886 1977 } 1887 1978 } … … 1889 1980 foreach ($this->dc['function_table'] as $key => $func) { 1890 1981 if ($key{0} != "\0") { 1982 $this->dfunction($func); 1891 1983 echo "\n"; 1892 $this->dfunction($func); 1893 } 1894 } 1895 1896 echo "\n"; 1984 } 1985 } 1986 1897 1987 $this->dop_array($this->dc['op_array']); 1898 1988 echo "\n?" . ">\n"; … … 1903 1993 1904 1994 // {{{ defines 1905 define('ZEND_ACC_STATIC', 0x01);1906 define('ZEND_ACC_ABSTRACT', 0x02);1907 define('ZEND_ACC_FINAL', 0x04);1908 define('ZEND_ACC_IMPLEMENTED_ABSTRACT', 0x08);1909 1910 define('ZEND_ACC_IMPLICIT_ABSTRACT_CLASS', 0x10);1911 define('ZEND_ACC_EXPLICIT_ABSTRACT_CLASS', 0x20);1912 define('ZEND_ACC_FINAL_CLASS', 0x40);1913 define('ZEND_ACC_INTERFACE', 0x80);1914 define('ZEND_ACC_PUBLIC', 0x100);1915 define('ZEND_ACC_PROTECTED', 0x200);1916 define('ZEND_ACC_PRIVATE', 0x400);1917 define('ZEND_ACC_PPP_MASK', (ZEND_ACC_PUBLIC | ZEND_ACC_PROTECTED | ZEND_ACC_PRIVATE));1918 1919 define('ZEND_ACC_CHANGED', 0x800);1920 define('ZEND_ACC_IMPLICIT_PUBLIC', 0x1000);1921 1922 define('ZEND_ACC_CTOR', 0x2000);1923 define('ZEND_ACC_DTOR', 0x4000);1924 define('ZEND_ACC_CLONE', 0x8000);1925 1926 define('ZEND_ACC_ALLOW_STATIC', 0x10000);1927 1928 define('ZEND_ACC_SHADOW', 0x2000);1929 1930 1995 define('ZEND_ENGINE_2_4', PHP_VERSION >= "5.3.99"); 1931 1996 define('ZEND_ENGINE_2_3', ZEND_ENGINE_2_4 || PHP_VERSION >= "5.3."); … … 1933 1998 define('ZEND_ENGINE_2_1', ZEND_ENGINE_2_2 || PHP_VERSION >= "5.1."); 1934 1999 define('ZEND_ENGINE_2', ZEND_ENGINE_2_1 || PHP_VERSION >= "5.0."); 2000 2001 define('ZEND_ACC_STATIC', 0x01); 2002 define('ZEND_ACC_ABSTRACT', 0x02); 2003 define('ZEND_ACC_FINAL', 0x04); 2004 define('ZEND_ACC_IMPLEMENTED_ABSTRACT', 0x08); 2005 2006 define('ZEND_ACC_IMPLICIT_ABSTRACT_CLASS', 0x10); 2007 define('ZEND_ACC_EXPLICIT_ABSTRACT_CLASS', 0x20); 2008 define('ZEND_ACC_FINAL_CLASS', 0x40); 2009 define('ZEND_ACC_INTERFACE', 0x80); 2010 if (ZEND_ENGINE_2_4) { 2011 define('ZEND_ACC_TRAIT', 0x120); 2012 } 2013 define('ZEND_ACC_PUBLIC', 0x100); 2014 define('ZEND_ACC_PROTECTED', 0x200); 2015 define('ZEND_ACC_PRIVATE', 0x400); 2016 define('ZEND_ACC_PPP_MASK', (ZEND_ACC_PUBLIC | ZEND_ACC_PROTECTED | ZEND_ACC_PRIVATE)); 2017 2018 define('ZEND_ACC_CHANGED', 0x800); 2019 define('ZEND_ACC_IMPLICIT_PUBLIC', 0x1000); 2020 2021 define('ZEND_ACC_CTOR', 0x2000); 2022 define('ZEND_ACC_DTOR', 0x4000); 2023 define('ZEND_ACC_CLONE', 0x8000); 2024 2025 define('ZEND_ACC_ALLOW_STATIC', 0x10000); 2026 2027 define('ZEND_ACC_SHADOW', 0x2000); 1935 2028 1936 2029 if (ZEND_ENGINE_2_4) { … … 2031 2124 'XC_ASSIGN_DIM' => -1, 2032 2125 'XC_UNSET_DIM' => -1, 2033 'XC_ FETCH_OBJ_' => -1,2126 'XC_UNSET_OBJ' => -1, 2034 2127 'XC_ASSIGN_OBJ' => -1, 2035 2128 'XC_ISSET_ISEMPTY_DIM_OBJ' => -1, … … 2052 2145 'XC_FETCH_DIM_' => -1, 2053 2146 'XC_UNSET_DIM_OBJ' => -1, 2054 'XC_FETCH_OBJ_' => -1,2055 2147 'XC_ISSET_ISEMPTY' => -1, 2056 2148 'XC_INIT_FCALL_BY_FUNC' => -1, 2057 2149 'XC_DO_FCALL_BY_FUNC' => -1, 2058 2150 'XC_DECLARE_FUNCTION_OR_CLASS' => -1, 2151 'XC_INIT_NS_FCALL_BY_NAME' => -1, 2152 'XC_GOTO' => -1, 2153 'XC_CATCH' => -1, 2154 'XC_THROW' => -1, 2155 'XC_INSTANCEOF' => -1, 2156 'XC_DECLARE_FUNCTION' => -1, 2157 'XC_RAISE_ABSTRACT_ERROR' => -1, 2158 'XC_DECLARE_CONST' => -1, 2159 'XC_USER_OPCODE' => -1, 2160 'XC_JMP_SET' => -1, 2161 'XC_DECLARE_LAMBDA_FUNCTION' => -1, 2059 2162 ) as $k => $v) { 2060 2163 if (!defined($k)) { … … 2063 2166 } 2064 2167 2065 / * XC_UNDEF XC_OP_DATA2168 //* XC_UNDEF XC_OP_DATA 2066 2169 $content = file_get_contents(__FILE__); 2067 2170 for ($i = 0; $opname = xcache_get_opcode($i); $i ++) { -
trunk/decompilesample.php
r748 r749 32 32 { 33 33 echo CONST_VALUE; 34 echo $this::CONST_VALUE;35 echo $a::CONST_VALUE;36 34 echo ClassName::CONST_VALUE; 37 } 38 39 /** doc */ 40 abstract function abastractMethod(); 35 unset(ClassName::$classProp); 36 unset($obj->objProp); 37 unset($this->thisProp); 38 unset($array['index']->valueProp); 39 unset($obj->array['index']); 40 unset($this->array['index']); 41 $obj->objProp = 1; 42 $this->thisProp = 1; 43 $array['index']->valueProp = 1; 44 $array['index'] = 1; 45 $array[1] = 1; 46 } 47 48 /** doc */ 49 abstract public function abastractMethod(); 41 50 42 51 /** doc */ … … 79 88 } 80 89 90 function f1($f) 91 { 92 echo $f; 93 } 94 81 95 final class Child extends ClassName implements IInterface 82 96 { … … 84 98 { 85 99 parent::__construct(); 100 ClassName::__construct(); 86 101 echo __CLASS__; 87 102 echo __METHOD__; 103 throw new Exception(); 104 $this->methodCall(); 105 } 106 107 public function __destruct() 108 { 109 parent::__destruct(); 110 functionCall(); 111 } 112 113 static public function __callStatic($name, $args) 114 { 115 } 116 117 public function __toString() 118 { 88 119 } 89 120 … … 110 141 public function __wakeup() 111 142 { 143 } 144 145 public function __clone() 146 { 147 return array(); 112 148 } 113 149 } … … 115 151 echo str_replace(array('a' => 'a', 'b' => 'c'), 'b'); 116 152 $object = new ClassName(); 153 $object = new $className(); 154 try { 155 echo 'code being try'; 156 } 157 catch (Exception $e) { 158 echo $e; 159 } 117 160 $cloned = clone $object; 118 161 $a = 1; … … 135 178 $a = $b === $c; 136 179 $a = $b != $c; 137 $a = $b <> $c;138 180 $a = $b < $c; 139 181 $a = $b <= $c; 140 $a = $b > $c;141 182 $a = $b <= $c; 142 183 $a = $b++; 143 184 $a = ++$b; 185 $a = $obj->b++; 186 $a = ++$obj->b; 144 187 $a = $b--; 145 188 $a = --$b; 189 $a = $obj->b--; 190 $a = --$obj->b; 146 191 $a = $b and $c; 147 192 $a = $b or $c; … … 150 195 $a = $b && $c; 151 196 $a = $b || $c; 197 $a = $b ? $c : $d; 198 $a = f1() ? f2() : f3(); 152 199 $a = $b instanceof ClassName; 153 200 … … 176 223 177 224 foreach ($array as $key => $value) { 178 echo "$key = $value\n";225 echo $key . ' = ' . $value . "\n"; 179 226 continue; 180 227 } … … 204 251 include_once 'include_once.php'; 205 252 253 //* >= PHP 5.3 254 echo $this::CONST_VALUE; 255 echo $a::CONST_VALUE; 256 $this::__construct(); 257 $obj::__construct(); 258 259 $a = $b ?: $d; 260 $a = f1() ?: f2(); 261 262 echo 'goto a'; 206 263 goto a; 207 echo 'foo'; 264 265 for ($i = 1; $i <= 2; ++$i) { 266 goto a; 267 } 208 268 209 269 a: 210 echo 'bar'; 211 270 echo 'label a'; 212 271 echo preg_replace_callback('~-([a-z])~', function ($match) { 213 return strtoupper($match[1]);272 return strtoupper($match[1]); 214 273 }, 'hello-world'); 215 216 $greet = function($name) 217 { 274 $greet = function ($name) { 218 275 printf("Hello %s\r\n", $name); 219 276 }; 220 277 $greet('World'); 221 278 $greet('PHP'); 222 223 $total = 0.00; 224 225 $callback = function ($quantity, $product) use ($tax, &$total) 226 { 227 $pricePerItem = constant(__CLASS__ . "::PRICE_" . strtoupper($product)); 228 $total += ($pricePerItem * $quantity) * ($tax + 1.0); 279 $total = 0; 280 $callback = function ($quantity, $product) use ($tax, &$total) { 281 $pricePerItem = constant('PRICE_' . strtoupper($product)); 282 $total += $pricePerItem * $quantity * ($tax + 1); 229 283 }; 284 // */ 230 285 231 286 ?> -
trunk/disassembler.c
r714 r749 37 37 add_assoc_zval_ex(dst, ZEND_STRS("op_array"), zv); 38 38 39 buf = emalloc(bufsize); 40 39 41 ALLOC_INIT_ZVAL(list); 40 42 array_init(list); 41 43 b = TG(internal_function_tail) ? TG(internal_function_tail)->pListNext : TG(function_table).pListHead; 42 44 for (; b; b = b->pListNext) { 45 int keysize, keyLength; 46 43 47 ALLOC_INIT_ZVAL(zv); 44 48 array_init(zv); 45 49 xc_dasm_zend_function(zv, b->pData TSRMLS_CC); 46 47 add_u_assoc_zval_ex(list, BUCKET_KEY_TYPE(b), ZSTR(BUCKET_KEY_S(b)), b->nKeyLength, zv);48 }49 add_assoc_zval_ex(dst, ZEND_STRS("function_table"), list);50 51 buf = emalloc(bufsize);52 ALLOC_INIT_ZVAL(list);53 array_init(list);54 b = TG(internal_class_tail) ? TG(internal_class_tail)->pListNext : TG(class_table).pListHead;55 for (; b; b = b->pListNext) {56 int keysize, keyLength;57 58 ALLOC_INIT_ZVAL(zv);59 array_init(zv);60 xc_dasm_zend_class_entry(zv, CestToCePtr(*(xc_cest_t *)b->pData) TSRMLS_CC);61 50 62 51 keysize = BUCKET_KEY_SIZE(b) + 2; … … 82 71 } 83 72 } 73 74 add_u_assoc_zval_ex(list, BUCKET_KEY_TYPE(b), ZSTR(buf), keyLength, zv); 75 } 76 add_assoc_zval_ex(dst, ZEND_STRS("function_table"), list); 77 78 ALLOC_INIT_ZVAL(list); 79 array_init(list); 80 b = TG(internal_class_tail) ? TG(internal_class_tail)->pListNext : TG(class_table).pListHead; 81 for (; b; b = b->pListNext) { 82 int keysize, keyLength; 83 84 ALLOC_INIT_ZVAL(zv); 85 array_init(zv); 86 xc_dasm_zend_class_entry(zv, CestToCePtr(*(xc_cest_t *)b->pData) TSRMLS_CC); 87 88 keysize = BUCKET_KEY_SIZE(b) + 2; 89 if (keysize > bufsize) { 90 do { 91 bufsize *= 2; 92 } while (keysize > bufsize); 93 buf = erealloc(buf, bufsize); 94 } 95 memcpy(buf, BUCKET_KEY_S(b), keysize); 96 buf[keysize - 2] = buf[keysize - 1] = ""[0]; 97 keyLength = b->nKeyLength; 98 #ifdef IS_UNICODE 99 if (BUCKET_KEY_TYPE(b) == IS_UNICODE) { 100 if (buf[0] == ""[0] && buf[1] == ""[0]) { 101 keyLength ++; 102 } 103 } else 104 #endif 105 { 106 if (buf[0] == ""[0]) { 107 keyLength ++; 108 } 109 } 84 110 add_u_assoc_zval_ex(list, BUCKET_KEY_TYPE(b), ZSTR(buf), keyLength, zv); 85 111 } -
trunk/utils.c
r716 r749 244 244 case IS_TMP_VAR: 245 245 break; 246 247 case IS_CONST: 248 if (spec == OPSPEC_UCLASS) { 249 break; 250 } 251 /* fall */ 246 252 247 253 default:
Note: See TracChangeset
for help on using the changeset viewer.

