Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Andrew Cagney <ac131313@redhat.com>
To: Paul Hilfinger <hilfingr@gnat.com>
Cc: gdb-patches@sources.redhat.com
Subject: Re: RFA: Changes to allow extensions to operator set
Date: Thu, 11 Sep 2003 18:55:00 -0000	[thread overview]
Message-ID: <3F60C50F.5040704@redhat.com> (raw)
In-Reply-To: <20030906111343.5F98DF2B63@nile.gnat.com>

>> [Where] is a method to handle operator evaluation missing?  Otherwize won't 
>>  the jumbo switch in evaluate_subexp_standard still need to be modified 
>> as languages add additional operators.
> 
> 
> Not so.  The language vector already contains
> 
>     /* Evaluate an expression. */
>     struct value *(*evaluate_exp) (struct type *, struct expression *,
> 				   int *, enum noside);

Ah.  Is ada doing anything special with that - something that will bite 
later?  Looking at the existing languages - they appear to simply be 
overriding select operators but nothing more.

> In short, you want to object orient these suckers.  Well as a matter
> of fact, I actually implemented something along these lines in an earlier
> iteration. It certainly can be made to work.  However,

Yes.

> 1. To do it consistently requires a much more extensive and somewhat
>    tedious change to the existing machinery (which works well enough)
>    giving me even more opportunities to overlook something ("overlook" 
>    == "screw up").

True.  Need to look for baby steps.

> 2. For example, to really do it up brown you'd want to modify all the
>    .y files so that instead of emitting the integer codes directly, as they
>    do now, there'd be operator-specific emission routines for parsing, so
>    that, e.g., sequences like
> 
>         write_exp_elt_opcode (OP_FUNCALL);
> 	write_exp_elt_longcst ((LONGEST) end_arglist ());
> 	write_exp_elt_opcode (OP_FUNCALL); }
> 
>    became
> 
>         OP_FUNCALL->write_exp_longest ((LONGEST) end_arglist ());
> 
>    or some such thing.

Yes, eventually.  In an as yet un-scheduled future round.

> 3. Personally, I find that this is one of those gray cases where the OOP 
>    style gains little in clarity.  That is, we have choice of writing (A) an
>    enumeration type and a few big functions of the form
> 
>       <type> <func> (<args>) {
>          <prologue>
>          switch (<op>) {
>          case A:
> 	   <A code>
>          case B:
> 	   <B code>
>          }
>       }

This, I think, is easier short term.

>    and of writing (B) LOTS of little functions of the form 
> 
>       <type> <func_X> (<args>) {
>          <prologue>
>          <X code>
>       }

This, I think, is easier long term - it's clear exactly which methods 
need to be implemented to make the new object functional - no chasing 
after all those switch statements to figure out if/where each needs to 
be changed.

It took me some time to understand why the OO style really was better 
and how come Java omiting enum's was a good thing.

>    plus a big dispatch vector (of struct operators, in your case) naming them.
>    Perhaps I am overinterpreting your suggestion, but I see a lot of effort
>    for little gain in clarity (maybe <0) in going from the current style (A) 
>    to style (B). In fact, for these reasons, I went so far as to tear up my
>    original, more bject-oriented version of this extension mechanism and
>    go back to the mechanism I submitted, as a simpler and more conservative
>    solution.

sed would quickly create the initial table.

> Now if and when David Carlton gets his way and we eventually re-do GDB
> in C++, it might be time to revisit this decision, since C++ would
> remove the tedious table building and welter of names.

Not if, when.  GDB's beeing re-done OO regardless of the C++ schedule.

Can you please move evaluate_exp to the new expresion descriptor (is 
anything else missing?); modify:

> +    OP_OBJC_NSSTRING,
> +
> +     /* First extension operator.  Individual language modules define
> +        extra operators they need as constants with values 
> +        OP_LANGUAGE_SPECIFIC0 + k, for k >= 0, using a separate 
> +        enumerated type definition:
> +           enum foo_extension_operator {
> +             BINOP_MOGRIFY = OP_EXTENDED0,
> + 	     BINOP_FROB,
> + 	     ...
> +           };      */
> +      OP_EXTENDED0,
> +  
> +     /* Last possible extension operator.  Defined simply to specify a
> +        minimum range for the representation. */
> +     OP_EXTENDED_LAST = 0xff

to provide a an explicit and finite number of extended operators 
OP_EXTENDED_0, OP_EXTENDED_1, ... (I'm assuming Ada will contain enum { 
OP_ADA_... = OP_EXTENDED_0, ... }); add a note that this is an interum 
and it will go away.

Andrew



  reply	other threads:[~2003-09-11 18:55 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2003-09-01  9:39 Paul Hilfinger
2003-09-04  2:18 ` Andrew Cagney
2003-09-05  8:32   ` Paul Hilfinger
2003-09-05 15:57 ` Andrew Cagney
2003-09-05 16:23 ` Andrew Cagney
2003-09-06 11:13   ` Paul Hilfinger
2003-09-11 18:55     ` Andrew Cagney [this message]
2003-09-13  8:58       ` Paul Hilfinger
2003-09-18  9:20       ` Paul Hilfinger
2003-09-22 17:04         ` Andrew Cagney
2003-09-05 16:29 ` Andrew Cagney

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=3F60C50F.5040704@redhat.com \
    --to=ac131313@redhat.com \
    --cc=gdb-patches@sources.redhat.com \
    --cc=hilfingr@gnat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox