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) ;