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
next prev parent 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