From e2ab3c91111e0ce42f1b17d652d2ae8bd76c7007 Mon Sep 17 00:00:00 2001 From: Chris Seaton Date: Fri, 1 Jul 2022 18:06:32 +0000 Subject: [PATCH 1/2] Dynamically create RUBY_DESCRIPTION based on runtime parameters --- template/fake.rb.in | 20 ++++++++++---------- version.c | 30 ++++++++++++++---------------- version.h | 13 +++++++------ 3 files changed, 31 insertions(+), 32 deletions(-) diff --git a/template/fake.rb.in b/template/fake.rb.in index aead377ed87387..42ddd86d2671c7 100644 --- a/template/fake.rb.in +++ b/template/fake.rb.in @@ -17,8 +17,8 @@ if inc = arg['i'] scan(/rb_define_global_const\("(RUBY_\w+)",[^;]*?\bMK(?:INT|STR)\(([^()]*)\)/m) do |n, v| version[n] = src.value(v) end - arg['RUBY_DESCRIPTION_WITH_MJIT'] = src.value('description_with_mjit') - arg['RUBY_DESCRIPTION_WITH_YJIT'] = src.value('description_with_yjit') + arg['RUBY_DESCRIPTION_PRE'] = src.value('description_pre') + arg['RUBY_DESCRIPTION_POST'] = src.value('description_post') end %>baseruby="<%=arg['BASERUBY']%>" _\ @@ -35,15 +35,15 @@ class Object CROSS_COMPILING = RUBY_PLATFORM constants.grep(/^RUBY_/) {|n| remove_const n} % arg['versions'].each {|n, v| - <%=n%> = <%if n=='RUBY_DESCRIPTION' %>case - when RubyVM.const_defined?(:MJIT) && RubyVM::MJIT.enabled? - <%=arg['RUBY_DESCRIPTION_WITH_MJIT'].inspect%> - when RubyVM.const_defined?(:YJIT) && RubyVM::YJIT.enabled? - <%=arg['RUBY_DESCRIPTION_WITH_YJIT'].inspect%> - else - <%=v.inspect%> - end<%else%><%=v.inspect%><%end%> + <%=n%> = <%=v.inspect%> % } + options = [] + if RubyVM.const_defined?(:MJIT) && RubyVM::MJIT.enabled? + options << ' +MJIT' + elsif RubyVM.const_defined?(:YJIT) && RubyVM::YJIT.enabled? + options << ' +YJIT' + end + RUBY_DESCRIPTION = (<%=arg['RUBY_DESCRIPTION_PRE'].inspect%> + options.join('') + <%=arg['RUBY_DESCRIPTION_POST'].inspect%>).freeze end builddir = File.dirname(File.expand_path(__FILE__)) srcdir = "<%=arg['srcdir']%>" diff --git a/version.c b/version.c index a628952907d93f..fbfe1c0d34dec8 100644 --- a/version.c +++ b/version.c @@ -41,12 +41,15 @@ const char ruby_revision[] = RUBY_FULL_REVISION; const char ruby_release_date[] = RUBY_RELEASE_DATE; const char ruby_platform[] = RUBY_PLATFORM; const int ruby_patchlevel = RUBY_PATCHLEVEL; -const char ruby_description[] = RUBY_DESCRIPTION_WITH(""); -static const char ruby_description_with_mjit[] = RUBY_DESCRIPTION_WITH(" +MJIT"); -static const char ruby_description_with_yjit[] = RUBY_DESCRIPTION_WITH(" +YJIT"); +const char ruby_description[] = RUBY_DESCRIPTION_PRE RUBY_DESCRIPTION_POST; +const char ruby_description_pre[] = RUBY_DESCRIPTION_PRE; +const char ruby_description_post[] = RUBY_DESCRIPTION_POST; const char ruby_copyright[] = RUBY_COPYRIGHT; const char ruby_engine[] = "ruby"; +// Enough space for any combination of option flags +static char ruby_dynamic_description_buffer[sizeof(ruby_description) + sizeof("+MJIT +YJIT") - 1]; + // Might change after initialization const char *rb_dynamic_description = ruby_description; @@ -104,24 +107,19 @@ Init_version(void) void Init_ruby_description(void) { - VALUE description; - - if (MJIT_OPTS_ON) { - rb_dynamic_description = ruby_description_with_mjit; - description = MKSTR(description_with_mjit); - } - else if (rb_yjit_enabled_p()) { - rb_dynamic_description = ruby_description_with_yjit; - description = MKSTR(description_with_yjit); - } - else { - description = MKSTR(description); + if (snprintf(ruby_dynamic_description_buffer, sizeof(ruby_dynamic_description_buffer), "%s%s%s%s", + ruby_description_pre, + MJIT_OPTS_ON ? " +MJIT" : "", + rb_yjit_enabled_p() ? " +YJIT" : "", + ruby_description_post) < 0) { + rb_bug("could not format dynamic description string"); } + rb_dynamic_description = ruby_dynamic_description_buffer; /* * The full ruby version string, like ruby -v prints */ - rb_define_global_const("RUBY_DESCRIPTION", /* MKSTR(description) */ description); + rb_define_global_const("RUBY_DESCRIPTION", rb_obj_freeze(rb_str_new2(rb_dynamic_description))); } void diff --git a/version.h b/version.h index 099860657668d0..86eff5f455ab8f 100644 --- a/version.h +++ b/version.h @@ -76,12 +76,13 @@ # define RUBY_RELEASE_DATETIME RUBY_RELEASE_DATE #endif -# define RUBY_DESCRIPTION_WITH(opt) \ - "ruby "RUBY_VERSION \ - RUBY_PATCHLEVEL_STR \ - " ("RUBY_RELEASE_DATETIME \ - RUBY_REVISION_STR")"opt" " \ - "["RUBY_PLATFORM"]" +# define RUBY_DESCRIPTION_PRE \ + "ruby "RUBY_VERSION \ + RUBY_PATCHLEVEL_STR \ + " ("RUBY_RELEASE_DATETIME \ + RUBY_REVISION_STR")" +# define RUBY_DESCRIPTION_POST \ + " ["RUBY_PLATFORM"]" # define RUBY_COPYRIGHT \ "ruby - Copyright (C) " \ RUBY_BIRTH_YEAR_STR"-" \ From 0bc1d6b9424cd9ec09db8d94f683b00f0059146b Mon Sep 17 00:00:00 2001 From: Chris Seaton Date: Fri, 1 Jul 2022 18:27:56 +0000 Subject: [PATCH 2/2] Add +MMTk to RUBY_DESCRIPTION and define GC::MMTk --- gc.c | 7 +++++++ template/fake.rb.in | 3 +++ version.c | 9 +++++++-- 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/gc.c b/gc.c index f7d267d8ee15c7..d71155399eb611 100644 --- a/gc.c +++ b/gc.c @@ -14394,6 +14394,9 @@ Init_GC(void) #undef rb_intern VALUE rb_mObjSpace; VALUE rb_mProfiler; +#ifdef USE_THIRD_PARTY_HEAP + VALUE rb_mMMTk; +#endif VALUE gc_constants; rb_mGC = rb_define_module("GC"); @@ -14485,6 +14488,10 @@ Init_GC(void) rb_define_singleton_method(rb_mGC, "remove_stress_to_class", rb_gcdebug_remove_stress_to_class, -1); #endif +#ifdef USE_THIRD_PARTY_HEAP + rb_mMMTk = rb_define_module_under(rb_mGC, "MMTk"); +#endif + { VALUE opts; /* GC build options */ diff --git a/template/fake.rb.in b/template/fake.rb.in index 42ddd86d2671c7..21ae7ef1de89c6 100644 --- a/template/fake.rb.in +++ b/template/fake.rb.in @@ -43,6 +43,9 @@ class Object elsif RubyVM.const_defined?(:YJIT) && RubyVM::YJIT.enabled? options << ' +YJIT' end + if GC.const_defined?(:MMTk) + options << ' +MMTk' + end RUBY_DESCRIPTION = (<%=arg['RUBY_DESCRIPTION_PRE'].inspect%> + options.join('') + <%=arg['RUBY_DESCRIPTION_POST'].inspect%>).freeze end builddir = File.dirname(File.expand_path(__FILE__)) diff --git a/version.c b/version.c index fbfe1c0d34dec8..cd3a322d525420 100644 --- a/version.c +++ b/version.c @@ -48,7 +48,7 @@ const char ruby_copyright[] = RUBY_COPYRIGHT; const char ruby_engine[] = "ruby"; // Enough space for any combination of option flags -static char ruby_dynamic_description_buffer[sizeof(ruby_description) + sizeof("+MJIT +YJIT") - 1]; +static char ruby_dynamic_description_buffer[sizeof(ruby_description) + sizeof("+MJIT +YJIT +MMTk") - 1]; // Might change after initialization const char *rb_dynamic_description = ruby_description; @@ -107,10 +107,15 @@ Init_version(void) void Init_ruby_description(void) { - if (snprintf(ruby_dynamic_description_buffer, sizeof(ruby_dynamic_description_buffer), "%s%s%s%s", + if (snprintf(ruby_dynamic_description_buffer, sizeof(ruby_dynamic_description_buffer), "%s%s%s%s%s", ruby_description_pre, MJIT_OPTS_ON ? " +MJIT" : "", rb_yjit_enabled_p() ? " +YJIT" : "", +#ifdef USE_THIRD_PARTY_HEAP + " +MMTk", +#else + "", +#endif ruby_description_post) < 0) { rb_bug("could not format dynamic description string"); }