Changeset 716 for trunk/Decompiler.class.php
- Timestamp:
- 2011-04-09T09:07:48+02:00 (2 years ago)
- File:
-
- 1 edited
-
trunk/Decompiler.class.php (modified) (35 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Decompiler.class.php
r714 r716 28 28 29 29 if (is_array($src)) { 30 die_error('array str');30 exit('array str'); 31 31 $src = new Decompiler_Array($src, $indent); 32 32 return $src->__toString(); … … 36 36 if (!method_exists($src, '__toString')) { 37 37 var_dump($src); 38 die_error('no __toString');38 exit('no __toString'); 39 39 } 40 40 return $src->__toString(); … … 426 426 switch ($op['op_type']) { 427 427 case XC_IS_CONST: 428 return str(value($op[' u.constant']));428 return str(value($op['constant'])); 429 429 430 430 case XC_IS_VAR: 431 431 case XC_IS_TMP_VAR: 432 432 $T = &$EX['Ts']; 433 $ret = $T[$op[' u.var']];433 $ret = $T[$op['var']]; 434 434 if ($tostr) { 435 435 $ret = str($ret, $EX); 436 436 } 437 437 if ($free) { 438 unset($T[$op[' u.var']]);438 unset($T[$op['var']]); 439 439 } 440 440 return $ret; 441 441 442 442 case XC_IS_CV: 443 $var = $op[' u.var'];443 $var = $op['var']; 444 444 $var = $EX['op_array']['vars'][$var]; 445 445 return '$' . $var['name']; … … 448 448 return null; 449 449 } 450 } 451 // }}} 452 function removeKeyPrefix($array, $prefix) // {{{ 453 { 454 $prefixLen = strlen($prefix); 455 $ret = array(); 456 foreach ($array as $key => $value) { 457 if (substr($key, 0, $prefixLen) == $prefix) { 458 $key = substr($key, $prefixLen); 459 } 460 $ret[$key] = $value; 461 } 462 return $ret; 450 463 } 451 464 // }}} … … 458 471 } 459 472 $EX['indent'] = ''; 460 //for ($i = 0, $cnt = count($opcodes); $i < $cnt; $i ++) { 461 // $opcodes[$i]['opcode'] = xcache_get_fixed_opcode($opcodes[$i]['opcode'], $i); 462 //} 473 for ($i = 0, $cnt = count($opcodes); $i < $cnt; $i ++) { 474 if (function_exists('xcache_get_fixed_opcode')) { 475 $opcodes[$i]['opcode'] = xcache_get_fixed_opcode($opcodes[$i]['opcode'], $i); 476 } 477 if (isset($opcodes[$i]['op1'])) { 478 $opcodes[$i]['op1'] = $this->removeKeyPrefix($opcodes[$i]['op1'], 'u.'); 479 $opcodes[$i]['op2'] = $this->removeKeyPrefix($opcodes[$i]['op2'], 'u.'); 480 $opcodes[$i]['result'] = $this->removeKeyPrefix($opcodes[$i]['result'], 'u.'); 481 } 482 else { 483 $op = array( 484 'op1' => array(), 485 'op2' => array(), 486 'op3' => array(), 487 ); 488 foreach ($opcodes[$i] as $name => $value) { 489 if (preg_match('!^(op1|op2|result)\\.(.*)!', $name, $m)) { 490 list(, $which, $field) = $m; 491 $op[$which][$field] = $value; 492 } 493 else if (preg_match('!^(op1|op2|result)_type$!', $name, $m)) { 494 list(, $which) = $m; 495 $op[$which]['op_type'] = $value; 496 } 497 else { 498 $op[$name] = $value; 499 } 500 } 501 $opcodes[$i] = $op; 502 } 503 } 463 504 // {{{ build jmp array 464 505 for ($i = 0, $cnt = count($opcodes); $i < $cnt; $i ++) { … … 474 515 switch ($op['opcode']) { 475 516 case XC_JMP: 476 $target = $op['op1'][' u.var'];517 $target = $op['op1']['var']; 477 518 $op['jmpouts'] = array($target); 478 519 $opcodes[$target]['jmpins'][] = $i; … … 480 521 481 522 case XC_JMPZNZ: 482 $jmpz = $op['op2'][' u.opline_num'];523 $jmpz = $op['op2']['opline_num']; 483 524 $jmpnz = $op['extended_value']; 484 525 $op['jmpouts'] = array($jmpz, $jmpnz); … … 494 535 case XC_FE_FETCH: 495 536 // case XC_JMP_NO_CTOR: 496 $target = $op['op2'][' u.opline_num'];537 $target = $op['op2']['opline_num']; 497 538 //if (!isset($target)) { 498 539 // $this->dumpop($op, $EX); … … 581 622 if ($op['opcode'] == XC_FE_FETCH) { 582 623 $opline = $next; 583 $next = $op['op2'][' u.opline_num'];624 $next = $op['op2']['opline_num']; 584 625 $end = $next - 1; 585 626 … … 600 641 /* 601 642 if ($op['opcode'] == XC_JMPZ) { 602 $target = $op2[' u.opline_num'];643 $target = $op2['opline_num']; 603 644 if ($line + 1) { 604 645 $nextblock = $EX['nextbbs'][$next]; 605 646 $jmpop = end($nextblock); 606 647 if ($jmpop['opcode'] == XC_JMP) { 607 $ifendline = $op2[' u.opline_num'];648 $ifendline = $op2['opline_num']; 608 649 if ($ifendline >= $line) { 609 650 $cond = $op['cond']; … … 650 691 } 651 692 652 $var = $fromop['result'][' u.var'];693 $var = $fromop['result']['var']; 653 694 var_dump($EX['Ts'][$var]); 654 695 $EX['Ts'][$var] = '(' . $fromop['and_or'] . " $opstr " . $EX['Ts'][$var] . ')'; … … 712 753 713 754 $resvar = null; 714 if ( ($res['u.EA.type'] & EXT_TYPE_UNUSED) || $res['op_type'] == XC_IS_UNUSED) {755 if (isset($res['EA.type']) && ($res['EA.type'] & EXT_TYPE_UNUSED) || $res['op_type'] == XC_IS_UNUSED) { 715 756 $istmpres = false; 716 757 } … … 743 784 case XC_NEW: // {{{ 744 785 array_push($EX['arg_types_stack'], array($EX['object'], $EX['fbc'])); 745 $EX['object'] = (int) $res[' u.var'];786 $EX['object'] = (int) $res['var']; 746 787 $EX['fbc'] = 'new ' . $this->unquoteName($this->getOpVal($op1, $EX)); 747 788 if (PHP_VERSION < 5) { … … 761 802 } 762 803 else { 763 $class = $op2[' u.constant'];804 $class = $op2['constant']; 764 805 if (is_object($class)) { 765 806 $class = get_class($class); … … 771 812 case XC_FETCH_CONSTANT: // {{{ 772 813 if ($op1['op_type'] == XC_IS_CONST) { 773 $resvar = $op1[' u.constant'];814 $resvar = $op1['constant']; 774 815 } 775 816 else if ($op1['op_type'] == XC_IS_UNUSED) { 776 $resvar = $op2[' u.constant'];817 $resvar = $op2['constant']; 777 818 } 778 819 else { 779 $class = $T[$op1[' u.var']];820 $class = $T[$op1['var']]; 780 821 assert($class[0] == 'class'); 781 $resvar = $class[1] . '::' . $op2[' u.constant'];822 $resvar = $class[1] . '::' . $op2['constant']; 782 823 } 783 824 break; … … 792 833 case XC_UNSET_VAR: 793 834 $rvalue = $this->getOpVal($op1, $EX); 794 $fetchtype = $op2[PHP_VERSION < 5 ? ' u.fetch_type' : 'u.EA.type'];835 $fetchtype = $op2[PHP_VERSION < 5 ? 'fetch_type' : 'EA.type']; 795 836 switch ($fetchtype) { 796 837 case ZEND_FETCH_STATIC_MEMBER: … … 838 879 839 880 $src = new Decompiler_ListBox($list); 840 if (!isset($op1[' u.var'])) {881 if (!isset($op1['var'])) { 841 882 $this->dumpop($op, $EX); 842 883 var_dump($op); 843 die('missing u.var');884 die('missing var'); 844 885 } 845 $T[$op1[' u.var']] = $src;886 $T[$op1['var']] = $src; 846 887 unset($list); 847 888 } … … 883 924 $type = $rvalue->iskey ? 'fe_key' : 'fe_as'; 884 925 $rvalue->obj[$type] = $lvalue; 885 unset($T[$op2[' u.var']]);926 unset($T[$op2['var']]); 886 927 break; 887 928 } … … 969 1010 $rvalue = "${" . $rvalue . "}"; 970 1011 } 971 if ($op2[' u.EA.type'] == ZEND_FETCH_STATIC_MEMBER) {1012 if ($op2['EA.type'] == ZEND_FETCH_STATIC_MEMBER) { 972 1013 $class = $this->getOpVal($op2, $EX); 973 1014 $rvalue = $class . '::' . $rvalue; … … 983 1024 } 984 1025 985 switch ( PHP_VERSION < 5 ? $op['op2']['u.var'] /* u.constant */ : $ext) {1026 switch ((PHP_VERSION < 5 ? $op['op2']['var'] /* constant */ : $ext) & (ZEND_ISSET|ZEND_ISEMPTY)) { 986 1027 case ZEND_ISSET: 987 1028 $rvalue = "isset($rvalue)"; … … 990 1031 $rvalue = "empty($rvalue)"; 991 1032 break; 992 default:993 $this->dumpop($op, $EX);994 die_error('1');995 1033 } 996 1034 $resvar = $rvalue; … … 1027 1065 1028 1066 if ($opc == XC_INIT_FCALL_BY_FUNC) { 1029 $which = $op1[' u.var'];1067 $which = $op1['var']; 1030 1068 $EX['fbc'] = $EX['op_array']['funcs'][$which]['name']; 1031 1069 } … … 1036 1074 // }}} 1037 1075 case XC_DO_FCALL_BY_FUNC: 1038 $which = $op1[' u.var'];1076 $which = $op1['var']; 1039 1077 $fname = $EX['op_array']['funcs'][$which]['name']; 1040 1078 $args = $this->popargs($EX, $ext); … … 1069 1107 // }}} 1070 1108 case XC_VERIFY_ABSTRACT_CLASS: // {{{ 1071 //unset($T[$op1[' u.var']]);1109 //unset($T[$op1['var']]); 1072 1110 break; 1073 1111 // }}} … … 1075 1113 case XC_DECLARE_INHERITED_CLASS: 1076 1114 case XC_DECLARE_INHERITED_CLASS_DELAYED: // {{{ 1077 $key = $op1[' u.constant'];1115 $key = $op1['constant']; 1078 1116 if (!isset($this->dc['class_table'][$key])) { 1079 1117 echo 'class not found: ', $key, 'existing classes are:', "\n"; … … 1094 1132 while ($i + 2 < $ic 1095 1133 && $opcodes[$i + 2]['opcode'] == XC_ADD_INTERFACE 1096 && $opcodes[$i + 2]['op1'][' u.var'] == $res['u.var']1134 && $opcodes[$i + 2]['op1']['var'] == $res['var'] 1097 1135 && $opcodes[$i + 1]['opcode'] == XC_FETCH_CLASS) { 1098 1136 $fetchop = &$opcodes[$i + 1]; … … 1160 1198 $offset = $this->getOpVal($op2, $EX); 1161 1199 if (isset($offset)) { 1162 $T[$res[' u.var']]->value[$offset] = $rvalue;1200 $T[$res['var']]->value[$offset] = $rvalue; 1163 1201 } 1164 1202 else { 1165 $T[$res[' u.var']]->value[] = $rvalue;1203 $T[$res['var']]->value[] = $rvalue; 1166 1204 } 1167 1205 } … … 1197 1235 // }}} 1198 1236 case XC_INCLUDE_OR_EVAL: // {{{ 1199 $type = $op2[' u.var']; // hack1237 $type = $op2['var']; // hack 1200 1238 $keyword = $this->includeTypes[$type]; 1201 1239 $resvar = "$keyword(" . $this->getOpVal($op1, $EX) . ")"; … … 1210 1248 $fe = new Decompiler_ForeachBox($op); 1211 1249 $fe->iskey = false; 1212 $T[$res[' u.var']] = $fe;1250 $T[$res['var']] = $fe; 1213 1251 1214 1252 ++ $i; … … 1218 1256 1219 1257 $res = $opcodes[$i]['result']; 1220 $T[$res[' u.var']] = $fe;1258 $T[$res['var']] = $fe; 1221 1259 } 1222 1260 break; 1223 1261 // }}} 1224 1262 case XC_SWITCH_FREE: // {{{ 1225 // unset($T[$op1[' u.var']]);1263 // unset($T[$op1['var']]); 1226 1264 break; 1227 1265 // }}} 1228 1266 case XC_FREE: // {{{ 1229 $free = $T[$op1[' u.var']];1267 $free = $T[$op1['var']]; 1230 1268 if (!is_a($free, 'Decompiler_Array') && !is_a($free, 'Decompiler_Box')) { 1231 1269 $op['php'] = is_object($free) ? $free : $this->unquote($free, '(', ')'); 1232 1270 $lastphpop = &$op; 1233 1271 } 1234 unset($T[$op1[' u.var']], $free);1272 unset($T[$op1['var']], $free); 1235 1273 break; 1236 1274 // }}} … … 1258 1296 } 1259 1297 if ($opc == XC_JMPZ_EX || $opc == XC_JMPNZ_EX || $opc == XC_JMPZ) { 1260 $targetop = &$EX['opcodes'][$op2[' u.opline_num']];1298 $targetop = &$EX['opcodes'][$op2['opline_num']]; 1261 1299 if ($opc == XC_JMPNZ_EX) { 1262 1300 $targetop['cond_true'][] = str($rvalue); … … 1286 1324 $lvalue = $this->getOpVal($op['result'], $EX); 1287 1325 if ($opc == XC_RECV_INIT) { 1288 $default = value($op['op2'][' u.constant']);1326 $default = value($op['op2']['constant']); 1289 1327 } 1290 1328 else { … … 1372 1410 if (isset($resvar)) { 1373 1411 if ($istmpres) { 1374 $T[$res[' u.var']] = $resvar;1375 $lastresvar = &$T[$res[' u.var']];1412 $T[$res['var']] = $resvar; 1413 $lastresvar = &$T[$res['var']]; 1376 1414 } 1377 1415 else { … … 1419 1457 switch ($op[$k]['op_type']) { 1420 1458 case XC_IS_UNUSED: 1421 $d[$kk] = '*UNUSED* ' . $op[$k][' u.opline_num'];1459 $d[$kk] = '*UNUSED* ' . $op[$k]['opline_num']; 1422 1460 break; 1423 1461 1424 1462 case XC_IS_VAR: 1425 $d[$kk] = '$' . $op[$k][' u.var'];1463 $d[$kk] = '$' . $op[$k]['var']; 1426 1464 if ($kk != 'res') { 1427 1465 $d[$kk] .= ':' . $this->getOpVal($op[$k], $EX); … … 1430 1468 1431 1469 case XC_IS_TMP_VAR: 1432 $d[$kk] = '#' . $op[$k][' u.var'];1470 $d[$kk] = '#' . $op[$k]['var']; 1433 1471 if ($kk != 'res') { 1434 1472 $d[$kk] .= ':' . $this->getOpVal($op[$k], $EX);
Note: See TracChangeset
for help on using the changeset viewer.

