summaryrefslogtreecommitdiff
path: root/ruby.c
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2023-08-11 00:29:32 +0900
committerNobuyoshi Nakada <nobu@ruby-lang.org>2023-08-11 01:56:50 +0900
commitcc0fca2729368f5d5628829a329eb05a86728ace (patch)
treeb004d2d88341b6fa99be88996e58d3e1955dd71d /ruby.c
parent92cf14b4c5ba4d18140be870bbc5530d1d9e7140 (diff)
Fix range of `--backtrace-limit`
Also an option command line should have precedence over `RUBYOPT`.
Notes
Notes: Merged: https://github.com/ruby/ruby/pull/8200
Diffstat (limited to 'ruby.c')
-rw-r--r--ruby.c20
1 files changed, 12 insertions, 8 deletions
diff --git a/ruby.c b/ruby.c
index 2b2a91ecac..e96d5df99e 100644
--- a/ruby.c
+++ b/ruby.c
@@ -203,6 +203,10 @@ enum {
)
};
+#define BACKTRACE_LENGTH_LIMIT_VALID_P(n) ((n) >= -1)
+#define OPT_BACKTRACE_LENGTH_LIMIT_VALID_P(opt) \
+ BACKTRACE_LENGTH_LIMIT_VALID_P((opt)->backtrace_length_limit)
+
static ruby_cmdline_options_t *
cmdline_options_init(ruby_cmdline_options_t *opt)
{
@@ -217,7 +221,7 @@ cmdline_options_init(ruby_cmdline_options_t *opt)
#elif defined(YJIT_FORCE_ENABLE)
opt->features.set |= FEATURE_BIT(yjit);
#endif
- opt->backtrace_length_limit = -1;
+ opt->backtrace_length_limit = LONG_MIN;
return opt;
}
@@ -893,7 +897,6 @@ moreswitches(const char *s, ruby_cmdline_options_t *opt, int envopt)
VALUE int_enc_name = opt->intern.enc.name;
ruby_features_t feat = opt->features;
ruby_features_t warn = opt->warn;
- int backtrace_length_limit = opt->backtrace_length_limit;
while (ISSPACE(*s)) s++;
if (!*s) return;
@@ -944,9 +947,6 @@ moreswitches(const char *s, ruby_cmdline_options_t *opt, int envopt)
}
FEATURE_SET_RESTORE(opt->features, feat);
FEATURE_SET_RESTORE(opt->warn, warn);
- if (backtrace_length_limit >= 0) {
- opt->backtrace_length_limit = backtrace_length_limit;
- }
ruby_xfree(ptr);
/* get rid of GC */
@@ -1450,8 +1450,12 @@ proc_long_options(ruby_cmdline_options_t *opt, const char *s, long argc, char **
else if (is_option_with_arg("backtrace-limit", Qfalse, Qtrue)) {
char *e;
long n = strtol(s, &e, 10);
- if (errno == ERANGE || n < -1 || *e) rb_raise(rb_eRuntimeError, "wrong limit for backtrace length");
- opt->backtrace_length_limit = (int)n;
+ if (errno == ERANGE || !BACKTRACE_LENGTH_LIMIT_VALID_P(n) || *e) {
+ rb_raise(rb_eRuntimeError, "wrong limit for backtrace length");
+ }
+ else if (!OPT_BACKTRACE_LENGTH_LIMIT_VALID_P(opt)) {
+ opt->backtrace_length_limit = n;
+ }
}
else {
rb_raise(rb_eRuntimeError,
@@ -2335,7 +2339,7 @@ process_options(int argc, char **argv, ruby_cmdline_options_t *opt)
}
if (opt->dump & dump_exit_bits) return Qtrue;
- if (opt->backtrace_length_limit >= 0) {
+ if (OPT_BACKTRACE_LENGTH_LIMIT_VALID_P(opt)) {
rb_backtrace_length_limit = opt->backtrace_length_limit;
}