aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFred Fish <fnf@specifix.com>1993-01-21 18:13:55 +0000
committerFred Fish <fnf@specifix.com>1993-01-21 18:13:55 +0000
commitfcbadaee94dcdcc47eb623ce1c41f2bf92719e42 (patch)
tree724eb840af8417b004d4585538b81cd8d62c0a0f
parent2c320e35984957fbca00f3bad8cea39bc75f4c49 (diff)
downloadfsf-binutils-gdb-fcbadaee94dcdcc47eb623ce1c41f2bf92719e42.zip
fsf-binutils-gdb-fcbadaee94dcdcc47eb623ce1c41f2bf92719e42.tar.gz
fsf-binutils-gdb-fcbadaee94dcdcc47eb623ce1c41f2bf92719e42.tar.bz2
* 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 ****
-rw-r--r--gdb/ch-exp.y3
-rw-r--r--gdb/ch-lang.c1
-rw-r--r--gdb/gdbtypes.h1
-rw-r--r--gdb/language.c28
4 files changed, 31 insertions, 2 deletions
diff --git a/gdb/ch-exp.y b/gdb/ch-exp.y
index 35fb2fe..cb17086 100644
--- a/gdb/ch-exp.y
+++ b/gdb/ch-exp.y
@@ -759,7 +759,7 @@ operand_3 : 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 '[':
diff --git a/gdb/ch-lang.c b/gdb/ch-lang.c
index d02d330..78a2067 100644
--- a/gdb/ch-lang.c
+++ b/gdb/ch-lang.c
@@ -259,6 +259,7 @@ static const struct op_print chill_op_print_tab[] = {
{"-", BINOP_SUB, PREC_ADD, 0},
{"*", BINOP_MUL, PREC_MUL, 0},
{"/", BINOP_DIV, PREC_MUL, 0},
+ {"//", BINOP_CONCAT, PREC_PREFIX, 0}, /* FIXME: precedence? */
{"-", UNOP_NEG, PREC_PREFIX, 0},
{NULL, 0, 0, 0}
};
diff --git a/gdb/gdbtypes.h b/gdb/gdbtypes.h
index 6da24ce..da4fdff 100644
--- a/gdb/gdbtypes.h
+++ b/gdb/gdbtypes.h
@@ -82,6 +82,7 @@ enum type_code
TYPE_CODE_SET, /* Pascal sets */
TYPE_CODE_RANGE, /* Range (integers within spec'd bounds) */
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 */
/* C++ */
diff --git a/gdb/language.c b/gdb/language.c
index 44aea1e..c5306bb 100644
--- a/gdb/language.c
+++ b/gdb/language.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 */
int
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);
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 */
case UNOP_LOGICAL_NOT: