* eval.c (evaluate_subexp): Fix OP_ARRAY, remove code that
implied that "no side effects" was nonfunctional. * eval.c (evaluate_subexp): Add BINOP_CONCAT case to deal with character string and bitstring concatenation. * expprint.c (dump_expression): Add case for BINOP_CONCAT. * expression.h (exp_opcode): Add BINOP_CONCAT. * gdbtypes.h (type_code): Add TYPE_CODE_BITSTRING. * language.c (string_type): Add function to determine if a type is a string type. * language.c (binop_type_check): Add case for BINOP_CONCAT. * valarith.c (value_concat): New function to concatenate two values, such as character strings or bitstrings. * valops.c (value_string): Remove error stub and implement function body. * value.h (value_concat): Add prototype. **** start-sanitize-chill **** * ch-exp.y (operand_3): Add actions for SLASH_SLASH (//). * ch-exp.y (yylex): Recognize SLASH_SLASH. * ch-lang.c (chill_op_print_tab): Add SLASH_SLASH (//) as BINOP_CONCAT. **** end-sanitize-chill ****
This commit is contained in:
parent
2c320e3598
commit
fcbadaee94
4 changed files with 31 additions and 2 deletions
|
@ -759,7 +759,7 @@ operand_3 : operand_4
|
||||||
}
|
}
|
||||||
| operand_3 SLASH_SLASH operand_4
|
| operand_3 SLASH_SLASH operand_4
|
||||||
{
|
{
|
||||||
$$ = 0; /* FIXME */
|
write_exp_elt_opcode (BINOP_CONCAT);
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
|
@ -1778,7 +1778,6 @@ yylex ()
|
||||||
case '+':
|
case '+':
|
||||||
case '-':
|
case '-':
|
||||||
case '*':
|
case '*':
|
||||||
case '/':
|
|
||||||
case '(':
|
case '(':
|
||||||
case ')':
|
case ')':
|
||||||
case '[':
|
case '[':
|
||||||
|
|
|
@ -259,6 +259,7 @@ static const struct op_print chill_op_print_tab[] = {
|
||||||
{"-", BINOP_SUB, PREC_ADD, 0},
|
{"-", BINOP_SUB, PREC_ADD, 0},
|
||||||
{"*", BINOP_MUL, PREC_MUL, 0},
|
{"*", BINOP_MUL, PREC_MUL, 0},
|
||||||
{"/", BINOP_DIV, PREC_MUL, 0},
|
{"/", BINOP_DIV, PREC_MUL, 0},
|
||||||
|
{"//", BINOP_CONCAT, PREC_PREFIX, 0}, /* FIXME: precedence? */
|
||||||
{"-", UNOP_NEG, PREC_PREFIX, 0},
|
{"-", UNOP_NEG, PREC_PREFIX, 0},
|
||||||
{NULL, 0, 0, 0}
|
{NULL, 0, 0, 0}
|
||||||
};
|
};
|
||||||
|
|
|
@ -82,6 +82,7 @@ enum type_code
|
||||||
TYPE_CODE_SET, /* Pascal sets */
|
TYPE_CODE_SET, /* Pascal sets */
|
||||||
TYPE_CODE_RANGE, /* Range (integers within spec'd bounds) */
|
TYPE_CODE_RANGE, /* Range (integers within spec'd bounds) */
|
||||||
TYPE_CODE_STRING, /* String types, distinct from array of char */
|
TYPE_CODE_STRING, /* String types, distinct from array of char */
|
||||||
|
TYPE_CODE_BITSTRING, /* String of bits, distinct from bool array */
|
||||||
TYPE_CODE_ERROR, /* Unknown type */
|
TYPE_CODE_ERROR, /* Unknown type */
|
||||||
|
|
||||||
/* C++ */
|
/* C++ */
|
||||||
|
|
|
@ -666,6 +666,28 @@ character_type (type)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Returns non-zero if the value is a string type */
|
||||||
|
int
|
||||||
|
string_type (type)
|
||||||
|
struct type *type;
|
||||||
|
{
|
||||||
|
switch(current_language->la_language)
|
||||||
|
{
|
||||||
|
/* start-sanitize-chill */
|
||||||
|
case language_chill:
|
||||||
|
/* end-sanitize-chill */
|
||||||
|
case language_m2:
|
||||||
|
return TYPE_CODE(type) != TYPE_CODE_STRING ? 0 : 1;
|
||||||
|
|
||||||
|
case language_c:
|
||||||
|
case language_cplus:
|
||||||
|
/* C does not have distinct string type. */
|
||||||
|
return (0);
|
||||||
|
default:
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Returns non-zero if the value is a boolean type */
|
/* Returns non-zero if the value is a boolean type */
|
||||||
int
|
int
|
||||||
boolean_type (type)
|
boolean_type (type)
|
||||||
|
@ -871,6 +893,12 @@ binop_type_check(arg1,arg2,op)
|
||||||
type_op_error ("Arguments to %s must be of the same type.",op);
|
type_op_error ("Arguments to %s must be of the same type.",op);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case BINOP_CONCAT:
|
||||||
|
if (!(string_type(t1) || character_type(t1))
|
||||||
|
|| !(string_type(t2) || character_type(t2)))
|
||||||
|
type_op_error ("Arguments to %s must be strings or characters.", op);
|
||||||
|
break;
|
||||||
|
|
||||||
/* Unary checks -- arg2 is null */
|
/* Unary checks -- arg2 is null */
|
||||||
|
|
||||||
case UNOP_LOGICAL_NOT:
|
case UNOP_LOGICAL_NOT:
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue