diff options
Diffstat (limited to 'sapi/phpdbg')
| -rw-r--r-- | sapi/phpdbg/phpdbg_help.c | 2 | ||||
| -rw-r--r-- | sapi/phpdbg/phpdbg_opcode.c | 110 | ||||
| -rw-r--r-- | sapi/phpdbg/phpdbg_prompt.c | 5 | ||||
| -rw-r--r-- | sapi/phpdbg/tests/breakpoints_001.phpt | 22 | ||||
| -rw-r--r-- | sapi/phpdbg/tests/breakpoints_002.phpt | 28 | ||||
| -rw-r--r-- | sapi/phpdbg/tests/breakpoints_003.phpt | 14 | ||||
| -rw-r--r-- | sapi/phpdbg/tests/breakpoints_004.phpt | 28 | ||||
| -rw-r--r-- | sapi/phpdbg/tests/exceptions_003.phpt | 2 | ||||
| -rw-r--r-- | sapi/phpdbg/tests/print_001.phpt | 2 | ||||
| -rw-r--r-- | sapi/phpdbg/tests/stepping_001.phpt | 4 |
10 files changed, 100 insertions, 117 deletions
diff --git a/sapi/phpdbg/phpdbg_help.c b/sapi/phpdbg/phpdbg_help.c index 97b93f4345..fb73419910 100644 --- a/sapi/phpdbg/phpdbg_help.c +++ b/sapi/phpdbg/phpdbg_help.c @@ -810,7 +810,7 @@ phpdbg_help_text_t phpdbg_help_text[] = { {"run", "Enter the vm, startinging execution. Execution will then continue until the next breakpoint " -"or completion of the script. Add parameters you want to use as $argv" +"or completion of the script. Add parameters you want to use as $argv" CR CR "**Examples**" CR CR " $P run" CR " $P r" CR diff --git a/sapi/phpdbg/phpdbg_opcode.c b/sapi/phpdbg/phpdbg_opcode.c index e64ab0d636..8bd7c4e50e 100644 --- a/sapi/phpdbg/phpdbg_opcode.c +++ b/sapi/phpdbg/phpdbg_opcode.c @@ -36,7 +36,8 @@ static inline const char *phpdbg_decode_opcode(zend_uchar opcode) /* {{{ */ return "UNKNOWN"; } /* }}} */ -static inline char *phpdbg_decode_op(zend_op_array *ops, znode_op *op, uint32_t type) /* {{{ */ +static inline char *phpdbg_decode_op( + zend_op_array *ops, const znode_op *op, uint32_t type) /* {{{ */ { char *decode = NULL; @@ -62,91 +63,72 @@ static inline char *phpdbg_decode_op(zend_op_array *ops, znode_op *op, uint32_t return decode; } /* }}} */ -char *phpdbg_decode_opline(zend_op_array *ops, zend_op *op) /*{{{ */ +char *phpdbg_decode_input_op( + zend_op_array *ops, const zend_op *opline, znode_op op, zend_uchar op_type, + uint32_t flags) { + char *result = NULL; + if (op_type != IS_UNUSED) { + result = phpdbg_decode_op(ops, &op, op_type); + } else if (ZEND_VM_OP_JMP_ADDR == (flags & ZEND_VM_OP_MASK)) { + spprintf(&result, 0, "J%td", OP_JMP_ADDR(opline, op) - ops->opcodes); + } else if (ZEND_VM_OP_NUM == (flags & ZEND_VM_OP_MASK)) { + spprintf(&result, 0, "%" PRIu32, op.num); + } else if (ZEND_VM_OP_TRY_CATCH == (flags & ZEND_VM_OP_MASK)) { + if (opline->opcode != ZEND_FAST_RET || opline->extended_value) { + spprintf(&result, 0, "try-catch(%" PRIu32 ")", op.num); + } + } else if (ZEND_VM_OP_LIVE_RANGE == (flags & ZEND_VM_OP_MASK)) { + if (opline->extended_value & ZEND_FREE_ON_RETURN) { + spprintf(&result, 0, "live-range(%" PRIu32 ")", op.num); + } + } else if (ZEND_VM_OP_THIS == (flags & ZEND_VM_OP_MASK)) { + result = estrdup("THIS"); + } else if (ZEND_VM_OP_NEXT == (flags & ZEND_VM_OP_MASK)) { + result = estrdup("NEXT"); + } else if (ZEND_VM_OP_CLASS_FETCH == (flags & ZEND_VM_OP_MASK)) { + //zend_dump_class_fetch_type(op.num); + } else if (ZEND_VM_OP_CONSTRUCTOR == (flags & ZEND_VM_OP_MASK)) { + result = estrdup("CONSTRUCTOR"); + } + return result; +} + +char *phpdbg_decode_opline(zend_op_array *ops, zend_op *opline) /*{{{ */ { - const char *opcode_name = phpdbg_decode_opcode(op->opcode); + const char *opcode_name = phpdbg_decode_opcode(opline->opcode); + uint32_t flags = zend_get_opcode_flags(opline->opcode); char *result, *decode[4] = {NULL, NULL, NULL, NULL}; /* EX */ - switch (op->opcode) { + switch (opline->opcode) { case ZEND_FAST_CALL: - if (op->extended_value == ZEND_FAST_CALL_FROM_FINALLY) { + if (opline->extended_value == ZEND_FAST_CALL_FROM_FINALLY) { decode[0] = estrdup("FAST_CALL<FROM_FINALLY>"); } break; case ZEND_FAST_RET: - if (op->extended_value != 0) { + if (opline->extended_value != 0) { spprintf(&decode[0], 0, "FAST_RET<%s>", - op->extended_value == ZEND_FAST_RET_TO_CATCH ? "TO_CATCH" : "TO_FINALLY"); + opline->extended_value == ZEND_FAST_RET_TO_CATCH ? "TO_CATCH" : "TO_FINALLY"); } break; } /* OP1 */ - switch (op->opcode) { - case ZEND_JMP: - case ZEND_FAST_CALL: - spprintf(&decode[1], 0, "J%td", OP_JMP_ADDR(op, op->op1) - ops->opcodes); - break; - - case ZEND_INIT_FCALL: - case ZEND_RECV: - case ZEND_RECV_INIT: - case ZEND_RECV_VARIADIC: - spprintf(&decode[1], 0, "%" PRIu32, op->op1.num); - break; - - default: - decode[1] = phpdbg_decode_op(ops, &op->op1, op->op1_type); - break; - } + decode[1] = phpdbg_decode_input_op( + ops, opline, opline->op1, opline->op1_type, ZEND_VM_OP1_FLAGS(flags)); /* OP2 */ - switch (op->opcode) { - case ZEND_JMPZNZ: - spprintf(&decode[2], 0, "J%td or J%td", - OP_JMP_ADDR(op, op->op2) - ops->opcodes, - ZEND_OFFSET_TO_OPLINE(op, op->extended_value) - ops->opcodes); - break; - - case ZEND_JMPZ: - case ZEND_JMPNZ: - case ZEND_JMPZ_EX: - case ZEND_JMPNZ_EX: - case ZEND_JMP_SET: - case ZEND_ASSERT_CHECK: - spprintf(&decode[2], 0, "J%td", OP_JMP_ADDR(op, op->op2) - ops->opcodes); - break; - - case ZEND_FAST_CALL: - case ZEND_FAST_RET: - if (op->extended_value != 0) { - spprintf(&decode[2], 0, "J%" PRIu32, op->op2.opline_num); - } - break; - - case ZEND_SEND_VAL: - case ZEND_SEND_VAL_EX: - case ZEND_SEND_VAR: - case ZEND_SEND_VAR_NO_REF: - case ZEND_SEND_REF: - case ZEND_SEND_VAR_EX: - case ZEND_SEND_USER: - spprintf(&decode[2], 0, "%" PRIu32, op->op2.num); - break; - - default: - decode[2] = phpdbg_decode_op(ops, &op->op2, op->op2_type); - break; - } + decode[2] = phpdbg_decode_input_op( + ops, opline, opline->op2, opline->op2_type, ZEND_VM_OP2_FLAGS(flags)); /* RESULT */ - switch (op->opcode) { + switch (opline->opcode) { case ZEND_CATCH: - spprintf(&decode[3], 0, "%" PRIu32, op->result.num); + spprintf(&decode[3], 0, "%" PRIu32, opline->result.num); break; default: - decode[3] = phpdbg_decode_op(ops, &op->result, op->result_type); + decode[3] = phpdbg_decode_op(ops, &opline->result, opline->result_type); break; } diff --git a/sapi/phpdbg/phpdbg_prompt.c b/sapi/phpdbg/phpdbg_prompt.c index a01c8a399f..ac86c15629 100644 --- a/sapi/phpdbg/phpdbg_prompt.c +++ b/sapi/phpdbg/phpdbg_prompt.c @@ -122,7 +122,6 @@ static inline int phpdbg_call_register(phpdbg_param_t *stack) /* {{{ */ fci.size = sizeof(zend_fcall_info); fci.function_table = &PHPDBG_G(registered); //???fci.symbol_table = zend_rebuild_symbol_table(); - fci.symbol_table = NULL; fci.object = NULL; fci.retval = &fretval; fci.no_separation = 1; @@ -654,7 +653,7 @@ static inline void phpdbg_handle_exception(void) /* {{{ */ phpdbg_error("exception", "name=\"%s\" file=\"%s\" line=\"" ZEND_LONG_FMT "\"", "Uncaught %s in %s on line " ZEND_LONG_FMT, ZSTR_VAL(ex->ce->name), ZSTR_VAL(file), line); zend_string_release(file); - phpdbg_writeln("exceptionmsg", "msg=\"%s\"", ZSTR_VAL(msg)); + phpdbg_writeln("exceptionmsg", "msg=\"%s\"", "%s", ZSTR_VAL(msg)); zend_string_release(msg); if (EG(prev_exception)) { @@ -1634,7 +1633,7 @@ next: execute_data->call->func->type == ZEND_USER_FUNCTION) { zend_execute_ex = execute_ex; } - PHPDBG_G(vmret) = zend_vm_call_opcode_handler(execute_data); + PHPDBG_G(vmret) = zend_vm_call_opcode_handler(execute_data); zend_execute_ex = phpdbg_execute_ex; if (PHPDBG_G(vmret) != 0) { diff --git a/sapi/phpdbg/tests/breakpoints_001.phpt b/sapi/phpdbg/tests/breakpoints_001.phpt index 934f0d3554..17e7c65cbf 100644 --- a/sapi/phpdbg/tests/breakpoints_001.phpt +++ b/sapi/phpdbg/tests/breakpoints_001.phpt @@ -11,23 +11,23 @@ q [Successful compilation of %s] prompt> [Breakpoint #0 added at %s:3] prompt> [Breakpoint #0 at %s:3, hits: 1] ->00003: echo 1; - 00004: echo 2; - 00005: echo 3; +>00003: echo $i++; + 00004: echo $i++; + 00005: echo $i++; prompt> [Breakpoint #1 added at %s:4] prompt> 1 [Breakpoint #1 at %s:4, hits: 1] ->00004: echo 2; - 00005: echo 3; - 00006: echo 4; +>00004: echo $i++; + 00005: echo $i++; + 00006: echo $i++; prompt> 234 [Script ended normally] prompt> --FILE-- <?php - -echo 1; -echo 2; -echo 3; -echo 4; +$i = 1; +echo $i++; +echo $i++; +echo $i++; +echo $i++; diff --git a/sapi/phpdbg/tests/breakpoints_002.phpt b/sapi/phpdbg/tests/breakpoints_002.phpt index 18aaef1f36..96c98194b1 100644 --- a/sapi/phpdbg/tests/breakpoints_002.phpt +++ b/sapi/phpdbg/tests/breakpoints_002.phpt @@ -14,27 +14,27 @@ q prompt> [Breakpoint #0 added at %s:4] prompt> 1 [Breakpoint #0 at %s:4, hits: 1] ->00004: echo 2; - 00005: echo 3; - 00006: echo 4; +>00004: echo $i++; + 00005: echo $i++; + 00006: echo $i++; prompt> [Breakpoint #1 added at %s:3] prompt> Do you really want to restart execution? (type y or n): [Breakpoint #1 at %s:3, hits: 1] ->00003: echo 1; - 00004: echo 2; - 00005: echo 3; +>00003: echo $i++; + 00004: echo $i++; + 00005: echo $i++; prompt> 1 [Breakpoint #0 at %s:4, hits: 1] ->00004: echo 2; - 00005: echo 3; - 00006: echo 4; +>00004: echo $i++; + 00005: echo $i++; + 00006: echo $i++; prompt> 234 [Script ended normally] prompt> --FILE-- <?php - -echo 1; -echo 2; -echo 3; -echo 4; +$i = 1; +echo $i++; +echo $i++; +echo $i++; +echo $i++; diff --git a/sapi/phpdbg/tests/breakpoints_003.phpt b/sapi/phpdbg/tests/breakpoints_003.phpt index 8caa64632b..12b2504487 100644 --- a/sapi/phpdbg/tests/breakpoints_003.phpt +++ b/sapi/phpdbg/tests/breakpoints_003.phpt @@ -16,8 +16,8 @@ prompt> [Deleted breakpoint #0] prompt> [Breakpoint #1 added at %s:5] prompt> 12 [Breakpoint #1 at %s:5, hits: 1] ->00005: echo 3; - 00006: echo 4; +>00005: echo $i++; + 00006: echo $i++; 00007: prompt> [Deleted breakpoint #1] prompt> Do you really want to restart execution? (type y or n): 1234 @@ -25,9 +25,9 @@ prompt> Do you really want to restart execution? (type y or n): 1234 prompt> --FILE-- <?php - -echo 1; -echo 2; -echo 3; -echo 4; +$i = 1; +echo $i++; +echo $i++; +echo $i++; +echo $i++; diff --git a/sapi/phpdbg/tests/breakpoints_004.phpt b/sapi/phpdbg/tests/breakpoints_004.phpt index 27ebd0bea2..917e908efb 100644 --- a/sapi/phpdbg/tests/breakpoints_004.phpt +++ b/sapi/phpdbg/tests/breakpoints_004.phpt @@ -12,30 +12,30 @@ q [Successful compilation of %s] prompt> [Breakpoint #0 added at ZEND_ECHO] prompt> [Breakpoint #0 in ZEND_ECHO at %s:3, hits: 1] ->00003: echo 1; - 00004: echo 2; - 00005: echo 3; +>00003: echo $i++; + 00004: echo $i++; + 00005: echo $i++; prompt> 1 [Breakpoint #0 in ZEND_ECHO at %s:4, hits: 2] ->00004: echo 2; - 00005: echo 3; - 00006: echo 4; +>00004: echo $i++; + 00005: echo $i++; + 00006: echo $i++; prompt> 2 [Breakpoint #0 in ZEND_ECHO at %s:5, hits: 3] ->00005: echo 3; - 00006: echo 4; +>00005: echo $i++; + 00006: echo $i++; 00007: prompt> 3 [Breakpoint #0 in ZEND_ECHO at %s:6, hits: 4] ->00006: echo 4; +>00006: echo $i++; 00007: prompt> 4 [Script ended normally] prompt> --FILE-- <?php - -echo 1; -echo 2; -echo 3; -echo 4; +$i = 1; +echo $i++; +echo $i++; +echo $i++; +echo $i++; diff --git a/sapi/phpdbg/tests/exceptions_003.phpt b/sapi/phpdbg/tests/exceptions_003.phpt index fffe7a9296..37e7289092 100644 --- a/sapi/phpdbg/tests/exceptions_003.phpt +++ b/sapi/phpdbg/tests/exceptions_003.phpt @@ -25,7 +25,7 @@ prompt> [L7 %s ECHO "ok " 00008: } 00009: } catch (Error $e) { prompt> ok -[L7 %s FAST_RET<TO_CATCH> ~%d J7 %s] +[L7 %s FAST_RET<TO_CATCH> ~%d try-catch(0) %s] [L9 %s CATCH "Error" $e 1 %s] >00005: x(); 00006: } finally { diff --git a/sapi/phpdbg/tests/print_001.phpt b/sapi/phpdbg/tests/print_001.phpt index 1f7a5ac0b9..a4f300572a 100644 --- a/sapi/phpdbg/tests/print_001.phpt +++ b/sapi/phpdbg/tests/print_001.phpt @@ -34,7 +34,7 @@ prompt> [Context %s (11 ops)] L1-19 {main}() %s - %s + 11 ops L4 #0 NOP L14 #1 NOP - L18 #2 NEW "Foo\\Bar" @1 + L18 #2 NEW "Foo\\Bar" J4 @1 L18 #3 DO_FCALL L18 #4 INIT_METHOD_CALL @1 "Foo" L18 #5 SEND_VAL_EX "test" 1 diff --git a/sapi/phpdbg/tests/stepping_001.phpt b/sapi/phpdbg/tests/stepping_001.phpt index 5c92ba2f0b..ec9def278f 100644 --- a/sapi/phpdbg/tests/stepping_001.phpt +++ b/sapi/phpdbg/tests/stepping_001.phpt @@ -1,5 +1,7 @@ --TEST-- Stepping with exceptions must not be stuck at CATCH +--INI-- +opcache.enable=0 --PHPDBG-- b ZEND_THROW r @@ -32,7 +34,7 @@ prompt> [L10 %s ECHO "ok" 00011: } finally { 00012: echo " ... ok"; prompt> ok -[L11 %s FAST_CALL J8 ~%d %s] +[L11 %s FAST_CALL J8 try-catch(0) ~%d %s] >00011: } finally { 00012: echo " ... ok"; 00013: } |
