Re: MI: type prefixes for values

Vladimir Prus
2006-02-17T10:29:50Z

On Friday 17 February 2006 13:22, Eli Zaretskii wrote:
> > From: Vladimir Prus <ghost@cs.msu.su>
> > Date: Fri, 17 Feb 2006 12:08:32 +0300
> >
> > some time ago I've raised the question why MI output sometimes prefixes
> > variable values with it's type. For example:
> >
> > -data-evaluate-expression *p3
> > ^done,value="{int (int)} 0xb7ee6e9c <__DTOR_END__+4>"
> > (gdb)
> >
> > (note the {int (int)} part). The part does not make sense for a GUI and
> > must be removed by a specially written code.
> >
> > See:
> >
> > http://article.gmane.org/gmane.comp.gdb.devel/13477
>
> And you were answered in that thread that this prefix is to show you
> the signature of a function to which p3 is a pointer. That is, GDB is
> telling you that p3 points to a function which accepts a single int
> argument and returns an int.
>
> > In the end, I've inquired why such prefixes cannot be dropped:
> >
> > http://article.gmane.org/gmane.comp.gdb.devel/13539
>
> Are you saying that you don't want to show your users the fact that
> the pointed object is a function?

At the very least, not in the way that gdb assumes. The type prefix is removed
the from variable value shown to the user.

> > I imagine it's a simple matter of wrapping some code in
> > "ui_output_is_mi_like_p". Can somebody comment on this proposal?
>
> I think this will lose useful information. So for now I object.

You can get the type information via the -var-info-type, which is more formal
way to get this information. A frontend is in position to call -var-info-type
as needed and make UI presentation decision based on that as it likes.

With mandatory "{}" prefix frontend should make special efforts to remove that
part, which is not formally documented.

> > Also, I note that gdb is currently inconsitent even within itself:
> >
> > (gdb)
> > -thread-select 2
> > ^done,new-thread-id="2",frame={level="0",func="thread",
> > args=[{name="p",value="0x0"}],..........
> > (gdb)
> > -stack-list-arguments 1 0 0
> > ^done,stack-args=[frame={level="0",
> > args=[{name="p",value="(void *) 0x0"}]}]
> >
> > Note that first output has "0x0" as value of 'p', and the second has
> > "(void *)0x0".
>
> Also, the first one shows the func= part, the second doesn't.

Heh, the second is not supposed to show func= part at all. MI does not have a
command equivalent to "backtrace". One has to list -stack-list-frames (that
does include func=) and -stack-list-arguments (that includes only argument).
BTW, not very convenient.

> Looks
> like a bug to me: those two should both use the same code.

Should I file a bug?

- Volodya