On 07/19/2012 11:27 PM, Maciej Stachowiak wrote:
On Jul 10, 2012, at 8:52 AM, Brady Eidson<beid...@apple.com>  wrote:

On Jul 10, 2012, at 5:25 AM, Alexis Menard<alexis.men...@openbossa.org>  wrote:

On Mon, Jul 9, 2012 at 6:53 PM, Brady Eidson<beid...@apple.com>  wrote:
On Jul 9, 2012, at 2:43 PM, Alexis Menard<alexis.men...@openbossa.org>  wrote:

Hi,

For those who "secretly" use printf debugging :). I know the
recommended way is to use a debugger and it's not the point of this
discussion.
A lot of us do this, and sometimes it's necessary.  I agree with the gripe and 
support adding something easier.

So I propose wtf() and its stream operator.

Usage :

wtf()<<"Hello"<<"World"<<3<<4.53322323; will output : Hello World 3 4.53322
There is no reason to bring in stream operators - that are willfully absent 
from WebCore - just for debugging.

But it's really nice for that purpose, and somehow match std::cout
And we quite purposefully don't use std::cout in the project.

Overloading functions works just as well.
I'm not sure to understand what you mean hereā€¦
I mean relying on C++'s overloading of functions for the different types you'd 
like to printf debug.

void debug(WebCore::String&);
void debug(WebCore::Frame*);
void debug(WebCore::Node*);

etc etc etc.

debug(someFrame);
debug(someNode);
debug(someString);

Especially that last one would help me from remembering how to type "printf("%s", 
someString.utf8().data())" which is all I've ever really wanted.
In principle, we could also have this support multiple arguments, so you could 
write:

debug("frame: ", someFrame, " node: ", someNode, " string", someString);

This would be no more verbose than the<<  style, but could compile to a single 
function call at the call site and therefore could be relatively compact. I would 
find this easier to deal with than a unary function or a printf-style format string. 
The way you'd do this is by defining template functions which call a unary overloaded 
function for each argument:

template<typename A, typename B>  debug(A a, B b)
{
     debug(a);
     debug(b);
}

template<typename A, typename B, typename C>  debug(A a, B b, C c)
{
     debug(a);
     debug(b);
     debug(c);
}

template<typename A, typename B, typename C, typename D>  debug(A a, B b, C c, 
D d)
{
     debug(a);
     debug(b);
     debug(c);
     debug(d);
}

... and so on up to some reasonable number of arguments.


But neither these compile to a single function call. Or we could define simple inline debug() overrides but we could also do that with the stream operator. And anyway, if the actual calls are not supposed to land than it doesn't matter how compact it is. For me the stream operator is a bit nicer.

-kbalazs
_______________________________________________
webkit-dev mailing list
webkit-dev@lists.webkit.org
http://lists.webkit.org/mailman/listinfo/webkit-dev

Reply via email to