aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog10
-rw-r--r--vm_core.h2
-rw-r--r--vm_dump.c6
-rw-r--r--vm_exec.h2
4 files changed, 15 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index 49c2caeab3..b98001ec88 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,6 +1,14 @@
+Fri Nov 29 20:59:39 2013 Masaya Tarui <tarui@ruby-lang.org>
+
+ * vm_dump.c (rb_vmdebug_debug_print_pre): Bugfix. Get PC directly.
+ PC is cached into local stack and cfp->pc is incorrent at next of
+ branch or jump.
+ * vm_exec.h (DEBUG_ENTER_INSN): catch up this change.
+ * vm_core.h: update signature of rb_vmdebug_debug_print_pre.
+
Fri Nov 29 20:43:57 2013 Masaya Tarui <tarui@ruby-lang.org>
- * compile.c : Bugsfix for dump_disasm_list.
+ * compile.c: Bugsfix for dump_disasm_list.
rb_inspect denies a hidden object. So, insert rapper that creates
the unhidden one.
adjust->label is null sometimes.
diff --git a/vm_core.h b/vm_core.h
index 1011df7276..3f71933147 100644
--- a/vm_core.h
+++ b/vm_core.h
@@ -840,7 +840,7 @@ VALUE rb_proc_alloc(VALUE klass);
/* for debug */
extern void rb_vmdebug_stack_dump_raw(rb_thread_t *, rb_control_frame_t *);
-extern void rb_vmdebug_debug_print_pre(rb_thread_t *th, rb_control_frame_t *cfp);
+extern void rb_vmdebug_debug_print_pre(rb_thread_t *th, rb_control_frame_t *cfp, VALUE *_pc);
extern void rb_vmdebug_debug_print_post(rb_thread_t *th, rb_control_frame_t *cfp);
#define SDR() rb_vmdebug_stack_dump_raw(GET_THREAD(), GET_THREAD()->cfp)
diff --git a/vm_dump.c b/vm_dump.c
index b15f17a487..dd28780706 100644
--- a/vm_dump.c
+++ b/vm_dump.c
@@ -349,19 +349,21 @@ rb_vmdebug_thread_dump_regs(VALUE thval)
}
void
-rb_vmdebug_debug_print_pre(rb_thread_t *th, rb_control_frame_t *cfp)
+rb_vmdebug_debug_print_pre(rb_thread_t *th, rb_control_frame_t *cfp,VALUE *_pc)
{
rb_iseq_t *iseq = cfp->iseq;
if (iseq != 0) {
VALUE *seq = iseq->iseq;
- ptrdiff_t pc = cfp->pc - iseq->iseq_encoded;
+ ptrdiff_t pc = _pc - iseq->iseq_encoded;
int i;
for (i=0; i<(int)VM_CFP_CNT(th, cfp); i++) {
printf(" ");
}
printf("| ");
+ if(0)printf("[%03ld] ",cfp->sp - th->stack);
+
/* printf("%3"PRIdPTRDIFF" ", VM_CFP_CNT(th, cfp)); */
if (pc >= 0) {
rb_iseq_disasm_insn(0, seq, (size_t)pc, iseq, 0);
diff --git a/vm_exec.h b/vm_exec.h
index 7e2b60a359..e087a7f603 100644
--- a/vm_exec.h
+++ b/vm_exec.h
@@ -27,7 +27,7 @@ typedef rb_iseq_t *ISEQ;
#if VMDEBUG > 0
#define debugs printf
#define DEBUG_ENTER_INSN(insn) \
- rb_vmdebug_debug_print_pre(th, GET_CFP());
+ rb_vmdebug_debug_print_pre(th, GET_CFP(),GET_PC());
#if OPT_STACK_CACHING
#define SC_REGS() , reg_a, reg_b