aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWu Zhou <woodzltc@cn.ibm.com>2005-07-06 06:52:25 +0000
committerWu Zhou <woodzltc@cn.ibm.com>2005-07-06 06:52:25 +0000
commitbd49c137fee8212c7e64ce62cc07d398b1278b14 (patch)
tree1e41f9c36b171df9b614b3e443aaee1fbbe020ab
parenta0c5fbcf0e1c6fdb3672d3bfc071b1a57a7b27bf (diff)
downloadgdb-bd49c137fee8212c7e64ce62cc07d398b1278b14.zip
gdb-bd49c137fee8212c7e64ce62cc07d398b1278b14.tar.gz
gdb-bd49c137fee8212c7e64ce62cc07d398b1278b14.tar.bz2
* f-exp.y (yyparse): Add code to support exponentiation expression.
(yylex): Add code to scan exponentiation operator. * eval.c (evaluate_subexp_standard): Add support for BINOP_EXP. * valarith.c (value_binop): Reset errno to 0 before calling pow to do exponentiation operation.
-rw-r--r--gdb/ChangeLog8
-rw-r--r--gdb/eval.c1
-rw-r--r--gdb/f-exp.y20
-rw-r--r--gdb/valarith.c31
4 files changed, 43 insertions, 17 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index aaa0420..8fda4dd 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,11 @@
+2005-07-06 Wu Zhou <woodzltc@cn.ibm.com>
+
+ * f-exp.y (yyparse): Add code to support exponentiation expression.
+ (yylex): Add code to scan exponentiation operator.
+ * eval.c (evaluate_subexp_standard): Add support for BINOP_EXP.
+ * valarith.c (value_binop): Reset errno to 0 before calling pow
+ to do exponentiation operation.
+
2005-07-04 Mark Kettenis <kettenis@gnu.org>
* i386nbsd-nat.c (i386nbsd_supply_pcb): Cast to 'gdb_byte *' in
diff --git a/gdb/eval.c b/gdb/eval.c
index 29622ce..58e77d3 100644
--- a/gdb/eval.c
+++ b/gdb/eval.c
@@ -1510,6 +1510,7 @@ evaluate_subexp_standard (struct type *expect_type,
else
return value_sub (arg1, arg2);
+ case BINOP_EXP:
case BINOP_MUL:
case BINOP_DIV:
case BINOP_REM:
diff --git a/gdb/f-exp.y b/gdb/f-exp.y
index a066c5a..0deb816 100644
--- a/gdb/f-exp.y
+++ b/gdb/f-exp.y
@@ -1,6 +1,6 @@
/* YACC parser for Fortran expressions, for GDB.
- Copyright 1986, 1989, 1990, 1991, 1993, 1994, 1995, 1996, 2000, 2001
- Free Software Foundation, Inc.
+ Copyright 1986, 1989, 1990, 1991, 1993, 1994, 1995, 1996, 2000, 2001,
+ 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
Contributed by Motorola. Adapted from the C parser by Farooq Butt
(fmbutt@engage.sps.mot.com).
@@ -217,6 +217,7 @@ static int parse_number (char *, int, int, YYSTYPE *);
%left '@'
%left '+' '-'
%left '*' '/' '%'
+%right STARSTAR
%right UNARY
%right '('
@@ -315,6 +316,10 @@ exp : exp '@' exp
{ write_exp_elt_opcode (BINOP_REPEAT); }
;
+exp : exp STARSTAR exp
+ { write_exp_elt_opcode (BINOP_EXP); }
+ ;
+
exp : exp '*' exp
{ write_exp_elt_opcode (BINOP_MUL); }
;
@@ -941,7 +946,7 @@ yylex ()
}
}
- /* See if it is a special .foo. operator */
+ /* See if it is a special .foo. operator. */
for (i = 0; dot_ops[i].operator != NULL; i++)
if (strncmp (tokstart, dot_ops[i].operator, strlen (dot_ops[i].operator)) == 0)
@@ -951,6 +956,15 @@ yylex ()
return dot_ops[i].token;
}
+ /* See if it is an exponentiation operator. */
+
+ if (strncmp (tokstart, "**", 2) == 0)
+ {
+ lexptr += 2;
+ yylval.opcode = BINOP_EXP;
+ return STARSTAR;
+ }
+
switch (c = *tokstart)
{
case 0:
diff --git a/gdb/valarith.c b/gdb/valarith.c
index 54a7fc6..ef03fb9 100644
--- a/gdb/valarith.c
+++ b/gdb/valarith.c
@@ -791,11 +791,12 @@ value_binop (struct value *arg1, struct value *arg2, enum exp_opcode op)
v = v1 / v2;
break;
- case BINOP_EXP:
- v = pow (v1, v2);
- if (errno)
- error (_("Cannot perform exponentiation: %s"), safe_strerror (errno));
- break;
+ case BINOP_EXP:
+ errno = 0;
+ v = pow (v1, v2);
+ if (errno)
+ error (_("Cannot perform exponentiation: %s"), safe_strerror (errno));
+ break;
default:
error (_("Integer-only operation on floating point number."));
@@ -929,11 +930,12 @@ value_binop (struct value *arg1, struct value *arg2, enum exp_opcode op)
v = v1 / v2;
break;
- case BINOP_EXP:
- v = pow (v1, v2);
- if (errno)
- error (_("Cannot perform exponentiation: %s"), safe_strerror (errno));
- break;
+ case BINOP_EXP:
+ errno = 0;
+ v = pow (v1, v2);
+ if (errno)
+ error (_("Cannot perform exponentiation: %s"), safe_strerror (errno));
+ break;
case BINOP_REM:
v = v1 % v2;
@@ -1050,10 +1052,11 @@ value_binop (struct value *arg1, struct value *arg2, enum exp_opcode op)
error (_("Division by zero"));
break;
- case BINOP_EXP:
- v = pow (v1, v2);
- if (errno)
- error (_("Cannot perform exponentiation: %s"), safe_strerror (errno));
+ case BINOP_EXP:
+ errno = 0;
+ v = pow (v1, v2);
+ if (errno)
+ error (_("Cannot perform exponentiation: %s"), safe_strerror (errno));
break;
case BINOP_REM: