Mercurial > projects > ldc
changeset 1126:899a2d90645b
Fix some issues with fawzi's patch.
- It now actually compiles:
- import stdc.stdio for string formatting functions)
- remove extra '{'
- Use snprintf() instead of sprintf().
- Use return value from snprintf instead of strlen().
- Don't print the filename in Exception.writeOut() if it has zero length and
the line number is 0
(It would previously only skip these if the filename was null, but not if it
was a different empty string)
- Ignore empty filename + line number 0 in FrameInfo.writeOut() as well.
author | Frits van Bommel <fvbommel wxs.nl> |
---|---|
date | Wed, 18 Mar 2009 15:33:19 +0100 |
parents | 8208374e5bed |
children | 3e98925bcc39 |
files | runtime/internal/genobj.d |
diffstat | 1 files changed, 15 insertions(+), 13 deletions(-) [+] |
line wrap: on
line diff
--- a/runtime/internal/genobj.d Wed Mar 18 15:20:07 2009 +0100 +++ b/runtime/internal/genobj.d Wed Mar 18 15:33:19 2009 +0100 @@ -45,7 +45,7 @@ import tango.stdc.string; // : memcmp, memcpy, memmove; import tango.stdc.stdlib; // : calloc, realloc, free; import util.string; - debug(PRINTF) import tango.stdc.stdio; // : printf; + import tango.stdc.stdio; // : printf, snprintf; extern (C) void onOutOfMemoryError(); extern (C) Object _d_allocclass(ClassInfo ci); @@ -915,13 +915,15 @@ 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)]); + 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 @@ -947,7 +949,7 @@ this( char[] msg, Exception next=null ) { - this(msg,"",0,next,rt_createTraceContext(null)); + this(msg,null,0,next,rt_createTraceContext(null)); } this( char[] msg, char[] file, long line, Exception next=null ) @@ -961,15 +963,15 @@ } void writeOut(void delegate(char[])sink){ - if (file) + if (file.length != 0 || line) { char[25]buf; sink(this.classinfo.name); sink("@"); sink(file); sink("("); - sprintf(buf.ptr,"%ld",line); - sink(buf[0..strlen(buf.ptr)]); + auto len = snprintf(buf.ptr,buf.length,"%ld",line); + sink(buf[0..len]); sink("): "); sink(toString()); sink("\n"); @@ -1027,7 +1029,7 @@ * An object describing the current calling context or null if no handler is * supplied. */ -extern(C) Exception.TraceInfo rt_createTraceContext( void* ptr ){ +extern(C) Exception.TraceInfo rt_createTraceContext( void* ptr ) { if( traceHandler is null ) return null;