6#define write_warn(str, x) \
7 (NIL_P(str) ? warn_print(x) : (void)rb_str_cat_cstr(str, x))
8#define write_warn2(str, x, l) \
9 (NIL_P(str) ? warn_print2(x, l) : (void)rb_str_cat(str, x, l))
10#ifdef HAVE_BUILTIN___BUILTIN_CONSTANT_P
11#define warn_print(x) RB_GNUC_EXTENSION_BLOCK( \
12 (__builtin_constant_p(x)) ? \
13 rb_write_error2((x), (long)strlen(x)) : \
17#define warn_print(x) rb_write_error(x)
20#define warn_print2(x,l) rb_write_error2((x),(l))
22#define write_warn_str(str,x) NIL_P(str) ? rb_write_error_str(x) : (void)rb_str_concat((str), (x))
23#define warn_print_str(x) rb_write_error_str(x)
25static VALUE error_pos_str(
void);
30 VALUE pos = error_pos_str();
42 if (!
NIL_P(sourcefile)) {
44 if (sourceline == 0) {
49 sourcefile, sourceline,
86 const char *beg =
ptr;
87 const long olen =
len;
89 unsigned char c = *
ptr;
91 case '\n':
case '\t':
continue;
106 else if (c ==
'\\') {
123#define CSI_BEGIN "\033["
133 const char *einfo =
"";
171 const char *tail = 0;
176 if ((tail =
memchr(einfo,
'\n', elen)) != 0) {
177 write_warnq(
str, emesg, einfo, tail - einfo);
181 write_warnq(
str, emesg, einfo, elen);
195 if (tail && einfo+elen > tail) {
197 write_warnq(
str, emesg, tail, einfo+elen-tail);
201 elen -= tail - einfo;
204 tail =
memchr(einfo,
'\n', elen);
205 if (!tail || tail > einfo) {
207 write_warnq(
str, emesg, einfo, tail ? tail-einfo : elen);
214 elen -= tail - einfo;
216 do ++tail;
while (tail < einfo+elen && *tail ==
'\n');
217 write_warnq(
str, emesg, einfo, tail-einfo);
218 elen -= tail - einfo;
237 const int threshold = 1000000000;
239 ((
len - 1) / threshold) :
241 (
len < threshold ? 0 : 9) + 1);
243#define TRACE_MAX (TRACE_HEAD+TRACE_TAIL+5)
247 for (
i = 1;
i <
len;
i++) {
266shown_cause_p(
VALUE cause,
VALUE *shown_causes)
268 VALUE shown = *shown_causes;
282 !shown_cause_p(cause, shown_causes)) {
287 show_cause(cause,
str, highlight, reverse, shown_causes);
288 print_backtrace(eclass, errat,
str,
TRUE);
289 print_errinfo(eclass, errat, emesg,
str, highlight!=0);
292 print_errinfo(eclass, errat, emesg,
str, highlight!=0);
293 print_backtrace(eclass, errat,
str,
FALSE);
294 show_cause(cause,
str, highlight, reverse, shown_causes);
302 volatile VALUE eclass;
303 VALUE shown_causes = 0;
314 if (
NIL_P(reverse)) reverse = tty;
315 if (
NIL_P(highlight)) highlight = tty;
318 static const char traceback[] =
"Traceback "
319 "(most recent call last):\n";
321 char buff[
sizeof(traceback)+
sizeof(bold)+
sizeof(reset)-2], *p = buff;
322 const char *msg = traceback;
323 long len =
sizeof(traceback) - 1;
325#define APPEND(s, l) (memcpy(p, s, l), p += (l))
326 APPEND(bold,
sizeof(bold)-1);
327 APPEND(traceback, bold_part);
328 APPEND(reset,
sizeof(reset)-1);
329 APPEND(traceback + bold_part,
sizeof(traceback)-bold_part-1);
331 len = p - (msg = buff);
334 show_cause(errinfo,
str, highlight, reverse, &shown_causes);
335 print_backtrace(eclass, errat,
str,
TRUE);
336 print_errinfo(eclass, errat, emesg,
str, highlight!=0);
339 print_errinfo(eclass, errat, emesg,
str, highlight!=0);
340 print_backtrace(eclass, errat,
str,
FALSE);
341 show_cause(errinfo,
str, highlight, reverse, &shown_causes);
351 volatile bool written =
false;
376#define undef_mesg_for(v, k) rb_fstring_lit("undefined"v" method `%1$s' for "k" `%2$s'")
377#define undef_mesg(v) ( \
379 undef_mesg_for(v, "module") : \
380 undef_mesg_for(v, "class"))
404#define inaccessible_mesg_for(v, k) rb_fstring_lit("method `%1$s' for "k" `%2$s' is "v)
405#define inaccessible_mesg(v) ( \
407 inaccessible_mesg_for(v, "module") : \
408 inaccessible_mesg_for(v, "class"))
432#define unknown_longjmp_status(status) \
433 rb_bug("Unknown longjmp status %d", status)
465 warn_print(
"retry outside of rescue clause\n");
475 status = sysexit_status(errinfo);
char str[HTML_ESCAPE_MAX_LEN+1]
void rb_ec_error_print(rb_execution_context_t *volatile ec, volatile VALUE errinfo)
#define inaccessible_mesg(v)
#define write_warn(str, x)
void rb_print_undef(VALUE klass, ID id, rb_method_visibility_t visi)
#define write_warn_str(str, x)
void rb_print_inaccessible(VALUE klass, ID id, rb_method_visibility_t visi)
void rb_print_undef_str(VALUE klass, VALUE name)
#define write_warn2(str, x, l)
#define unknown_longjmp_status(status)
ID rb_frame_callee(void)
The name of the current method.
VALUE rb_get_backtrace(VALUE info)
void rb_error_write(VALUE errinfo, VALUE emesg, VALUE errat, VALUE str, VALUE highlight, VALUE reverse)
VALUE rb_get_message(VALUE exc)
VALUE rb_exc_set_backtrace(VALUE exc, VALUE bt)
VALUE rb_obj_hide(VALUE obj)
Make the object invisible from Ruby code.
VALUE rb_obj_is_instance_of(VALUE, VALUE)
Determines if obj is an instance of c.
VALUE rb_obj_is_kind_of(VALUE, VALUE)
Determines if obj is a kind of c.