Wiki Roadmap Timeline Tickets New Ticket Source Search Help / Guide About Trac Login

Changeset 1196:6c31351af0c5

Show
Ignore:
Timestamp:
04/05/09 09:02:44 (3 years ago)
Author:
Christian Kamm <kamm incasoftware de>
branch:
default
Message:

Apply fawzi's stacktracing update from #254.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • runtime/internal/genobj.d

    r1130 r1196  
    4747    import util.string; 
    4848    import tango.stdc.stdio;  // : printf, snprintf; 
     49    import tango.core.Version; 
    4950 
    5051    extern (C) void onOutOfMemoryError(); 
     
    906907class Exception : Object 
    907908{ 
    908     struct FrameInfo{ 
    909         long line; 
    910         ptrdiff_t iframe; 
    911         ptrdiff_t offset; 
    912         size_t address; 
    913         char[] file; 
    914         char[] func; 
    915         char[256] charBuf; 
    916         void writeOut(void delegate(char[])sink){ 
    917             char[25] buf; 
    918             sink(func); 
    919             auto len = snprintf(buf.ptr,buf.length,"@%zx ",address); 
    920             sink(buf[0..len]); 
    921             len = snprintf(buf.ptr,buf.length," %+td ",address); 
    922             sink(buf[0..len]); 
    923             if (file.length != 0 || line) { 
     909    static if (Tango.Minor > 998) { 
     910        struct FrameInfo{ 
     911            long line; 
     912            size_t iframe; 
     913            ptrdiff_t offsetSymb; 
     914            size_t baseSymb; 
     915            ptrdiff_t offsetImg; 
     916            size_t baseImg; 
     917            size_t address; 
     918            char[] file; 
     919            char[] func; 
     920            char[] extra; 
     921            bool exactAddress; 
     922            bool internalFunction; 
     923            void writeOut(void delegate(char[])sink){ 
     924                char[25] buf; 
     925                if (func.length) { 
     926                    sink(func); 
     927                } else { 
     928                    sink("???"); 
     929                } 
     930                auto len=sprintf(buf.ptr,"@%zx",baseSymb); 
     931                sink(buf[0..len]); 
     932                len=sprintf(buf.ptr,"%+td ",offsetSymb); 
     933                sink(buf[0..len]); 
     934                if (extra.length){ 
     935                    sink(extra); 
     936                    sink(" "); 
     937                } 
    924938                sink(file); 
    925                 len = snprintf(buf.ptr,buf.length,":%ld",line); 
     939                len=sprintf(buf.ptr,":%ld ",line); 
     940                sink(buf[0..len]); 
     941                len=sprintf(buf.ptr,"%zx",baseImg); 
     942                sink(buf[0..len]); 
     943                len=sprintf(buf.ptr,"%+td ",offsetImg); 
     944                sink(buf[0..len]); 
     945                len=sprintf(buf.ptr,"[%zx]",address); 
    926946                sink(buf[0..len]); 
    927947            } 
    928         } 
    929     } 
    930     interface TraceInfo 
    931     { 
    932         int opApply( int delegate( ref FrameInfo fInfo ) ); 
     948            void clear(){ 
     949                line=0; 
     950                iframe=-1; 
     951                offsetImg=0; 
     952                baseImg=0; 
     953                offsetSymb=0; 
     954                baseSymb=0; 
     955                address=0; 
     956                exactAddress=true; 
     957                internalFunction=false; 
     958                file=null; 
     959                func=null; 
     960                extra=null; 
     961            } 
     962        } 
     963        interface TraceInfo 
     964        { 
     965            int opApply( int delegate( ref FrameInfo fInfo ) ); 
     966            void writeOut(void delegate(char[])sink); 
     967        } 
     968    } else static if (Tango.Minor == 998) { 
     969        struct FrameInfo{ 
     970            long line; 
     971            ptrdiff_t iframe; 
     972            ptrdiff_t offset; 
     973            size_t address; 
     974            char[] file; 
     975            char[] func; 
     976            char[256] charBuf; 
     977            void writeOut(void delegate(char[])sink){ 
     978                char[25] buf; 
     979                sink(func); 
     980                auto len = snprintf(buf.ptr,buf.length,"@%zx ",address); 
     981                sink(buf[0..len]); 
     982                len = snprintf(buf.ptr,buf.length," %+td ",address); 
     983                sink(buf[0..len]); 
     984                if (file.length != 0 || line) { 
     985                    sink(file); 
     986                    len = snprintf(buf.ptr,buf.length,":%ld",line); 
     987                    sink(buf[0..len]); 
     988                } 
     989            } 
     990        } 
     991        interface TraceInfo 
     992        { 
     993            int opApply( int delegate( ref FrameInfo fInfo ) ); 
     994        } 
     995    } else { 
     996        static assert(0, "Don't know FrameInfo, TraceInfo definition for Tango < 0.99.8"); 
    933997    } 
    934998 
Copyright © 2008, LDC Development Team.