27 #include "insns_info.inc" 33 #define hidden_obj_p(obj) (!SPECIAL_CONST_P(obj) && !RBASIC(obj)->klass) 36 obj_resurrect(
VALUE obj)
134 param_keyword_size(
const struct rb_iseq_param_keyword *pkw)
138 if (!pkw)
return size;
140 size +=
sizeof(
struct rb_iseq_param_keyword);
141 size +=
sizeof(
VALUE) * (pkw->num - pkw->required_num);
163 size += iseq_catch_table_bytes(body->
catch_table->size);
186 size += rb_call_info_kw_arg_bytes(kw_arg->
keyword_len);
223 if (path == realpath ||
260 if (type == ISEQ_TYPE_TOP) {
263 else if (type == ISEQ_TYPE_METHOD || type == ISEQ_TYPE_CLASS) {
274 if (type == ISEQ_TYPE_MAIN) {
289 const rb_iseq_t *parent,
enum iseq_type type,
295 if (parent && (type == ISEQ_TYPE_MAIN || type == ISEQ_TYPE_TOP))
299 set_relation(iseq, parent);
302 iseq_location_setup(iseq,
name, path, realpath, first_lineno);
329 if (
RTEST(coverages)) {
345 compile_data_free(data);
375 #define SET_COMPILE_OPTION(o, h, mem) \ 376 { VALUE flag = rb_hash_aref((h), ID2SYM(rb_intern(#mem))); \ 377 if (flag == Qtrue) { (o)->mem = 1; } \ 378 else if (flag == Qfalse) { (o)->mem = 0; } \ 380 #define SET_COMPILE_OPTION_NUM(o, h, mem) \ 381 { VALUE num = rb_hash_aref(opt, ID2SYM(rb_intern(#mem))); \ 382 if (!NIL_P(num)) (o)->mem = NUM2INT(num); \ 396 #undef SET_COMPILE_OPTION 397 #undef SET_COMPILE_OPTION_NUM 404 set_compile_option_from_hash(option, opt);
411 *option = COMPILE_OPTION_DEFAULT;
414 *option = COMPILE_OPTION_FALSE;
416 else if (opt ==
Qtrue) {
422 *option = COMPILE_OPTION_DEFAULT;
423 set_compile_option_from_hash(option, opt);
434 #define SET_COMPILE_OPTION(o, h, mem) \ 435 rb_hash_aset((h), ID2SYM(rb_intern(#mem)), (o)->mem ? Qtrue : Qfalse) 436 #define SET_COMPILE_OPTION_NUM(o, h, mem) \ 437 rb_hash_aset((h), ID2SYM(rb_intern(#mem)), INT2NUM((o)->mem)) 452 #undef SET_COMPILE_OPTION 453 #undef SET_COMPILE_OPTION_NUM 459 const rb_iseq_t *parent,
enum iseq_type type)
462 &COMPILE_OPTION_DEFAULT);
469 &COMPILE_OPTION_DEFAULT);
477 parent, ISEQ_TYPE_MAIN, &COMPILE_OPTION_DEFAULT);
484 VALUE v1 = iseqw_new(iseq);
502 if (!option) option = &COMPILE_OPTION_DEFAULT;
503 prepare_iseq_build(iseq, name, path, realpath, first_lineno, parent, type, option);
506 cleanup_iseq_build(iseq);
508 return iseq_translate(iseq);
517 return iseqw_check(iseqv);
523 #define CHECK_ARRAY(v) rb_convert_type_with_id((v), T_ARRAY, "Array", idTo_ary) 524 #define CHECK_HASH(v) rb_convert_type_with_id((v), T_HASH, "Hash", idTo_hash) 525 #define CHECK_STRING(v) rb_convert_type_with_id((v), T_STRING, "String", idTo_str) 526 #define CHECK_SYMBOL(v) rb_convert_type_with_id((v), T_SYMBOL, "Symbol", idTo_sym) 529 static enum iseq_type
530 iseq_type_from_sym(
VALUE type)
540 const ID id_defined_guard =
rb_intern(
"defined_guard");
544 if (
typeid == id_top)
return ISEQ_TYPE_TOP;
545 if (
typeid == id_method)
return ISEQ_TYPE_METHOD;
546 if (
typeid == id_block)
return ISEQ_TYPE_BLOCK;
547 if (
typeid == id_class)
return ISEQ_TYPE_CLASS;
548 if (
typeid == id_rescue)
return ISEQ_TYPE_RESCUE;
549 if (
typeid == id_ensure)
return ISEQ_TYPE_ENSURE;
550 if (
typeid == id_eval)
return ISEQ_TYPE_EVAL;
551 if (
typeid == id_main)
return ISEQ_TYPE_MAIN;
552 if (
typeid == id_defined_guard)
return ISEQ_TYPE_DEFINED_GUARD;
553 return (
enum iseq_type)-1;
561 VALUE magic, version1, version2, format_type, misc;
562 VALUE name, path, realpath, first_lineno;
563 VALUE type, body, locals, params, exception;
581 ((void)magic, (
void)version1, (void)version2, (
void)format_type);
597 iseq_type = iseq_type_from_sym(type);
598 if (iseq_type == (
enum iseq_type)-1) {
602 make_compile_option(&option, opt);
604 prepare_iseq_build(iseq, name, path, realpath, first_lineno,
605 parent, (
enum iseq_type)iseq_type, &option);
609 cleanup_iseq_build(iseq);
611 return iseqw_new(iseq);
622 return iseq_load(data,
NULL, opt);
636 const rb_iseq_t *
const parent = base_block ? vm_block_iseq(base_block) :
NULL;
638 const enum iseq_type type = parent ? ISEQ_TYPE_EVAL : ISEQ_TYPE_TOP;
639 #if !defined(__GNUC__) || (__GNUC__ == 4 && __GNUC_MINOR__ == 8) 640 # define INITIALIZED volatile 649 make_compile_option(&option, opt);
662 node = (*parse)(parser, file, src, ln);
673 parent, type, &option);
734 if (local_iseq->
body->
type == ISEQ_TYPE_METHOD) {
751 iseqw_mark(
void *ptr)
757 iseqw_memsize(
const void *ptr)
759 return iseq_memsize((
const rb_iseq_t *)ptr);
764 {iseqw_mark,
NULL, iseqw_memsize,},
771 union {
const rb_iseq_t *in;
void *out; } deconst;
784 return iseqw_new(iseq);
819 case 5: opt =
argv[--i];
820 case 4: line =
argv[--i];
821 case 3: path =
argv[--i];
822 case 2: file =
argv[--i];
863 case 2: opt =
argv[--i];
878 make_compile_option(&option, opt);
883 line,
NULL, ISEQ_TYPE_TOP, &option));
919 iseqw_s_compile_option_set(
VALUE self,
VALUE opt)
923 make_compile_option(&option, opt);
924 COMPILE_OPTION_DEFAULT =
option;
937 iseqw_s_compile_option_get(
VALUE self)
939 return make_compile_option_value(&COMPILE_OPTION_DEFAULT);
943 iseqw_check(
VALUE iseqw)
960 return iseqw_check(iseqw);
972 iseqw_eval(
VALUE self)
983 iseqw_inspect(
VALUE self)
985 const rb_iseq_t *iseq = iseqw_check(
self);
1022 iseqw_path(
VALUE self)
1044 iseqw_absolute_path(
VALUE self)
1073 iseqw_label(
VALUE self)
1099 iseqw_base_label(
VALUE self)
1115 iseqw_first_lineno(
VALUE self)
1204 iseqw_to_a(
VALUE self)
1206 const rb_iseq_t *iseq = iseqw_check(
self);
1208 return iseq_data_to_ary(iseq);
1215 get_line_info(
const rb_iseq_t *iseq,
size_t pos)
1219 const int debug = 0;
1230 else if (
size == 1) {
1234 for (i=1; i<
size; i++) {
1235 if (debug) printf(
"table[%"PRIuSIZE"]: position: %d, line: %d, pos: %"PRIuSIZE"\n",
1238 if (table[i].position == pos) {
1241 if (table[i].position > pos) {
1250 find_line_no(
const rb_iseq_t *iseq,
size_t pos)
1266 return find_line_no(iseq, pos);
1269 return find_line_no(iseq, pos - 1);
1274 id_to_name(
ID id,
VALUE default_value)
1278 str = default_value;
1291 const char *types = insn_op_types(insn);
1292 char type = types[op_no];
1305 if (insn == BIN(getlocal) || insn == BIN(setlocal)) {
1311 for (i = 0; i <
level; i++) {
1316 ret = id_to_name(lid,
INT2FIX(
'*'));
1331 op = obj_resurrect(op);
1411 if (dladdr((
void *)op, &info) && info.dli_sname) {
1421 rb_bug(
"insn_operand_intern: unknown operand type: %c", type);
1434 VALUE insn = code[pos];
1435 int len = insn_len(insn);
1437 const char *types = insn_op_types(insn);
1439 const char *insn_name_buff;
1441 insn_name_buff = insn_name(insn);
1447 (
int)strcspn(insn_name_buff,
"_"), insn_name_buff);
1450 for (j = 0; types[j]; j++) {
1452 len, pos, &code[pos + j + 2],
1462 unsigned int line_no = find_line_no(iseq, pos);
1463 unsigned int prev = pos == 0 ? 0 : find_line_no(iseq, pos - 1);
1464 if (line_no && line_no != prev) {
1466 slen = (slen > 70) ? 0 : (70 - slen);
1467 str =
rb_str_catf(str,
"%*s(%4d)", (
int)slen,
"", line_no);
1482 catch_type(
int type)
1485 case CATCH_TYPE_RESCUE:
1487 case CATCH_TYPE_ENSURE:
1489 case CATCH_TYPE_RETRY:
1491 case CATCH_TYPE_BREAK:
1493 case CATCH_TYPE_REDO:
1495 case CATCH_TYPE_NEXT:
1498 rb_bug(
"unknown catch type (%d)", type);
1525 enum {header_minlen = 72};
1536 memset(
RSTRING_PTR(str) + l,
'=', header_minlen - l);
1548 "| catch type: %-6s st: %04d ed: %04d sp: %04d cont: %04d\n",
1550 (
int)entry->
end, (
int)entry->
sp, (
int)entry->
cont);
1557 rb_str_cat2(str,
"|-------------------------------------" 1558 "-----------------------------------\n");
1566 "local table (size: %d, argc: %d " 1567 "[opts: %d, rest: %d, post: %d, block: %d, kw: %d@%d, kwrest: %d])\n",
1582 char argi[0x100] =
"";
1583 char opti[0x100] =
"";
1588 if (li >= argc && li < argc + opts) {
1594 snprintf(argi,
sizeof(argi),
"%s%s%s%s%s",
1615 for (n = 0; n <
size;) {
1646 iseqw_disasm(
VALUE self)
1694 iseq = vm_proc_iseq(body);
1696 if (!rb_obj_is_iseq((
VALUE)iseq)) {
1704 return iseq ? iseqw_new(iseq) :
Qnil;
1762 VALUE iseqw = iseqw_s_of(klass, body);
1770 #include "node_name.inc" 1772 rb_bug(
"unknown node (%d)", node);
1777 #define DECL_SYMBOL(name) \ 1778 static VALUE sym_##name 1780 #define INIT_SYMBOL(name) \ 1781 sym_##name = ID2SYM(rb_intern(#name)) 1784 register_label(
struct st_table *table,
unsigned long idx)
1803 rb_bug(
"exception_type2symbol: unknown type %d", (
int)type);
1823 unsigned int line = 0;
1824 VALUE *seq, *iseq_original;
1835 static VALUE insn_syms[VM_INSTRUCTION_SIZE];
1850 for (i=0; i<VM_INSTRUCTION_SIZE; i++) {
1866 case ISEQ_TYPE_TOP: type = sym_top;
break;
1867 case ISEQ_TYPE_METHOD: type = sym_method;
break;
1868 case ISEQ_TYPE_BLOCK: type = sym_block;
break;
1869 case ISEQ_TYPE_CLASS: type = sym_class;
break;
1870 case ISEQ_TYPE_RESCUE: type = sym_rescue;
break;
1871 case ISEQ_TYPE_ENSURE: type = sym_ensure;
break;
1872 case ISEQ_TYPE_EVAL: type = sym_eval;
break;
1873 case ISEQ_TYPE_MAIN: type = sym_main;
break;
1874 case ISEQ_TYPE_DEFINED_GUARD: type = sym_defined_guard;
break;
1875 default:
rb_bug(
"unsupported iseq type");
1902 for (j = 0; j <
len; j++) {
1940 for (seq = iseq_original; seq < iseq_original + iseq->
body->
iseq_size; ) {
1941 VALUE insn = *seq++;
1942 int j,
len = insn_len(insn);
1943 VALUE *nseq = seq + len - 1;
1947 for (j=0; j<len-1; j++, seq++) {
1948 switch (insn_op_type(insn, j)) {
1950 unsigned long idx = nseq - iseq_original + *seq;
1951 rb_ary_push(ary, register_label(labels_table, idx));
1965 VALUE val = iseq_data_to_ary(rb_iseq_check(iseq));
2027 unsigned long idx = nseq - iseq_original + pos;
2030 register_label(labels_table, idx));
2037 #if SIZEOF_VALUE <= SIZEOF_LONG 2046 rb_bug(
"unknown operand: %c", insn_op_type(insn, j));
2080 if (
st_lookup(labels_table, pos, &label)) {
2129 ID req, opt, rest, block,
key, keyrest;
2130 #define PARAM_TYPE(type) rb_ary_push(a = rb_ary_new2(2), ID2SYM(type)) 2131 #define PARAM_ID(i) iseq->body->local_table[(i)] 2132 #define PARAM(i, type) ( \ 2134 rb_id2str(PARAM_ID(i)) ? \ 2135 rb_ary_push(a, ID2SYM(PARAM_ID(i))) : \ 2153 for (; i < r; i++) {
2213 static const char expr_names[][18] = {
2215 "instance-variable",
2232 if ((
unsigned)(type - 1) >= (
unsigned)
numberof(expr_names))
return 0;
2233 estr = expr_names[type - 1];
2234 if (!estr[0])
return 0;
2235 defs =
GET_VM()->defined_strings;
2238 GET_VM()->defined_strings = defs;
2260 const rb_iseq_t *iseq = iseqw_check(iseqw);
2262 VALUE *iseq_original;
2265 for (pos = 0; cont && pos < iseq->
body->
iseq_size; pos += insn_len(insn)) {
2266 insn = iseq_original[pos];
2268 if (insn == BIN(trace)) {
2278 int line = find_line_no(iseq, pos);
2280 cont = (*func)(line, &events, data);
2281 if (current_events != events) {
2283 iseq_original[pos+1] = encoded[pos+1] =
2325 if (data->
pos == 0) {
2371 if (data.prev == 0) {
2422 iseqw_s_load_from_binary(
VALUE self,
VALUE str)
2434 iseqw_s_load_from_binary_extra_data(
VALUE self,
VALUE str)
int rb_iseqw_line_trace_each(VALUE iseqw, int(*func)(int line, rb_event_flag_t *events_ptr, void *d), void *data)
VALUE rb_iseqw_line_trace_all(VALUE iseqw)
#define VM_CALL_ARGS_BLOCKARG
union iseq_inline_storage_entry * is_entries
ID rb_check_id(volatile VALUE *)
Returns ID for the given name if it is interned already, or 0.
VALUE iseq_ibf_load_extra_data(VALUE str)
unsigned int rb_iseq_line_no(const rb_iseq_t *iseq, size_t pos)
void rb_bug(const char *fmt,...)
VALUE rb_ary_entry(VALUE ary, long offset)
void ibf_load_iseq_complete(rb_iseq_t *iseq)
#define RUBY_TYPED_FREE_IMMEDIATELY
void rb_iseq_build_from_ary(rb_iseq_t *iseq, VALUE misc, VALUE locals, VALUE params, VALUE exception, VALUE body)
NODE * rb_parser_compile_string_path(VALUE vparser, VALUE f, VALUE s, int line)
const rb_iseq_t * rb_method_iseq(VALUE body)
#define DECL_SYMBOL(name)
rb_iseq_t * rb_iseq_compile_with_option(VALUE src, VALUE file, VALUE realpath, VALUE line, const struct rb_block *base_block, VALUE opt)
void rb_iseq_make_compile_option(rb_compile_option_t *option, VALUE opt)
#define RB_OBJ_WRITTEN(a, oldv, b)
VALUE rb_iseq_method_name(const rb_iseq_t *iseq)
void rb_undef_alloc_func(VALUE)
void rb_define_singleton_method(VALUE obj, const char *name, VALUE(*func)(ANYARGS), int argc)
Defines a singleton method for obj.
#define OPT_DEBUG_FROZEN_STRING_LITERAL
void rb_iseq_mark(const rb_iseq_t *iseq)
VALUE rb_fstring_cstr(const char *str)
void rb_raise(VALUE exc, const char *fmt,...)
#define ISEQ_MAJOR_VERSION
NODE * rb_parser_compile_file_path(VALUE vparser, VALUE fname, VALUE file, int start)
#define TypedData_Wrap_Struct(klass, data_type, sval)
struct iseq_compile_data_storage * storage_head
struct rb_iseq_struct::@137::@138 loader
struct rb_iseq_constant_body::@135::@136 flags
VALUE rb_iseqw_line_trace_specify(VALUE iseqval, VALUE pos, VALUE set)
void rb_define_private_method(VALUE klass, const char *name, VALUE(*func)(ANYARGS), int argc)
void rb_id_table_free(struct rb_id_table *tbl)
VALUE rb_ary_push(VALUE ary, VALUE item)
VALUE rb_iseq_absolute_path(const rb_iseq_t *iseq)
VALUE rb_iseq_local_variables(const rb_iseq_t *iseq)
VALUE rb_str_concat(VALUE, VALUE)
#define OPT_INLINE_CONST_CACHE
VALUE rb_ary_tmp_new(long capa)
VALUE rb_iseq_defined_string(enum defined_type type)
struct rb_iseq_constant_body * body
rb_iseq_t * rb_iseq_new_main(NODE *node, VALUE path, VALUE realpath, const rb_iseq_t *parent)
VALUE rb_funcall(VALUE, ID, int,...)
Calls a method.
struct rb_call_info_kw_arg * kw_arg
VALUE rb_iseq_label(const rb_iseq_t *iseq)
VALUE rb_define_class_under(VALUE outer, const char *name, VALUE super)
Defines a class under the namespace of outer.
#define RUBY_MARK_LEAVE(msg)
struct iseq_compile_data_storage * next
#define VM_CALL_ARGS_SPLAT
void rb_gc_mark(VALUE ptr)
VALUE rb_hash_lookup(VALUE hash, VALUE key)
VALUE rb_file_open_str(VALUE, const char *)
int rb_str_cmp(VALUE, VALUE)
VALUE rb_iseqw_local_variables(VALUE iseqval)
VALUE rb_inspect(VALUE)
Convenient wrapper of Object::inspect.
void rb_undef_method(VALUE klass, const char *name)
rb_iseq_t * rb_iseq_compile_on_base(VALUE src, VALUE file, VALUE line, const struct rb_block *base_block)
const rb_iseq_t * rb_iseq_load_iseq(VALUE fname)
#define OPT_TAILCALL_OPTIMIZATION
const rb_compile_option_t * option
VALUE iseq_ibf_dump(const rb_iseq_t *iseq, VALUE opt)
const VALUE catch_table_ary
RUBY_SYMBOL_EXPORT_BEGIN typedef unsigned long st_data_t
enum iseq_catch_table_entry::catch_type type
const VALUE * iseq_encoded
struct rb_id_table * ivar_cache_table
rb_iseq_t * iseq_alloc(void)
void rb_hash_foreach(VALUE hash, int(*func)(ANYARGS), VALUE farg)
#define ISEQ_MINOR_VERSION
rb_iseq_t * rb_iseq_compile(VALUE src, VALUE file, VALUE line)
VALUE rb_iseqw_new(const rb_iseq_t *iseq)
#define SET_COMPILE_OPTION_NUM(o, h, mem)
#define ISEQ_NOT_LOADED_YET
VALUE rb_obj_class(VALUE)
call-seq: obj.class -> class
#define RB_TYPE_P(obj, type)
void * ruby_xcalloc(size_t n, size_t size)
#define OPT_PEEPHOLE_OPTIMIZATION
int rb_str_symname_p(VALUE)
#define RUBY_TYPED_WB_PROTECTED
VALUE rb_class_name(VALUE)
VALUE rb_hash_aset(VALUE hash, VALUE key, VALUE val)
unsigned int local_table_size
RUBY_EXTERN VALUE rb_cObject
VALUE rb_iseq_pathobj_new(VALUE path, VALUE realpath)
struct rb_call_info * ci_entries
VALUE rb_get_coverages(void)
VALUE rb_str_cat2(VALUE, const char *)
rb_iseq_t * rb_iseq_new_top(NODE *node, VALUE name, VALUE path, VALUE realpath, const rb_iseq_t *parent)
#define SIZEOF_ISEQ_COMPILE_DATA_STORAGE
VALUE rb_iseq_first_lineno(const rb_iseq_t *iseq)
void rb_iseq_pathobj_set(const rb_iseq_t *iseq, VALUE path, VALUE realpath)
VALUE rb_insn_operand_intern(const rb_iseq_t *iseq, VALUE insn, int op_no, VALUE op, int len, size_t pos, const VALUE *pnop, VALUE child)
#define VM_CALL_ARGS_SIMPLE
void rb_ary_store(VALUE ary, long idx, VALUE val)
#define RUBY_MARK_ENTER(msg)
VALUE * rb_iseq_original_iseq(const rb_iseq_t *iseq)
VALUE rb_parser_set_context(VALUE vparser, const struct rb_block *base, int main)
void rb_gc_register_mark_object(VALUE obj)
#define OPT_INSTRUCTIONS_UNIFICATION
#define ISEQ_COVERAGE_SET(iseq, cov)
rb_iseq_t * rb_iseq_new(NODE *node, VALUE name, VALUE path, VALUE realpath, const rb_iseq_t *parent, enum iseq_type type)
VALUE rb_str_resurrect(VALUE str)
VALUE rb_str_resize(VALUE, long)
#define INIT_SYMBOL(name)
struct rb_call_cache * cc_entries
#define RUBY_EVENT_SPECIFIED_LINE
#define hidden_obj_p(obj)
struct rb_iseq_constant_body::@135 param
parameter information
VALUE rb_obj_freeze(VALUE)
call-seq: obj.freeze -> obj
VALUE rb_obj_is_proc(VALUE)
unsigned int coverage_enabled
VALUE rb_sprintf(const char *format,...)
#define OPT_TRACE_INSTRUCTION
int rb_scan_args(int argc, const VALUE *argv, const char *fmt,...)
VALUE rb_iseq_coverage(const rb_iseq_t *iseq)
unsigned int peephole_optimization
void rb_exc_raise(VALUE mesg)
Raises an exception in the current thread.
#define SET_COMPILE_OPTION(o, h, mem)
#define ISEQ_COVERAGE(iseq)
VALUE rb_iseq_compile_node(rb_iseq_t *iseq, NODE *node)
VALUE rb_iseq_load(VALUE data, VALUE parent, VALUE opt)
VALUE rb_check_funcall(VALUE, ID, int, const VALUE *)
#define INITIAL_ISEQ_COMPILE_DATA_STORAGE_BUFF_SIZE
#define OPT_STACK_CACHING
VALUE rb_str_new_cstr(const char *)
#define OPT_FROZEN_STRING_LITERAL
#define RARRAY_LENINT(ary)
void rb_iseq_free(const rb_iseq_t *iseq)
enum rb_iseq_constant_body::iseq_type type
const struct rb_iseq_constant_body::@135::rb_iseq_param_keyword * keyword
int rb_respond_to(VALUE, ID)
register unsigned int len
VALUE rb_ary_new_from_values(long n, const VALUE *elts)
#define StringValueCStr(v)
VALUE rb_iseq_realpath(const rb_iseq_t *iseq)
const rb_iseq_t * rb_iseqw_to_iseq(VALUE iseqw)
#define RB_OBJ_WRITE(a, slot, b)
VALUE rb_iseq_disasm(const rb_iseq_t *iseq)
#define OPT_SPECIALISED_INSTRUCTION
const struct iseq_catch_table * catch_table
#define RARRAY_AREF(a, i)
int rb_iseq_disasm_insn(VALUE ret, const VALUE *code, size_t pos, const rb_iseq_t *iseq, VALUE child)
Disassemble a instruction Iseq -> Iseq inspect object.
#define RBASIC_CLASS(obj)
#define RUBY_FREE_LEAVE(msg)
void rb_error_arity(int argc, int min, int max)
struct rb_iseq_struct * local_iseq
#define RUBY_FREE_ENTER(msg)
const char * ruby_node_name(int node)
VALUE rb_str_catf(VALUE str, const char *format,...)
void rb_iseq_add_mark_object(const rb_iseq_t *iseq, VALUE obj)
VALUE rb_iseq_eval(const rb_iseq_t *iseq)
#define RUBY_MARK_UNLESS_NULL(ptr)
VALUE rb_str_inspect(VALUE)
VALUE rb_iseq_path(const rb_iseq_t *iseq)
VALUE rb_ary_join(VALUE ary, VALUE sep)
VALUE rb_iseq_base_label(const rb_iseq_t *iseq)
const struct rb_iseq_struct * parent_iseq
VALUE rb_parser_new(void)
VALUE rb_realpath_internal(VALUE basedir, VALUE path, int strict)
rb_execution_context_t ec
const struct iseq_line_info_entry * line_info_table
int main(int argc, char **argv)
VALUE() rb_ary_new_from_args(long n,...)
unsigned int line_info_size
rb_iseq_t * rb_iseq_new_with_opt(NODE *node, VALUE name, VALUE path, VALUE realpath, VALUE first_lineno, const rb_iseq_t *parent, enum iseq_type type, const rb_compile_option_t *option)
#define CONST_ID(var, str)
VALUE rb_str_intern(VALUE)
#define SPECIAL_CONST_P(x)
#define ISEQ_COMPILE_DATA(iseq)
VALUE rb_ary_resurrect(VALUE ary)
union rb_iseq_struct::@137 aux
#define ISEQ_MARK_ARY(iseq)
VALUE rb_exc_new_cstr(VALUE etype, const char *s)
const rb_iseq_t * iseq_ibf_load(VALUE str)
void rb_define_method(VALUE klass, const char *name, VALUE(*func)(ANYARGS), int argc)
VALUE rb_str_append(VALUE, VALUE)
VALUE rb_iseq_parameters(const rb_iseq_t *iseq, int is_proc)
#define OPT_OPERANDS_UNIFICATION
rb_iseq_location_t location
VALUE rb_str_new(const char *, long)