diff options
author | Alan Wu <XrXr@users.noreply.github.com> | 2020-07-09 18:37:03 -0400 |
---|---|---|
committer | Alan Wu <XrXr@users.noreply.github.com> | 2020-07-10 22:42:35 -0400 |
commit | cbf52087a2d4ac3c2db698ddc5b0b023f6bb2eca (patch) | |
tree | 842ed5b35d025abc47e54f47c54d7ead80397b1b | |
parent | 021cec938af55a7ef368eadc99a6e3ff2252510e (diff) | |
download | ruby-cbf52087a2d4ac3c2db698ddc5b0b023f6bb2eca.tar.gz |
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.
-rw-r--r-- | ext/objspace/objspace_dump.c | 24 | ||||
-rw-r--r-- | gc.c | 45 | ||||
-rw-r--r-- | internal/imemo.h | 1 |
3 files changed, 27 insertions, 43 deletions
diff --git a/ext/objspace/objspace_dump.c b/ext/objspace/objspace_dump.c index 7dd0731c43..95bd8ac8dd 100644 --- a/ext/objspace/objspace_dump.c +++ b/ext/objspace/objspace_dump.c @@ -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 dump_object(VALUE obj, struct dump_config *dc) { @@ -251,7 +229,7 @@ dump_object(VALUE obj, struct dump_config *dc) return; 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; case T_SYMBOL: @@ -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, \ 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 VALUE @@ -11662,26 +11686,7 @@ rb_raw_obj_info(char *buff, const int buff_size, VALUE obj) break; } case T_IMEMO: { - const char *imemo_name = "\0"; - 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)); + APPENDF((BUFF_ARGS, "<%s> ", rb_imemo_name(imemo_type(obj)))); switch (imemo_type(obj)) { case imemo_ment: { diff --git a/internal/imemo.h b/internal/imemo.h index 812b2a42ca..29318f10cd 100644 --- a/internal/imemo.h +++ b/internal/imemo.h @@ -150,6 +150,7 @@ VALUE rb_imemo_new_debug(enum imemo_type type, VALUE v1, VALUE v2, VALUE v3, VAL #else VALUE rb_imemo_new(enum imemo_type type, VALUE v1, VALUE v2, VALUE v3, VALUE v0); #endif +const char *rb_imemo_name(enum imemo_type type); RUBY_SYMBOL_EXPORT_END static inline enum imemo_type |