Feature #16282 ยป 0001-Wrap-call-data-with-an-IMEMO-object.patch
| ext/objspace/objspace.c | ||
|---|---|---|
|
imemo_type_ids[8] = rb_intern("imemo_tmpbuf");
|
||
|
imemo_type_ids[9] = rb_intern("imemo_ast");
|
||
|
imemo_type_ids[10] = rb_intern("imemo_parser_strterm");
|
||
|
imemo_type_ids[11] = rb_intern("imemo_call_data");
|
||
|
}
|
||
|
rb_objspace_each_objects(count_imemo_objects_i, (void *)hash);
|
||
| ext/objspace/objspace_dump.c | ||
|---|---|---|
|
TYPE_STR(tmpbuf);
|
||
|
TYPE_STR(ast);
|
||
|
TYPE_STR(parser_strterm);
|
||
|
TYPE_STR(call_data);
|
||
|
default:
|
||
|
return "unknown";
|
||
|
#undef TYPE_STR
|
||
| gc.c | ||
|---|---|---|
|
case imemo_ifunc:
|
||
|
case imemo_memo:
|
||
|
case imemo_parser_strterm:
|
||
|
case imemo_call_data:
|
||
|
break;
|
||
|
default:
|
||
|
/* unreachable */
|
||
| ... | ... | |
|
case imemo_parser_strterm:
|
||
|
RB_DEBUG_COUNTER_INC(obj_imemo_parser_strterm);
|
||
|
break;
|
||
|
case imemo_call_data:
|
||
|
RB_DEBUG_COUNTER_INC(obj_imemo_call_data);
|
||
|
break;
|
||
|
default:
|
||
|
/* unreachable */
|
||
|
break;
|
||
| ... | ... | |
|
case imemo_parser_strterm:
|
||
|
rb_strterm_mark(obj);
|
||
|
return;
|
||
|
case imemo_call_data:
|
||
|
return;
|
||
|
#if VM_CHECK_MODE > 0
|
||
|
default:
|
||
|
VM_UNREACHABLE(gc_mark_imemo);
|
||
| ... | ... | |
|
break;
|
||
|
case imemo_parser_strterm:
|
||
|
case imemo_tmpbuf:
|
||
|
case imemo_call_data:
|
||
|
break;
|
||
|
default:
|
||
|
rb_bug("not reachable %d", imemo_type(obj));
|
||
| internal.h | ||
|---|---|---|
|
imemo_iseq = 7,
|
||
|
imemo_tmpbuf = 8,
|
||
|
imemo_ast = 9,
|
||
|
imemo_parser_strterm = 10
|
||
|
imemo_parser_strterm = 10,
|
||
|
imemo_call_data = 11
|
||
|
};
|
||
|
#define IMEMO_MASK 0x0f
|
||
| ... | ... | |
|
struct rb_call_cache cc;
|
||
|
struct rb_call_info ci;
|
||
|
};
|
||
|
VALUE rb_funcallv_with_cc(struct rb_call_data*, VALUE, ID, int, const VALUE*)
|
||
|
#if GCC_VERSION_SINCE(3, 3, 0) && defined(__OPTIMIZE__)
|
||
|
__attribute__((__visibility__("default"), __nonnull__(1)))
|
||
|
# define rb_funcallv(recv, mid, argc, argv) \
|
||
|
__extension__({ \
|
||
|
static struct rb_call_data rb_funcallv_data = { { 0, }, { 0, }, }; \
|
||
|
static VALUE wrapper = 0; \
|
||
|
if (!wrapper) { \
|
||
|
wrapper = rb_imemo_new(imemo_call_data, 0, 0, 0, (VALUE)&rb_funcallv_data); \
|
||
|
rb_gc_register_mark_object(wrapper); \
|
||
|
} \
|
||
|
rb_funcallv_with_cc(&rb_funcallv_data, recv, mid, argc, argv); \
|
||
|
})
|
||
|
#endif
|
||