From dbbc3583ba432c279f07b1fa0afb0a8a9ba50c91 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Thu, 13 Jul 2023 17:08:55 +0900 Subject: [PATCH] Preserve already set options in `moreswitches` --- ruby.c | 35 ++++++++++++++++++++--------------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/ruby.c b/ruby.c index 479f8c4857..b63b330b01 100644 --- a/ruby.c +++ b/ruby.c @@ -887,6 +887,14 @@ moreswitches(const char *s, ruby_cmdline_options_t *opt, int envopt) VALUE argstr, argary; void *ptr; + VALUE src_enc_name = opt->src.enc.name; + VALUE ext_enc_name = opt->ext.enc.name; + VALUE int_enc_name = opt->intern.enc.name; + ruby_features_t feat = opt->features; + ruby_features_t warn = opt->warn; + + opt->src.enc.name = opt->ext.enc.name = opt->intern.enc.name = 0; + while (ISSPACE(*s)) s++; if (!*s) return; argstr = rb_str_tmp_new((len = strlen(s)) + (envopt!=0)); @@ -922,6 +930,18 @@ moreswitches(const char *s, ruby_cmdline_options_t *opt, int envopt) } } + if (src_enc_name) { + opt->src.enc.name = src_enc_name; + } + if (ext_enc_name) { + opt->ext.enc.name = ext_enc_name; + } + if (int_enc_name) { + opt->intern.enc.name = int_enc_name; + } + FEATURE_SET_RESTORE(opt->features, feat); + FEATURE_SET_RESTORE(opt->warn, warn); + ruby_xfree(ptr); /* get rid of GC */ rb_str_resize(argary, 0); @@ -2003,22 +2023,7 @@ process_options(int argc, char **argv, ruby_cmdline_options_t *opt) argv += i; if (FEATURE_SET_P(opt->features, rubyopt) && (s = getenv("RUBYOPT"))) { - VALUE src_enc_name = opt->src.enc.name; - VALUE ext_enc_name = opt->ext.enc.name; - VALUE int_enc_name = opt->intern.enc.name; - ruby_features_t feat = opt->features; - ruby_features_t warn = opt->warn; - - opt->src.enc.name = opt->ext.enc.name = opt->intern.enc.name = 0; moreswitches(s, opt, 1); - if (src_enc_name) - opt->src.enc.name = src_enc_name; - if (ext_enc_name) - opt->ext.enc.name = ext_enc_name; - if (int_enc_name) - opt->intern.enc.name = int_enc_name; - FEATURE_SET_RESTORE(opt->features, feat); - FEATURE_SET_RESTORE(opt->warn, warn); } if (opt->src.enc.name)