www.digitalmars.com         C & C++   DMDScript  

digitalmars.D - getting line number in templates

reply Daniel Ribeiro Maciel <daniel.maciel gmail.com> writes:
Hello!

I'm wondering if it's possible to design an exception class that would know in
which line it ocurred. Without passing __LINE__ argument to it, obviosly.

Another thing I was wondering is if it would be possible for it to
automatically know which function threw it, and through which functions it
went. Does the new compile time reflection allows it?

Is that what's necessary to create a stack trace print with line numbers?

Cheers.
Jul 23 2007
parent Lutger <lutger.blijdestijn gmail.com> writes:
Daniel Ribeiro Maciel wrote:
 Hello!
 
 I'm wondering if it's possible to design an exception class that would know in
which line it ocurred. Without passing __LINE__ argument to it, obviosly.

I have used this template to accomplish something similar: char[] _enforce(T)(char[] cond, char[] msg) { return std.metastrings.Format! ( `if (!(%s)) throw new %s ("%s: %s (in " ~ %s ~ " at " ~ %s ~ ")";`, cond, T.stringof, cond, msg, `__FILE__`, `ToString!(__LINE__)` ); } to use it, instantiate it with a specific exception: alias _enforce!(XException) xEnforce; and in code: mixin(xEnforce(`x > 0 && x < 10`, "out of range")); The nice thing is that it will reproduce the code you check for an exception (`x > 0 && x < 10`), but a mixin is required. How to get the function string is something that I would like to know too, if it's possible. I'd think DMD needs a __FUNCTION__
Jul 24 2007