From bdfc5eba7d7fbbea0a72ebcb67130576d1f69794 Mon Sep 17 00:00:00 2001 From: Chris Seaton Date: Fri, 1 Jul 2022 18:06:32 +0000 Subject: [PATCH] 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 bf4f22ab975b15..e350e0f7e0433a 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"-" \