summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--include/mruby/error.h5
-rw-r--r--mrbgems/mruby-time/src/time.c27
-rw-r--r--src/backtrace.c12
3 files changed, 27 insertions, 17 deletions
diff --git a/include/mruby/error.h b/include/mruby/error.h
index 0d5b93c7c..a715eb0b6 100644
--- a/include/mruby/error.h
+++ b/include/mruby/error.h
@@ -26,8 +26,9 @@ MRB_API mrb_value mrb_exc_new_str(mrb_state *mrb, struct RClass* c, mrb_value st
#define mrb_exc_new_lit(mrb, c, lit) mrb_exc_new_str(mrb, c, mrb_str_new_lit(mrb, lit))
#define mrb_exc_new_str_lit(mrb, c, lit) mrb_exc_new_lit(mrb, c, lit)
MRB_API mrb_value mrb_make_exception(mrb_state *mrb, mrb_int argc, const mrb_value *argv);
-MRB_API mrb_value mrb_exc_backtrace(mrb_state *mrb, mrb_value exc);
-MRB_API mrb_value mrb_get_backtrace(mrb_state *mrb);
+mrb_value mrb_exc_backtrace(mrb_state *mrb, mrb_value exc);
+mrb_value mrb_get_backtrace(mrb_state *mrb);
+
MRB_API mrb_noreturn void mrb_no_method_error(mrb_state *mrb, mrb_sym id, mrb_value args, const char *fmt, ...);
/* declaration for `fail` method */
diff --git a/mrbgems/mruby-time/src/time.c b/mrbgems/mruby-time/src/time.c
index 907e3fcd2..22dec2e65 100644
--- a/mrbgems/mruby-time/src/time.c
+++ b/mrbgems/mruby-time/src/time.c
@@ -461,22 +461,29 @@ time_mktime(mrb_state *mrb, mrb_int ayear, mrb_int amonth, mrb_int aday,
time_t nowsecs;
struct tm nowtime = { 0 };
- nowtime.tm_year = (int)ayear - 1900;
- nowtime.tm_mon = (int)amonth - 1;
+#if MRB_INT_MAX > INT_MAX
+#define OUTINT(x) (INT_MIN > (x) || (x) > INT_MAX)
+#else
+#define OUTINT(x) 0
+#endif
+
+ if (OUTINT(ayear-1900) ||
+ amonth < 1 || amonth > 12 ||
+ aday < 1 || aday > 31 ||
+ ahour < 0 || ahour > 24 ||
+ (ahour == 24 && (amin > 0 || asec > 0)) ||
+ amin < 0 || amin > 59 ||
+ asec < 0 || asec > 60)
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "argument out of range");
+
+ nowtime.tm_year = (int)(ayear - 1900);
+ nowtime.tm_mon = (int)(amonth - 1);
nowtime.tm_mday = (int)aday;
nowtime.tm_hour = (int)ahour;
nowtime.tm_min = (int)amin;
nowtime.tm_sec = (int)asec;
nowtime.tm_isdst = -1;
- if (nowtime.tm_mon < 0 || nowtime.tm_mon > 11
- || nowtime.tm_mday < 1 || nowtime.tm_mday > 31
- || nowtime.tm_hour < 0 || nowtime.tm_hour > 24
- || (nowtime.tm_hour == 24 && (nowtime.tm_min > 0 || nowtime.tm_sec > 0))
- || nowtime.tm_min < 0 || nowtime.tm_min > 59
- || nowtime.tm_sec < 0 || nowtime.tm_sec > 60)
- mrb_raise(mrb, E_ARGUMENT_ERROR, "argument out of range");
-
if (timezone == MRB_TIMEZONE_UTC) {
nowsecs = timegm(&nowtime);
}
diff --git a/src/backtrace.c b/src/backtrace.c
index 61d606869..0acc43a66 100644
--- a/src/backtrace.c
+++ b/src/backtrace.c
@@ -33,6 +33,7 @@ static void
each_backtrace(mrb_state *mrb, ptrdiff_t ciidx, each_backtrace_func func, void *data)
{
ptrdiff_t i;
+ int n = 0;
if (ciidx >= mrb->c->ciend - mrb->c->cibase)
ciidx = 10; /* ciidx is broken... */
@@ -61,6 +62,7 @@ each_backtrace(mrb_state *mrb, ptrdiff_t ciidx, each_backtrace_func func, void *
idx = (uint32_t)(pc - irep->iseq);
loc.lineno = mrb_debug_get_line(mrb, irep, idx);
+ if (n++ == 0 && loc.lineno == -1) continue;
loc.filename = mrb_debug_get_filename(mrb, irep, idx);
if (!loc.filename) {
@@ -195,6 +197,7 @@ mrb_unpack_backtrace(mrb_state *mrb, mrb_value backtrace)
bt = (struct backtrace_location*)mrb_data_check_get_ptr(mrb, backtrace, &bt_type);
if (bt == NULL) goto empty_backtrace;
n = (mrb_int)RDATA(backtrace)->flags;
+ if (n == 0) goto empty_backtrace;
backtrace = mrb_ary_new_capa(mrb, n);
ai = mrb_gc_arena_save(mrb);
for (i = 0; i < n; i++) {
@@ -218,19 +221,18 @@ mrb_unpack_backtrace(mrb_state *mrb, mrb_value backtrace)
return backtrace;
}
-MRB_API mrb_value
+mrb_value
mrb_exc_backtrace(mrb_state *mrb, mrb_value exc)
{
- mrb_sym attr_name;
mrb_value backtrace;
- attr_name = MRB_SYM(backtrace);
- backtrace = mrb_iv_get(mrb, exc, attr_name);
+ backtrace = mrb_iv_get(mrb, exc, MRB_SYM(backtrace));
if (mrb_nil_p(backtrace) || mrb_array_p(backtrace)) {
return backtrace;
}
+ /* unpack packed-backtrace */
backtrace = mrb_unpack_backtrace(mrb, backtrace);
- mrb_iv_set(mrb, exc, attr_name, backtrace);
+ mrb_iv_set(mrb, exc, MRB_SYM(backtrace), backtrace);
return backtrace;
}