On Jun 5, 2008, at 5:21 AM, Tom wrote:
How will I find ou where the problem occured inside a die handler in XS? Something like call stack when the exception occured.
I got the Perl stack into error messages by wrapping a callback to Carp::confess(). In a perfect world we'd get the C stack in there too, but oh well.
If you want portability, you have to special case things depending on whether variadic macros are available. Assuming that they are, in ISO- style, and also that the ISO-style __func__ macro is available, this works:
#define CONFESS(...) \ confess_at(__FILE__, __LINE__, __func__, __VA_ARGS__) void confess_at(const char *file, int line, const char *func, const char *pat, ...) { va_list args; SV *error_sv = newSVpvf("Error in function %s at %s:%d: ", func, file, line); va_start(args, pat); sv_vcatpvf(error_sv, pat, &args); va_end(args); sv_catpvn(error_sv, "\n\t", 2); do_confess(error_sv); } void do_confess(SV *error_sv) { dSP; ENTER; SAVETMPS; PUSHMARK(SP); XPUSHs( sv_2mortal(error_sv) ); PUTBACK; call_pv("Carp::confess", G_DISCARD); FREETMPS; LEAVE; } Marvin Humphrey Rectangular Research http://www.rectangular.com/