Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Paul Hilfinger <hilfingr@gnat.com>
To: ac131313@redhat.com
Cc: gdb-patches@sources.redhat.com
Subject: Re: RFA: Changes to allow extensions to operator set
Date: Sat, 06 Sep 2003 11:13:00 -0000	[thread overview]
Message-ID: <20030906111343.5F98DF2B63@nile.gnat.com> (raw)
In-Reply-To: <3F58B874.7020904@redhat.com> (message from Andrew Cagney on Fri, 05 Sep 2003 12:23:16 -0400)


> [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);

Let me make clear that we do have an existence proof that the changes
I submitted suffice, since we have used them (in patches still to
come) to extend the operator set with the extra Ada operators WITHOUT
extensions to expression.h, expprint.c, etc.  So if something is
missing, it can't be all that much.

> I was thinking more of

> struct operator
> {
>    const char *name;
>    void (*length) (struct expression *exp, struct operator *op, ?others?);
>    int (*eval) (...);
> ...
> };

> struct exp_descriptor
> {
>    int num_oper;
>    const struct operator *op; // is **op easier?
> ...

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,

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").

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.

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>
         }
      }

   and of writing (B) LOTS of little functions of the form 

      <type> <func_X> (<args>) {
         <prologue>
         <X code>
      }

   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.

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.

Paul 


  reply	other threads:[~2003-09-06 11:13 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 [this message]
2003-09-11 18:55     ` Andrew Cagney
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=20030906111343.5F98DF2B63@nile.gnat.com \
    --to=hilfingr@gnat.com \
    --cc=ac131313@redhat.com \
    --cc=gdb-patches@sources.redhat.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