Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Joel Brobecker <brobecker@adacore.com>
To: Pierre Muller <muller@ics.u-strasbg.fr>
Cc: 'Eli Zaretskii' <eliz@gnu.org>, gdb-patches@sourceware.org
Subject: Re: [RFA] Handle BINOP_INTDIV in valarith.c
Date: Wed, 23 Jan 2008 23:09:00 -0000	[thread overview]
Message-ID: <20080123230929.GC3979@adacore.com> (raw)
In-Reply-To: <001b01c85e10$48a8aa40$d9f9fec0$@u-strasbg.fr>

>   I wrote the floatdiv version, which allows me to easily force the
>   conversion to double formats for left and right operand:

Right, but you are doing the conversion inside what I call "core-gdb",
which is a language-independent file. As a result, you ended up needing
a new operator.  But the creation of this new operator would not be
necessary if you handled BINOP_DIV in a pascal-specific way.

>    maybe 
>    || (op == BINOP_DIV && current_language = language_pascal))

That's not the proper way of doing this. What you need to do is to
setup your language to have a pascal-specific expression evaluator.
Right now, it's set to use the "standard" expression evaluator which
(IIRC) is the C evaluator.  Your pascal expression evaluator will
defer back to the standard expression evaluator most of the time,
except for the case when the binary operator is FLOAT_DIV.  In this
case, you'll do the division yourself.

You can have a look at ada-lang.c:ada_evaluate_subexp(). It's a large
routine because of a lot of stuff is special to Ada, but you'll also
see:

  op = exp->elts[pc].opcode;
  [...]
  switch (op)
    {
    default:
      *pos -= 1;
      arg1 = evaluate_subexp_standard (expect_type, exp, pos, noside);
    [...]
    case BINOP_DIV:
      arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
      arg2 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
      if (noside == EVAL_SKIP)
        goto nosideret;
      else if (noside == EVAL_AVOID_SIDE_EFFECTS
               && (op == BINOP_DIV || op == BINOP_REM || op == BINOP_MOD))
        return value_zero (value_type (arg1), not_lval);
      else
        {
          if (ada_is_fixed_point_type (value_type (arg1)))
            arg1 = cast_from_fixed_to_double (arg1);
          if (ada_is_fixed_point_type (value_type (arg2)))
            arg2 = cast_from_fixed_to_double (arg2);
          return ada_value_binop (arg1, arg2, op);
        }

If you look at the "default:" case, you'll see that we let
the standard evaluator do the work for us. But we treat the
BINOP_DIV case specially: First we evaluate each side of our
division, and then perform the division and return the result.

This ada_evaluate_subexp routine is setup in the language through
the exp_descriptor structure.

-- 
Joel


  reply	other threads:[~2008-01-23 23:09 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-01-16 14:14 Pierre Muller
2008-01-16 19:11 ` Eli Zaretskii
2008-01-21 10:45   ` Pierre Muller
2008-01-23 18:25     ` Joel Brobecker
2008-01-23 22:36       ` Pierre Muller
2008-01-23 23:09         ` Joel Brobecker [this message]
2008-01-23 23:55           ` Pierre Muller
2008-01-24  1:30             ` Joel Brobecker
2008-01-23 19:07     ` Tom Tromey
2008-01-23 23:00       ` Pierre Muller
2008-01-24  0:27         ` Tom Tromey
2008-01-17 11:58 ` Joel Brobecker
2008-01-17 12:04   ` Joel Brobecker
2008-01-18 16:27     ` Eli Zaretskii
2008-01-21 15:04       ` Pierre Muller
2008-01-25 13:07       ` [RFA] Handle BINOP_INTDIV in eval.c Pierre Muller
2008-01-30  1:01         ` Daniel Jacobowitz
2008-01-30  7:35           ` Pierre Muller

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=20080123230929.GC3979@adacore.com \
    --to=brobecker@adacore.com \
    --cc=eliz@gnu.org \
    --cc=gdb-patches@sourceware.org \
    --cc=muller@ics.u-strasbg.fr \
    /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