ext/iseq_extra.c in rb-threadframe-0.32 vs ext/iseq_extra.c in rb-threadframe-0.33

- old
+ new

@@ -3,11 +3,12 @@ */ #if 0 /* The following is to fake out rdoc, until I find a better fix. */ /* * Additions to the RubyVM::InstructionSequence class */ -VALUE rb_cIseq = rb_define_class_under(rb_cRubyVM, "InstructionSequence", ...) +VALUE rb_cIseq = rb_define_class_under(rb_cRubyVM, "InstructionSequence", + rb_cObject); #endif #include "../include/vm_core_mini.h" /* Pulls in ruby.h and node.h */ #ifdef HAVE_COMPILE_OPTIONS #endif @@ -101,11 +102,40 @@ return Qtrue; else return Qfalse; } +VALUE +iseq_parent(VALUE self) +{ + rb_iseq_t *piseq; + rb_iseq_t *parent_iseq; + VALUE parent_iseqval; + GetISeqPtr(self, piseq); + if (!RTEST(piseq->parent_iseq)) return Qnil; + parent_iseqval = iseq_alloc_shared(rb_cISeq); + GetISeqPtr(parent_iseqval, parent_iseq); + memcpy(parent_iseq, piseq->parent_iseq, sizeof(struct rb_iseq_struct)); + return parent_iseqval; +} + +VALUE +iseq_local_iseq(VALUE self) +{ + rb_iseq_t *piseq; + rb_iseq_t *local_iseq; + VALUE local_iseqval; + GetISeqPtr(self, piseq); + + if (!RTEST(piseq->local_iseq)) return Qnil; + local_iseqval = iseq_alloc_shared(rb_cISeq); + GetISeqPtr(local_iseqval, local_iseq); + memcpy(local_iseq, piseq->local_iseq, sizeof(struct rb_iseq_struct)); + return local_iseqval; +} + /* * call-seq: * RubyVM::InstructionSequence#local_name(i) - String * * Returns the string name of local variable in i'th position @@ -388,15 +418,17 @@ rb_define_method(rb_cISeq, "iseq_size", iseq_iseq_size, 0) ; rb_define_method(rb_cISeq, "killcache", iseq_killcache, 0) ; rb_define_method(rb_cISeq, "klass", iseq_klass, 0) ; rb_define_method(rb_cISeq, "lineno", iseq_line_no, 0) ; rb_define_method(rb_cISeq, "line_range", iseq_line_range, 0) ; + rb_define_method(rb_cISeq, "local_iseq", iseq_local_iseq, 0) ; rb_define_method(rb_cISeq, "local_name", iseq_local_name, 1) ; rb_define_method(rb_cISeq, "local_size", iseq_local_size, 0) ; rb_define_method(rb_cISeq, "local_table_size", iseq_local_table_size, 0) ; rb_define_method(rb_cISeq, "offset2lines", iseq_offset2lines, 1) ; rb_define_method(rb_cISeq, "offsetlines", iseq_offsetlines, 0) ; rb_define_method(rb_cISeq, "orig", iseq_orig, 0) ; + rb_define_method(rb_cISeq, "parent", iseq_parent, 0) ; rb_define_method(rb_cISeq, "name", iseq_name, 0) ; rb_define_method(rb_cISeq, "self", iseq_self, 0) ; rb_define_method(rb_cISeq, "source_container", iseq_source_container, 0) ; rb_define_method(rb_cISeq, "type", iseq_type, 0) ;