* eval.c (language.h): Include.

* eval.c (evaluate_subexp_with_coercion):  Only coerce arrays
	to pointer types when the current language is C.  It loses for
	other languages when the lower index bound is nonzero.
	* valarith.c (value_subscript):  Take array lower bounds into
	account when performing subscripting operations.
	* valops.c (value_coerce_array):  Add comment describing why
	arrays with nonzero lower bounds are dealt with in value_subscript,
	rather than in value_coerce_array.
This commit is contained in:
Fred Fish 1993-01-03 22:24:21 +00:00
parent 191395156c
commit fb6e675f95
3 changed files with 51 additions and 10 deletions

View File

@ -1,3 +1,15 @@
Sun Jan 3 14:16:10 1993 Fred Fish (fnf@cygnus.com)
* eval.c (language.h): Include.
* eval.c (evaluate_subexp_with_coercion): Only coerce arrays
to pointer types when the current language is C. It loses for
other languages when the lower index bound is nonzero.
* valarith.c (value_subscript): Take array lower bounds into
account when performing subscripting operations.
* valops.c (value_coerce_array): Add comment describing why
arrays with nonzero lower bounds are dealt with in value_subscript,
rather than in value_coerce_array.
Sat Jan 2 12:16:41 1993 Fred Fish (fnf@cygnus.com) Sat Jan 2 12:16:41 1993 Fred Fish (fnf@cygnus.com)
**** start-sanitize-chill **** **** start-sanitize-chill ****

View File

@ -24,6 +24,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#include "expression.h" #include "expression.h"
#include "target.h" #include "target.h"
#include "frame.h" #include "frame.h"
#include "language.h" /* For CAST_IS_CONVERSION */
/* Values of NOSIDE argument to eval_subexp. */ /* Values of NOSIDE argument to eval_subexp. */
enum noside enum noside
@ -1041,9 +1042,16 @@ evaluate_subexp_for_address (exp, pos, noside)
} }
/* Evaluate like `evaluate_subexp' except coercing arrays to pointers. /* Evaluate like `evaluate_subexp' except coercing arrays to pointers.
When used in contexts where arrays will be coerced anyway, When used in contexts where arrays will be coerced anyway, this is
this is equivalent to `evaluate_subexp' equivalent to `evaluate_subexp' but much faster because it avoids
but much faster because it avoids actually fetching array contents. */ actually fetching array contents.
Note that we currently only do the coercion for C expressions, where
arrays are zero based and the coercion is correct. For other languages,
with nonzero based arrays, coercion loses. Use CAST_IS_CONVERSION
to decide if coercion is appropriate.
*/
static value static value
evaluate_subexp_with_coercion (exp, pos, noside) evaluate_subexp_with_coercion (exp, pos, noside)
@ -1063,7 +1071,8 @@ evaluate_subexp_with_coercion (exp, pos, noside)
{ {
case OP_VAR_VALUE: case OP_VAR_VALUE:
var = exp->elts[pc + 1].symbol; var = exp->elts[pc + 1].symbol;
if (TYPE_CODE (SYMBOL_TYPE (var)) == TYPE_CODE_ARRAY) if (TYPE_CODE (SYMBOL_TYPE (var)) == TYPE_CODE_ARRAY
&& CAST_IS_CONVERSION)
{ {
(*pos) += 3; (*pos) += 3;
val = locate_var_value (var, (FRAME) 0); val = locate_var_value (var, (FRAME) 0);

View File

@ -104,17 +104,35 @@ an integer nor a pointer of the same type.");
return value_binop (arg1, arg2, BINOP_SUB); return value_binop (arg1, arg2, BINOP_SUB);
} }
/* Return the value of ARRAY[IDX]. */ /* Return the value of ARRAY[IDX].
See comments in value_coerce_array() for rationale for reason for
doing lower bounds adjustment here rather than there.
FIXME: Perhaps we should validate that the index is valid and if
verbosity is set, warn about invalid indices (but still use them). */
value value
value_subscript (array, idx) value_subscript (array, idx)
value array, idx; value array, idx;
{ {
if (TYPE_CODE (VALUE_TYPE (array)) == TYPE_CODE_ARRAY int lowerbound;
&& VALUE_LVAL (array) != lval_memory) value bound;
return value_subscripted_rvalue (array, idx); struct type *range_type;
else
return value_ind (value_add (array, idx)); if (TYPE_CODE (VALUE_TYPE (array)) == TYPE_CODE_ARRAY)
{
range_type = TYPE_FIELD_TYPE (VALUE_TYPE (array), 0);
lowerbound = TYPE_FIELD_BITPOS (range_type, 0);
if (lowerbound != 0)
{
bound = value_from_longest (builtin_type_int, (LONGEST) lowerbound);
idx = value_sub (idx, bound);
}
if (VALUE_LVAL (array) != lval_memory)
{
return value_subscripted_rvalue (array, idx);
}
}
return value_ind (value_add (array, idx));
} }
/* Return the value of EXPR[IDX], expr an aggregate rvalue /* Return the value of EXPR[IDX], expr an aggregate rvalue
@ -423,7 +441,9 @@ value_binop (arg1, arg2, op)
error ("Invalid operation on booleans."); error ("Invalid operation on booleans.");
} }
/* start-sanitize-chill (FIXME!) */
val = allocate_value (builtin_type_chill_bool); val = allocate_value (builtin_type_chill_bool);
/* end-sanitize-chill */
SWAP_TARGET_AND_HOST (&v, sizeof (v)); SWAP_TARGET_AND_HOST (&v, sizeof (v));
*(LONGEST *) VALUE_CONTENTS_RAW (val) = v; *(LONGEST *) VALUE_CONTENTS_RAW (val) = v;
} }