Fix range of --backtrace-limit
Also an option command line should have precedence over `RUBYOPT`.
This commit is contained in:
parent
92cf14b4c5
commit
cc0fca2729
Notes:
git
2023-08-10 16:57:09 +00:00
@ -23,7 +23,7 @@ typedef struct ruby_cmdline_options {
|
|||||||
ruby_features_t features;
|
ruby_features_t features;
|
||||||
ruby_features_t warn;
|
ruby_features_t warn;
|
||||||
unsigned int dump;
|
unsigned int dump;
|
||||||
int backtrace_length_limit;
|
long backtrace_length_limit;
|
||||||
#if USE_RJIT
|
#if USE_RJIT
|
||||||
struct rb_rjit_options rjit;
|
struct rb_rjit_options rjit;
|
||||||
#endif
|
#endif
|
||||||
|
20
ruby.c
20
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 *
|
static ruby_cmdline_options_t *
|
||||||
cmdline_options_init(ruby_cmdline_options_t *opt)
|
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)
|
#elif defined(YJIT_FORCE_ENABLE)
|
||||||
opt->features.set |= FEATURE_BIT(yjit);
|
opt->features.set |= FEATURE_BIT(yjit);
|
||||||
#endif
|
#endif
|
||||||
opt->backtrace_length_limit = -1;
|
opt->backtrace_length_limit = LONG_MIN;
|
||||||
|
|
||||||
return opt;
|
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;
|
VALUE int_enc_name = opt->intern.enc.name;
|
||||||
ruby_features_t feat = opt->features;
|
ruby_features_t feat = opt->features;
|
||||||
ruby_features_t warn = opt->warn;
|
ruby_features_t warn = opt->warn;
|
||||||
int backtrace_length_limit = opt->backtrace_length_limit;
|
|
||||||
|
|
||||||
while (ISSPACE(*s)) s++;
|
while (ISSPACE(*s)) s++;
|
||||||
if (!*s) return;
|
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->features, feat);
|
||||||
FEATURE_SET_RESTORE(opt->warn, warn);
|
FEATURE_SET_RESTORE(opt->warn, warn);
|
||||||
if (backtrace_length_limit >= 0) {
|
|
||||||
opt->backtrace_length_limit = backtrace_length_limit;
|
|
||||||
}
|
|
||||||
|
|
||||||
ruby_xfree(ptr);
|
ruby_xfree(ptr);
|
||||||
/* get rid of GC */
|
/* 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)) {
|
else if (is_option_with_arg("backtrace-limit", Qfalse, Qtrue)) {
|
||||||
char *e;
|
char *e;
|
||||||
long n = strtol(s, &e, 10);
|
long n = strtol(s, &e, 10);
|
||||||
if (errno == ERANGE || n < -1 || *e) rb_raise(rb_eRuntimeError, "wrong limit for backtrace length");
|
if (errno == ERANGE || !BACKTRACE_LENGTH_LIMIT_VALID_P(n) || *e) {
|
||||||
opt->backtrace_length_limit = (int)n;
|
rb_raise(rb_eRuntimeError, "wrong limit for backtrace length");
|
||||||
|
}
|
||||||
|
else if (!OPT_BACKTRACE_LENGTH_LIMIT_VALID_P(opt)) {
|
||||||
|
opt->backtrace_length_limit = n;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
rb_raise(rb_eRuntimeError,
|
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->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;
|
rb_backtrace_length_limit = opt->backtrace_length_limit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -84,9 +84,14 @@ class TestRubyOptions < Test::Unit::TestCase
|
|||||||
/^\t \.{3} \d+ levels\.{3}\n/])
|
/^\t \.{3} \d+ levels\.{3}\n/])
|
||||||
assert_kind_of(Integer, Thread::Backtrace.limit)
|
assert_kind_of(Integer, Thread::Backtrace.limit)
|
||||||
assert_in_out_err(%w(--backtrace-limit=1), "p Thread::Backtrace.limit", ['1'], [])
|
assert_in_out_err(%w(--backtrace-limit=1), "p Thread::Backtrace.limit", ['1'], [])
|
||||||
|
assert_in_out_err(%w(--backtrace-limit 1), "p Thread::Backtrace.limit", ['1'], [])
|
||||||
env = {"RUBYOPT" => "--backtrace-limit=5"}
|
env = {"RUBYOPT" => "--backtrace-limit=5"}
|
||||||
assert_in_out_err([env], "p Thread::Backtrace.limit", ['5'], [])
|
assert_in_out_err([env], "p Thread::Backtrace.limit", ['5'], [])
|
||||||
assert_in_out_err([env, "--backtrace-limit=1"], "p Thread::Backtrace.limit", ['1'], [])
|
assert_in_out_err([env, "--backtrace-limit=1"], "p Thread::Backtrace.limit", ['1'], [])
|
||||||
|
assert_in_out_err([env, "--backtrace-limit=-1"], "p Thread::Backtrace.limit", ['-1'], [])
|
||||||
|
long_max = RbConfig::LIMITS["LONG_MAX"]
|
||||||
|
assert_in_out_err(%W(--backtrace-limit=#{long_max}), "p Thread::Backtrace.limit",
|
||||||
|
["#{long_max}"], [])
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_warning
|
def test_warning
|
||||||
|
Loading…
x
Reference in New Issue
Block a user