typedef enum {true = (1==1),false = (0==1)} bool;
void nit_exit(int);
+void nit_abort(const char*, const char*, const char*, int);
#define CALL(r,c) ((VAL2VFT(r)[c].f))
#define ATTR(r,c) (*(val_t*)(VAL2OBJ(r)+c))
}
exit(i);
}
+
+void nit_abort(const char* s, const char* msg, const char* loc, int line) {
+ fprintf(stderr, s, msg);
+ fprintf(stderr, " (%s", loc);
+ if (line != 0) fprintf(stderr, ":%d", line);
+ fprintf(stderr, ")\n");
+ nit_exit(1);
+}
do
v.add_location(location)
var w = v.new_instr
- w.add("fprintf(stderr")
- for t in texts do
- w.add(", \"")
- w.add(t)
+ w.add("nit_abort(\"")
+ w.add(texts[0])
+ if texts.length > 1 then
+ w.add("\", \"")
+ w.add(texts[1])
w.add("\"")
+ else
+ w.add("\", NULL")
end
- w.add(");\n")
-
- var ll = location
- w = v.new_instr
- w.add("fprintf(stderr, \" (%s")
- if ll != null then
- w.add(":%d")
- end
- w.add(")\\n\", LOCATE_")
+ w.add(", LOCATE_")
w.add(module_location.name.to_s)
+ var ll = location
if ll != null then
w.add(", ")
w.add(ll.line_start.to_s)
+ else
+ w.add(", 0")
end
w.add(");\n")
-
- v.add_instr("nit_exit(1);")
end
end