summaryrefslogtreecommitdiff
path: root/ruby.c
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2023-07-13 17:08:55 +0900
committerNobuyoshi Nakada <nobu@ruby-lang.org>2023-07-13 22:59:26 +0900
commitdbbc3583ba432c279f07b1fa0afb0a8a9ba50c91 (patch)
tree7621b8c145594d30d2093f964caf18868cb23d47 /ruby.c
parent1c2a4d9682decf3fc56fe16470b51f7290f2ae1c (diff)
Preserve already set options in `moreswitches`
Notes
Notes: Merged: https://github.com/ruby/ruby/pull/8068
Diffstat (limited to 'ruby.c')
-rw-r--r--ruby.c35
1 files 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)