# HG changeset patch # User Christian Kamm # Date 1238936564 -7200 # Node ID 6c31351af0c55d352801701f60fc59ae0517625f # Parent e961851fb8be6c9305d9330eb87c7cfa0132854a Apply fawzi's stacktracing update from #254. diff -r e961851fb8be -r 6c31351af0c5 runtime/internal/genobj.d --- a/runtime/internal/genobj.d Fri Apr 03 17:59:34 2009 +0200 +++ b/runtime/internal/genobj.d Sun Apr 05 15:02:44 2009 +0200 @@ -46,6 +46,7 @@ import tango.stdc.stdlib; // : calloc, realloc, free; import util.string; import tango.stdc.stdio; // : printf, snprintf; + import tango.core.Version; extern (C) void onOutOfMemoryError(); extern (C) Object _d_allocclass(ClassInfo ci); @@ -905,31 +906,94 @@ class Exception : Object { - struct FrameInfo{ - long line; - ptrdiff_t iframe; - ptrdiff_t offset; - size_t address; - char[] file; - char[] func; - char[256] charBuf; - void writeOut(void delegate(char[])sink){ - char[25] buf; - sink(func); - auto len = snprintf(buf.ptr,buf.length,"@%zx ",address); - sink(buf[0..len]); - len = snprintf(buf.ptr,buf.length," %+td ",address); - sink(buf[0..len]); - if (file.length != 0 || line) { + static if (Tango.Minor > 998) { + struct FrameInfo{ + long line; + size_t iframe; + ptrdiff_t offsetSymb; + size_t baseSymb; + ptrdiff_t offsetImg; + size_t baseImg; + size_t address; + char[] file; + char[] func; + char[] extra; + bool exactAddress; + bool internalFunction; + void writeOut(void delegate(char[])sink){ + char[25] buf; + if (func.length) { + sink(func); + } else { + sink("???"); + } + auto len=sprintf(buf.ptr,"@%zx",baseSymb); + sink(buf[0..len]); + len=sprintf(buf.ptr,"%+td ",offsetSymb); + sink(buf[0..len]); + if (extra.length){ + sink(extra); + sink(" "); + } sink(file); - len = snprintf(buf.ptr,buf.length,":%ld",line); + len=sprintf(buf.ptr,":%ld ",line); + sink(buf[0..len]); + len=sprintf(buf.ptr,"%zx",baseImg); + sink(buf[0..len]); + len=sprintf(buf.ptr,"%+td ",offsetImg); + sink(buf[0..len]); + len=sprintf(buf.ptr,"[%zx]",address); sink(buf[0..len]); } + void clear(){ + line=0; + iframe=-1; + offsetImg=0; + baseImg=0; + offsetSymb=0; + baseSymb=0; + address=0; + exactAddress=true; + internalFunction=false; + file=null; + func=null; + extra=null; + } } - } - interface TraceInfo - { - int opApply( int delegate( ref FrameInfo fInfo ) ); + interface TraceInfo + { + int opApply( int delegate( ref FrameInfo fInfo ) ); + void writeOut(void delegate(char[])sink); + } + } else static if (Tango.Minor == 998) { + struct FrameInfo{ + long line; + ptrdiff_t iframe; + ptrdiff_t offset; + size_t address; + char[] file; + char[] func; + char[256] charBuf; + void writeOut(void delegate(char[])sink){ + char[25] buf; + sink(func); + auto len = snprintf(buf.ptr,buf.length,"@%zx ",address); + sink(buf[0..len]); + len = snprintf(buf.ptr,buf.length," %+td ",address); + sink(buf[0..len]); + if (file.length != 0 || line) { + sink(file); + len = snprintf(buf.ptr,buf.length,":%ld",line); + sink(buf[0..len]); + } + } + } + interface TraceInfo + { + int opApply( int delegate( ref FrameInfo fInfo ) ); + } + } else { + static assert(0, "Don't know FrameInfo, TraceInfo definition for Tango < 0.99.8"); } char[] msg;