Fix missing imemo cases in objspace_dump by refactoring
imemo_callcache and imemo_callinfo were not handled by the `objspace` module and were showing up as "unknown" in the dump. Extract the code for naming imemos and use that in both the GC and the `objspace` module.
This commit is contained in:
parent
021cec938a
commit
cbf52087a2
Notes:
git
2020-07-11 11:42:58 +09:00
@ -195,28 +195,6 @@ dump_append_string_content(struct dump_config *dc, VALUE obj)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static const char *
|
|
||||||
imemo_name(int imemo)
|
|
||||||
{
|
|
||||||
switch(imemo) {
|
|
||||||
#define TYPE_STR(t) case(imemo_##t): return #t
|
|
||||||
TYPE_STR(env);
|
|
||||||
TYPE_STR(cref);
|
|
||||||
TYPE_STR(svar);
|
|
||||||
TYPE_STR(throw_data);
|
|
||||||
TYPE_STR(ifunc);
|
|
||||||
TYPE_STR(memo);
|
|
||||||
TYPE_STR(ment);
|
|
||||||
TYPE_STR(iseq);
|
|
||||||
TYPE_STR(tmpbuf);
|
|
||||||
TYPE_STR(ast);
|
|
||||||
TYPE_STR(parser_strterm);
|
|
||||||
default:
|
|
||||||
return "unknown";
|
|
||||||
#undef TYPE_STR
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
dump_object(VALUE obj, struct dump_config *dc)
|
dump_object(VALUE obj, struct dump_config *dc)
|
||||||
{
|
{
|
||||||
@ -251,7 +229,7 @@ dump_object(VALUE obj, struct dump_config *dc)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
case T_IMEMO:
|
case T_IMEMO:
|
||||||
dump_append(dc, ", \"imemo_type\":\"%s\"", imemo_name(imemo_type(obj)));
|
dump_append(dc, ", \"imemo_type\":\"%s\"", rb_imemo_name(imemo_type(obj)));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case T_SYMBOL:
|
case T_SYMBOL:
|
||||||
|
45
gc.c
45
gc.c
@ -2256,6 +2256,30 @@ rb_newobj_of(VALUE klass, VALUE flags)
|
|||||||
rb_bug(#func"(): GC does not handle T_NODE 0x%x(%p) 0x%"PRIxVALUE, \
|
rb_bug(#func"(): GC does not handle T_NODE 0x%x(%p) 0x%"PRIxVALUE, \
|
||||||
BUILTIN_TYPE(obj), (void*)(obj), RBASIC(obj)->flags)
|
BUILTIN_TYPE(obj), (void*)(obj), RBASIC(obj)->flags)
|
||||||
|
|
||||||
|
const char *
|
||||||
|
rb_imemo_name(enum imemo_type type)
|
||||||
|
{
|
||||||
|
// put no default case to get a warning if an imemo type is missing
|
||||||
|
switch (type) {
|
||||||
|
#define IMEMO_NAME(x) case imemo_##x: return #x;
|
||||||
|
IMEMO_NAME(env);
|
||||||
|
IMEMO_NAME(cref);
|
||||||
|
IMEMO_NAME(svar);
|
||||||
|
IMEMO_NAME(throw_data);
|
||||||
|
IMEMO_NAME(ifunc);
|
||||||
|
IMEMO_NAME(memo);
|
||||||
|
IMEMO_NAME(ment);
|
||||||
|
IMEMO_NAME(iseq);
|
||||||
|
IMEMO_NAME(tmpbuf);
|
||||||
|
IMEMO_NAME(ast);
|
||||||
|
IMEMO_NAME(parser_strterm);
|
||||||
|
IMEMO_NAME(callinfo);
|
||||||
|
IMEMO_NAME(callcache);
|
||||||
|
#undef IMEMO_NAME
|
||||||
|
}
|
||||||
|
return "unknown";
|
||||||
|
}
|
||||||
|
|
||||||
#undef rb_imemo_new
|
#undef rb_imemo_new
|
||||||
|
|
||||||
VALUE
|
VALUE
|
||||||
@ -11662,26 +11686,7 @@ rb_raw_obj_info(char *buff, const int buff_size, VALUE obj)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case T_IMEMO: {
|
case T_IMEMO: {
|
||||||
const char *imemo_name = "\0";
|
APPENDF((BUFF_ARGS, "<%s> ", rb_imemo_name(imemo_type(obj))));
|
||||||
switch (imemo_type(obj)) {
|
|
||||||
#define IMEMO_NAME(x) case imemo_##x: imemo_name = #x; break;
|
|
||||||
IMEMO_NAME(env);
|
|
||||||
IMEMO_NAME(cref);
|
|
||||||
IMEMO_NAME(svar);
|
|
||||||
IMEMO_NAME(throw_data);
|
|
||||||
IMEMO_NAME(ifunc);
|
|
||||||
IMEMO_NAME(memo);
|
|
||||||
IMEMO_NAME(ment);
|
|
||||||
IMEMO_NAME(iseq);
|
|
||||||
IMEMO_NAME(tmpbuf);
|
|
||||||
IMEMO_NAME(ast);
|
|
||||||
IMEMO_NAME(parser_strterm);
|
|
||||||
IMEMO_NAME(callinfo);
|
|
||||||
IMEMO_NAME(callcache);
|
|
||||||
#undef IMEMO_NAME
|
|
||||||
default: UNREACHABLE;
|
|
||||||
}
|
|
||||||
APPENDF((BUFF_ARGS, "<%s> ", imemo_name));
|
|
||||||
|
|
||||||
switch (imemo_type(obj)) {
|
switch (imemo_type(obj)) {
|
||||||
case imemo_ment: {
|
case imemo_ment: {
|
||||||
|
@ -150,6 +150,7 @@ VALUE rb_imemo_new_debug(enum imemo_type type, VALUE v1, VALUE v2, VALUE v3, VAL
|
|||||||
#else
|
#else
|
||||||
VALUE rb_imemo_new(enum imemo_type type, VALUE v1, VALUE v2, VALUE v3, VALUE v0);
|
VALUE rb_imemo_new(enum imemo_type type, VALUE v1, VALUE v2, VALUE v3, VALUE v0);
|
||||||
#endif
|
#endif
|
||||||
|
const char *rb_imemo_name(enum imemo_type type);
|
||||||
RUBY_SYMBOL_EXPORT_END
|
RUBY_SYMBOL_EXPORT_END
|
||||||
|
|
||||||
static inline enum imemo_type
|
static inline enum imemo_type
|
||||||
|
Loading…
x
Reference in New Issue
Block a user