--- /dev/null
+/*
+ +----------------------------------------------------------------------+
+ | PHP Version 5 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997-2013 The PHP Group |
+ +----------------------------------------------------------------------+
+ | This source file is subject to version 3.01 of the PHP license, |
+ | that is bundled with this package in the file LICENSE, and is |
+ | available through the world-wide-web at the following url: |
+ | http://www.php.net/license/3_01.txt |
+ | If you did not receive a copy of the PHP license and are unable to |
+ | obtain it through the world-wide-web, please send a note to |
+ | license@php.net so we can mail you a copy immediately. |
+ +----------------------------------------------------------------------+
+ | Authors: Felipe Pena <felipe@php.net> |
+ | Authors: Joe Watkins <joe.watkins@live.co.uk> |
+ +----------------------------------------------------------------------+
+*/
+
+#include "phpdbg_opcode.h"
+#include "zend_vm_opcodes.h"
+
+const char *phpdbg_decode_opcode(zend_uchar opcode) /* {{{ */
+{
+#define CASE(s) return #s
+ switch (opcode) {
+ CASE(ZEND_NOP);
+ CASE(ZEND_ADD);
+ CASE(ZEND_SUB);
+ CASE(ZEND_MUL);
+ CASE(ZEND_DIV);
+ CASE(ZEND_MOD);
+ CASE(ZEND_SL);
+ CASE(ZEND_SR);
+ CASE(ZEND_CONCAT);
+ CASE(ZEND_BW_OR);
+ CASE(ZEND_BW_AND);
+ CASE(ZEND_BW_XOR);
+ CASE(ZEND_BW_NOT);
+ CASE(ZEND_BOOL_NOT);
+ CASE(ZEND_BOOL_XOR);
+ CASE(ZEND_IS_IDENTICAL);
+ CASE(ZEND_IS_NOT_IDENTICAL);
+ CASE(ZEND_IS_EQUAL);
+ CASE(ZEND_IS_NOT_EQUAL);
+ CASE(ZEND_IS_SMALLER);
+ CASE(ZEND_IS_SMALLER_OR_EQUAL);
+ CASE(ZEND_CAST);
+ CASE(ZEND_QM_ASSIGN);
+ CASE(ZEND_ASSIGN_ADD);
+ CASE(ZEND_ASSIGN_SUB);
+ CASE(ZEND_ASSIGN_MUL);
+ CASE(ZEND_ASSIGN_DIV);
+ CASE(ZEND_ASSIGN_MOD);
+ CASE(ZEND_ASSIGN_SL);
+ CASE(ZEND_ASSIGN_SR);
+ CASE(ZEND_ASSIGN_CONCAT);
+ CASE(ZEND_ASSIGN_BW_OR);
+ CASE(ZEND_ASSIGN_BW_AND);
+ CASE(ZEND_ASSIGN_BW_XOR);
+ CASE(ZEND_PRE_INC);
+ CASE(ZEND_PRE_DEC);
+ CASE(ZEND_POST_INC);
+ CASE(ZEND_POST_DEC);
+ CASE(ZEND_ASSIGN);
+ CASE(ZEND_ASSIGN_REF);
+ CASE(ZEND_ECHO);
+ CASE(ZEND_PRINT);
+ CASE(ZEND_JMP);
+ CASE(ZEND_JMPZ);
+ CASE(ZEND_JMPNZ);
+ CASE(ZEND_JMPZNZ);
+ CASE(ZEND_JMPZ_EX);
+ CASE(ZEND_JMPNZ_EX);
+ CASE(ZEND_CASE);
+ CASE(ZEND_SWITCH_FREE);
+ CASE(ZEND_BRK);
+ CASE(ZEND_CONT);
+ CASE(ZEND_BOOL);
+ CASE(ZEND_INIT_STRING);
+ CASE(ZEND_ADD_CHAR);
+ CASE(ZEND_ADD_STRING);
+ CASE(ZEND_ADD_VAR);
+ CASE(ZEND_BEGIN_SILENCE);
+ CASE(ZEND_END_SILENCE);
+ CASE(ZEND_INIT_FCALL_BY_NAME);
+ CASE(ZEND_DO_FCALL);
+ CASE(ZEND_DO_FCALL_BY_NAME);
+ CASE(ZEND_RETURN);
+ CASE(ZEND_RECV);
+ CASE(ZEND_RECV_INIT);
+ CASE(ZEND_SEND_VAL);
+ CASE(ZEND_SEND_VAR);
+ CASE(ZEND_SEND_REF);
+ CASE(ZEND_NEW);
+ CASE(ZEND_INIT_NS_FCALL_BY_NAME);
+ CASE(ZEND_FREE);
+ CASE(ZEND_INIT_ARRAY);
+ CASE(ZEND_ADD_ARRAY_ELEMENT);
+ CASE(ZEND_INCLUDE_OR_EVAL);
+ CASE(ZEND_UNSET_VAR);
+ CASE(ZEND_UNSET_DIM);
+ CASE(ZEND_UNSET_OBJ);
+ CASE(ZEND_FE_RESET);
+ CASE(ZEND_FE_FETCH);
+ CASE(ZEND_EXIT);
+ CASE(ZEND_FETCH_R);
+ CASE(ZEND_FETCH_DIM_R);
+ CASE(ZEND_FETCH_OBJ_R);
+ CASE(ZEND_FETCH_W);
+ CASE(ZEND_FETCH_DIM_W);
+ CASE(ZEND_FETCH_OBJ_W);
+ CASE(ZEND_FETCH_RW);
+ CASE(ZEND_FETCH_DIM_RW);
+ CASE(ZEND_FETCH_OBJ_RW);
+ CASE(ZEND_FETCH_IS);
+ CASE(ZEND_FETCH_DIM_IS);
+ CASE(ZEND_FETCH_OBJ_IS);
+ CASE(ZEND_FETCH_FUNC_ARG);
+ CASE(ZEND_FETCH_DIM_FUNC_ARG);
+ CASE(ZEND_FETCH_OBJ_FUNC_ARG);
+ CASE(ZEND_FETCH_UNSET);
+ CASE(ZEND_FETCH_DIM_UNSET);
+ CASE(ZEND_FETCH_OBJ_UNSET);
+ CASE(ZEND_FETCH_DIM_TMP_VAR);
+ CASE(ZEND_FETCH_CONSTANT);
+ CASE(ZEND_GOTO);
+ CASE(ZEND_EXT_STMT);
+ CASE(ZEND_EXT_FCALL_BEGIN);
+ CASE(ZEND_EXT_FCALL_END);
+ CASE(ZEND_EXT_NOP);
+ CASE(ZEND_TICKS);
+ CASE(ZEND_SEND_VAR_NO_REF);
+ CASE(ZEND_CATCH);
+ CASE(ZEND_THROW);
+ CASE(ZEND_FETCH_CLASS);
+ CASE(ZEND_CLONE);
+ CASE(ZEND_RETURN_BY_REF);
+ CASE(ZEND_INIT_METHOD_CALL);
+ CASE(ZEND_INIT_STATIC_METHOD_CALL);
+ CASE(ZEND_ISSET_ISEMPTY_VAR);
+ CASE(ZEND_ISSET_ISEMPTY_DIM_OBJ);
+ CASE(ZEND_PRE_INC_OBJ);
+ CASE(ZEND_PRE_DEC_OBJ);
+ CASE(ZEND_POST_INC_OBJ);
+ CASE(ZEND_POST_DEC_OBJ);
+ CASE(ZEND_ASSIGN_OBJ);
+ CASE(ZEND_INSTANCEOF);
+ CASE(ZEND_DECLARE_CLASS);
+ CASE(ZEND_DECLARE_INHERITED_CLASS);
+ CASE(ZEND_DECLARE_FUNCTION);
+ CASE(ZEND_RAISE_ABSTRACT_ERROR);
+ CASE(ZEND_DECLARE_CONST);
+ CASE(ZEND_ADD_INTERFACE);
+ CASE(ZEND_DECLARE_INHERITED_CLASS_DELAYED);
+ CASE(ZEND_VERIFY_ABSTRACT_CLASS);
+ CASE(ZEND_ASSIGN_DIM);
+ CASE(ZEND_ISSET_ISEMPTY_PROP_OBJ);
+ CASE(ZEND_HANDLE_EXCEPTION);
+ CASE(ZEND_USER_OPCODE);
+#ifdef ZEND_JMP_SET
+ CASE(ZEND_JMP_SET);
+#endif
+ CASE(ZEND_DECLARE_LAMBDA_FUNCTION);
+#ifdef ZEND_ADD_TRAIT
+ CASE(ZEND_ADD_TRAIT);
+#endif
+#ifdef ZEND_BIND_TRAITS
+ CASE(ZEND_BIND_TRAITS);
+#endif
+#ifdef ZEND_SEPARATE
+ CASE(ZEND_SEPARATE);
+#endif
+#ifdef ZEND_QM_ASSIGN_VAR
+ CASE(ZEND_QM_ASSIGN_VAR);
+#endif
+#ifdef ZEND_JMP_SET_VAR
+ CASE(ZEND_JMP_SET_VAR);
+#endif
+ CASE(ZEND_DISCARD_EXCEPTION);
+ CASE(ZEND_YIELD);
+ CASE(ZEND_GENERATOR_RETURN);
+#ifdef ZEND_FAST_CALL
+ CASE(ZEND_FAST_CALL);
+#endif
+#ifdef ZEND_FAST_RET
+ CASE(ZEND_FAST_RET);
+#endif
+#ifdef ZEND_RECV_VARIADIC
+ CASE(ZEND_RECV_VARIADIC);
+#endif
+ CASE(ZEND_OP_DATA);
+ default: return "UNKNOWN";
+ }
+} /* }}} */
#include "phpdbg.h"
#include "phpdbg_help.h"
#include "phpdbg_bp.h"
+#include "phpdbg_opcode.h"
static const phpdbg_command_t phpdbg_prompt_commands[];
return SUCCESS;
} /* }}} */
-static const char *phpdbg_decode_opcode(zend_uchar opcode TSRMLS_DC) { /* {{{ */
- switch (opcode) {
- case ZEND_NOP: return "ZEND_NOP";
- case ZEND_ADD: return "ZEND_ADD";
- case ZEND_SUB: return "ZEND_SUB";
- case ZEND_MUL: return "ZEND_MUL";
- case ZEND_DIV: return "ZEND_DIV";
- case ZEND_MOD: return "ZEND_MOD";
- case ZEND_SL: return "ZEND_SL";
- case ZEND_SR: return "ZEND_SR";
- case ZEND_CONCAT: return "ZEND_CONCAT";
- case ZEND_BW_OR: return "ZEND_BW_OR";
- case ZEND_BW_AND: return "ZEND_BW_AND";
- case ZEND_BW_XOR: return "ZEND_BW_XOR";
- case ZEND_BW_NOT: return "ZEND_BW_NOT";
- case ZEND_BOOL_NOT: return "ZEND_BOOL_NOT";
- case ZEND_BOOL_XOR: return "ZEND_BOOL_XOR";
- case ZEND_IS_IDENTICAL: return "ZEND_IS_IDENTICAL";
- case ZEND_IS_NOT_IDENTICAL: return "ZEND_IS_NOT_IDENTICAL";
- case ZEND_IS_EQUAL: return "ZEND_IS_EQUAL";
- case ZEND_IS_NOT_EQUAL: return "ZEND_IS_NOT_EQUAL";
- case ZEND_IS_SMALLER: return "ZEND_IS_SMALLER";
- case ZEND_IS_SMALLER_OR_EQUAL: return "ZEND_IS_SMALLER_OR_EQUAL";
- case ZEND_CAST: return "ZEND_CAST";
- case ZEND_QM_ASSIGN: return "ZEND_QM_ASSIGN";
- case ZEND_ASSIGN_ADD: return "ZEND_ASSIGN_ADD";
- case ZEND_ASSIGN_SUB: return "ZEND_ASSIGN_SUB";
- case ZEND_ASSIGN_MUL: return "ZEND_ASSIGN_MUL";
- case ZEND_ASSIGN_DIV: return "ZEND_ASSIGN_DIV";
- case ZEND_ASSIGN_MOD: return "ZEND_ASSIGN_MOD";
- case ZEND_ASSIGN_SL: return "ZEND_ASSIGN_SL";
- case ZEND_ASSIGN_SR: return "ZEND_ASSIGN_SR";
- case ZEND_ASSIGN_CONCAT: return "ZEND_ASSIGN_CONCAT";
- case ZEND_ASSIGN_BW_OR: return "ZEND_ASSIGN_BW_OR";
- case ZEND_ASSIGN_BW_AND: return "ZEND_ASSIGN_BW_AND";
- case ZEND_ASSIGN_BW_XOR: return "ZEND_ASSIGN_BW_XOR";
- case ZEND_PRE_INC: return "ZEND_PRE_INC";
- case ZEND_PRE_DEC: return "ZEND_PRE_DEC";
- case ZEND_POST_INC: return "ZEND_POST_INC";
- case ZEND_POST_DEC: return "ZEND_POST_DEC";
- case ZEND_ASSIGN: return "ZEND_ASSIGN";
- case ZEND_ASSIGN_REF: return "ZEND_ASSIGN_REF";
- case ZEND_ECHO: return "ZEND_ECHO";
- case ZEND_PRINT: return "ZEND_PRINT";
- case ZEND_JMP: return "ZEND_JMP";
- case ZEND_JMPZ: return "ZEND_JMPZ";
- case ZEND_JMPNZ: return "ZEND_JMPNZ";
- case ZEND_JMPZNZ: return "ZEND_JMPZNZ";
- case ZEND_JMPZ_EX: return "ZEND_JMPZ_EX";
- case ZEND_JMPNZ_EX: return "ZEND_JMPNZ_EX";
- case ZEND_CASE: return "ZEND_CASE";
- case ZEND_SWITCH_FREE: return "ZEND_SWITCH_FREE";
- case ZEND_BRK: return "ZEND_BRK";
- case ZEND_CONT: return "ZEND_CONT";
- case ZEND_BOOL: return "ZEND_BOOL";
- case ZEND_INIT_STRING: return "ZEND_INIT_STRING";
- case ZEND_ADD_CHAR: return "ZEND_ADD_CHAR";
- case ZEND_ADD_STRING: return "ZEND_ADD_STRING";
- case ZEND_ADD_VAR: return "ZEND_ADD_VAR";
- case ZEND_BEGIN_SILENCE: return "ZEND_BEGIN_SILENCE";
- case ZEND_END_SILENCE: return "ZEND_END_SILENCE";
- case ZEND_INIT_FCALL_BY_NAME: return "ZEND_INIT_FCALL_BY_NAME";
- case ZEND_DO_FCALL: return "ZEND_DO_FCALL";
- case ZEND_DO_FCALL_BY_NAME: return "ZEND_DO_FCALL_BY_NAME";
- case ZEND_RETURN: return "ZEND_RETURN";
- case ZEND_RECV: return "ZEND_RECV";
- case ZEND_RECV_INIT: return "ZEND_RECV_INIT";
- case ZEND_SEND_VAL: return "ZEND_SEND_VAL";
- case ZEND_SEND_VAR: return "ZEND_SEND_VAR";
- case ZEND_SEND_REF: return "ZEND_SEND_REF";
- case ZEND_NEW: return "ZEND_NEW";
- case ZEND_INIT_NS_FCALL_BY_NAME: return "ZEND_INIT_NS_FCALL_BY_NAME";
- case ZEND_FREE: return "ZEND_FREE";
- case ZEND_INIT_ARRAY: return "ZEND_INIT_ARRAY";
- case ZEND_ADD_ARRAY_ELEMENT: return "ZEND_ADD_ARRAY_ELEMENT";
- case ZEND_INCLUDE_OR_EVAL: return "ZEND_INCLUDE_OR_EVAL";
- case ZEND_UNSET_VAR: return "ZEND_UNSET_VAR";
- case ZEND_UNSET_DIM: return "ZEND_UNSET_DIM";
- case ZEND_UNSET_OBJ: return "ZEND_UNSET_OBJ";
- case ZEND_FE_RESET: return "ZEND_FE_RESET";
- case ZEND_FE_FETCH: return "ZEND_FE_FETCH";
- case ZEND_EXIT: return "ZEND_EXIT";
- case ZEND_FETCH_R: return "ZEND_FETCH_R";
- case ZEND_FETCH_DIM_R: return "ZEND_FETCH_DIM_R";
- case ZEND_FETCH_OBJ_R: return "ZEND_FETCH_OBJ_R";
- case ZEND_FETCH_W: return "ZEND_FETCH_W";
- case ZEND_FETCH_DIM_W: return "ZEND_FETCH_DIM_W";
- case ZEND_FETCH_OBJ_W: return "ZEND_FETCH_OBJ_W";
- case ZEND_FETCH_RW: return "ZEND_FETCH_RW";
- case ZEND_FETCH_DIM_RW: return "ZEND_FETCH_DIM_RW";
- case ZEND_FETCH_OBJ_RW: return "ZEND_FETCH_OBJ_RW";
- case ZEND_FETCH_IS: return "ZEND_FETCH_IS";
- case ZEND_FETCH_DIM_IS: return "ZEND_FETCH_DIM_IS";
- case ZEND_FETCH_OBJ_IS: return "ZEND_FETCH_OBJ_IS";
- case ZEND_FETCH_FUNC_ARG: return "ZEND_FETCH_FUNC_ARG";
- case ZEND_FETCH_DIM_FUNC_ARG: return "ZEND_FETCH_DIM_FUNC_ARG";
- case ZEND_FETCH_OBJ_FUNC_ARG: return "ZEND_FETCH_OBJ_FUNC_ARG";
- case ZEND_FETCH_UNSET: return "ZEND_FETCH_UNSET";
- case ZEND_FETCH_DIM_UNSET: return "ZEND_FETCH_DIM_UNSET";
- case ZEND_FETCH_OBJ_UNSET: return "ZEND_FETCH_OBJ_UNSET";
- case ZEND_FETCH_DIM_TMP_VAR: return "ZEND_FETCH_DIM_TMP_VAR";
- case ZEND_FETCH_CONSTANT: return "ZEND_FETCH_CONSTANT";
- case ZEND_GOTO: return "ZEND_GOTO";
- case ZEND_EXT_STMT: return "ZEND_EXT_STMT";
- case ZEND_EXT_FCALL_BEGIN: return "ZEND_EXT_FCALL_BEGIN";
- case ZEND_EXT_FCALL_END: return "ZEND_EXT_FCALL_END";
- case ZEND_EXT_NOP: return "ZEND_EXT_NOP";
- case ZEND_TICKS: return "ZEND_TICKS";
- case ZEND_SEND_VAR_NO_REF: return "ZEND_SEND_VAR_NO_REF";
- case ZEND_CATCH: return "ZEND_CATCH";
- case ZEND_THROW: return "ZEND_THROW";
- case ZEND_FETCH_CLASS: return "ZEND_FETCH_CLASS";
- case ZEND_CLONE: return "ZEND_CLONE";
- case ZEND_RETURN_BY_REF: return "ZEND_RETURN_BY_REF";
- case ZEND_INIT_METHOD_CALL: return "ZEND_INIT_METHOD_CALL";
- case ZEND_INIT_STATIC_METHOD_CALL: return "ZEND_INIT_STATIC_METHOD_CALL";
- case ZEND_ISSET_ISEMPTY_VAR: return "ZEND_ISSET_ISEMPTY_VAR";
- case ZEND_ISSET_ISEMPTY_DIM_OBJ: return "ZEND_ISSET_ISEMPTY_DIM_OBJ";
- case ZEND_PRE_INC_OBJ: return "ZEND_PRE_INC_OBJ";
- case ZEND_PRE_DEC_OBJ: return "ZEND_PRE_DEC_OBJ";
- case ZEND_POST_INC_OBJ: return "ZEND_POST_INC_OBJ";
- case ZEND_POST_DEC_OBJ: return "ZEND_POST_DEC_OBJ";
- case ZEND_ASSIGN_OBJ: return "ZEND_ASSIGN_OBJ";
- case ZEND_INSTANCEOF: return "ZEND_INSTANCEOF";
- case ZEND_DECLARE_CLASS: return "ZEND_DECLARE_CLASS";
- case ZEND_DECLARE_INHERITED_CLASS: return "ZEND_DECLARE_INHERITED_CLASS";
- case ZEND_DECLARE_FUNCTION: return "ZEND_DECLARE_FUNCTION";
- case ZEND_RAISE_ABSTRACT_ERROR: return "ZEND_RAISE_ABSTRACT_ERROR";
- case ZEND_DECLARE_CONST: return "ZEND_DECLARE_CONST";
- case ZEND_ADD_INTERFACE: return "ZEND_ADD_INTERFACE";
- case ZEND_DECLARE_INHERITED_CLASS_DELAYED: return "ZEND_DECLARE_INHERITED_CLASS_DELAYED";
- case ZEND_VERIFY_ABSTRACT_CLASS: return "ZEND_VERIFY_ABSTRACT_CLASS";
- case ZEND_ASSIGN_DIM: return "ZEND_ASSIGN_DIM";
- case ZEND_ISSET_ISEMPTY_PROP_OBJ: return "ZEND_ISSET_ISEMPTY_PROP_OBJ";
- case ZEND_HANDLE_EXCEPTION: return "ZEND_HANDLE_EXCEPTION";
- case ZEND_USER_OPCODE: return "ZEND_USER_OPCODE";
-#ifdef ZEND_JMP_SET
- case ZEND_JMP_SET: return "ZEND_JMP_SET";
-#endif
- case ZEND_DECLARE_LAMBDA_FUNCTION: return "ZEND_DECLARE_LAMBDA_FUNCTION";
-#ifdef ZEND_ADD_TRAIT
- case ZEND_ADD_TRAIT: return "ZEND_ADD_TRAIT";
-#endif
-#ifdef ZEND_BIND_TRAITS
- case ZEND_BIND_TRAITS: return "ZEND_BIND_TRAITS";
-#endif
-#ifdef ZEND_SEPARATE
- case ZEND_SEPARATE: return "ZEND_SEPARATE";
-#endif
-#ifdef ZEND_QM_ASSIGN_VAR
- case ZEND_QM_ASSIGN_VAR: return "ZEND_QM_ASSIGN_VAR";
-#endif
-#ifdef ZEND_JMP_SET_VAR
- case ZEND_JMP_SET_VAR: return "ZEND_JMP_SET_VAR";
-#endif
- case ZEND_DISCARD_EXCEPTION: return "ZEND_DISCARD_EXCEPTION";
- case ZEND_YIELD: return "ZEND_YIELD";
- case ZEND_GENERATOR_RETURN: return "ZEND_GENERATOR_RETURN";
-#ifdef ZEND_FAST_CALL
- case ZEND_FAST_CALL: return "ZEND_FAST_CALL";
-#endif
-#ifdef ZEND_FAST_RET
- case ZEND_FAST_RET: return "ZEND_FAST_RET";
-#endif
-#ifdef ZEND_RECV_VARIADIC
- case ZEND_RECV_VARIADIC: return "ZEND_RECV_VARIADIC";
-#endif
- case ZEND_OP_DATA: return "ZEND_OP_DATA";
-
- default: return "UNKNOWN";
- }
-} /* }}} */
-
static void phpdbg_print_opline(zend_execute_data *execute_data TSRMLS_DC) { /* {{{ */
zend_op *opline = execute_data->opline;
- printf(
- "[OPLINE: %p:%s]\n", opline, phpdbg_decode_opcode(opline->opcode TSRMLS_CC));
+ printf("[OPLINE: %p:%s]\n", opline, phpdbg_decode_opcode(opline->opcode));
} /* }}} */
void phpdbg_execute_ex(zend_execute_data *execute_data TSRMLS_DC) /* {{{ */