summaryrefslogtreecommitdiff
path: root/vm_dump.c
diff options
context:
space:
mode:
authorKoichi Sasada <ko1@atdot.net>2022-10-17 17:50:42 +0900
committerKoichi Sasada <ko1@atdot.net>2022-10-20 17:38:28 +0900
commite35c528d721d209ed8531b10b46c2ac725ea7bf5 (patch)
tree7a5fe3d73461b9e628f04226dedfffe8632a5438 /vm_dump.c
parent7563604fb868d87057733f52d780d841fc1ab6bb (diff)
downloadruby-e35c528d721d209ed8531b10b46c2ac725ea7bf5.tar.gz
push dummy frame for loading process
This patch pushes dummy frames when loading code for the profiling purpose. The following methods push a dummy frame: * `Kernel#require` * `Kernel#load` * `RubyVM::InstructionSequence.compile_file` * `RubyVM::InstructionSequence.load_from_binary` https://bugs.ruby-lang.org/issues/18559
Diffstat (limited to 'vm_dump.c')
-rw-r--r--vm_dump.c20
1 files changed, 14 insertions, 6 deletions
diff --git a/vm_dump.c b/vm_dump.c
index 607488388a..93179fedc8 100644
--- a/vm_dump.c
+++ b/vm_dump.c
@@ -89,6 +89,9 @@ control_frame_dump(const rb_execution_context_t *ec, const rb_control_frame_t *c
case VM_FRAME_MAGIC_RESCUE:
magic = "RESCUE";
break;
+ case VM_FRAME_MAGIC_DUMMY:
+ magic = "DUMMY";
+ break;
case 0:
magic = "------";
break;
@@ -117,12 +120,17 @@ control_frame_dump(const rb_execution_context_t *ec, const rb_control_frame_t *c
line = -1;
}
else {
- iseq = cfp->iseq;
- pc = cfp->pc - ISEQ_BODY(iseq)->iseq_encoded;
- iseq_name = RSTRING_PTR(ISEQ_BODY(iseq)->location.label);
- line = rb_vm_get_sourceline(cfp);
- if (line) {
- snprintf(posbuf, MAX_POSBUF, "%s:%d", RSTRING_PTR(rb_iseq_path(iseq)), line);
+ if (cfp->pc) {
+ iseq = cfp->iseq;
+ pc = cfp->pc - ISEQ_BODY(iseq)->iseq_encoded;
+ iseq_name = RSTRING_PTR(ISEQ_BODY(iseq)->location.label);
+ line = rb_vm_get_sourceline(cfp);
+ if (line) {
+ snprintf(posbuf, MAX_POSBUF, "%s:%d", RSTRING_PTR(rb_iseq_path(iseq)), line);
+ }
+ }
+ else {
+ iseq_name = "<dummy_frame>";
}
}
}