Apply fawzi's patch from #235.

This has some issues which are addressed in my next commit.
This commit is contained in:
Frits van Bommel
2009-03-18 15:20:07 +01:00
parent 434cb74980
commit e847f60fb1
2 changed files with 69 additions and 31 deletions

View File

@@ -905,9 +905,28 @@ class TypeInfo_Tuple : TypeInfo
class Exception : Object
{
struct FrameInfo{
long line;
ptrdiff_t offset;
size_t address;
char[] file;
char[] func;
char[256] charBuf;
void writeOut(void delegate(char[])sink){
char[25] buf;
sink(func);
sprintf(buf.ptr,"@%zx ",address);
sink(buf[0..strlen(buf.ptr)]);
sprintf(buf.ptr," %+td ",address);
sink(buf[0..strlen(buf.ptr)]);
sink(file);
sprintf(buf.ptr,":%ld",line);
sink(buf[0..strlen(buf.ptr)]);
}
}
interface TraceInfo
{
int opApply( int delegate( inout char[] ) );
int opApply( int delegate( ref FrameInfo fInfo ) );
}
char[] msg;
@@ -916,25 +935,65 @@ class Exception : Object
TraceInfo info;
Exception next;
this( char[] msg, Exception next = null )
this( char[] msg, char[] file, long line, Exception next, TraceInfo info )
{
// main constructor, breakpoint this if you want...
this.msg = msg;
this.next = next;
this.info = traceContext();
this.file = file;
this.line = cast(size_t)line;
this.info = info;
}
this( char[] msg, char[] file, size_t line, Exception next = null )
this( char[] msg, Exception next=null )
{
this(msg, next);
this.file = file;
this.line = line;
this.info = traceContext();
this(msg,"",0,next,rt_createTraceContext(null));
}
this( char[] msg, char[] file, long line, Exception next=null )
{
this(msg,file,line,next,rt_createTraceContext(null));
}
char[] toString()
{
return msg;
}
void writeOut(void delegate(char[])sink){
if (file)
{
char[25]buf;
sink(this.classinfo.name);
sink("@");
sink(file);
sink("(");
sprintf(buf.ptr,"%ld",line);
sink(buf[0..strlen(buf.ptr)]);
sink("): ");
sink(toString());
sink("\n");
}
else
{
sink(this.classinfo.name);
sink(": ");
sink(toString);
sink("\n");
}
if (info)
{
sink("----------------\n");
foreach (ref t; info){
t.writeOut(sink);
sink("\n");
}
}
if (next){
sink("\n");
next.writeOut(sink);
}
}
}
@@ -968,7 +1027,7 @@ extern (C) void rt_setTraceHandler( TraceHandler h )
* An object describing the current calling context or null if no handler is
* supplied.
*/
Exception.TraceInfo traceContext( void* ptr = null )
extern(C) Exception.TraceInfo rt_createTraceContext( void* ptr ){
{
if( traceHandler is null )
return null;