OSDN Git Service

* parser-defs.h (struct exp_descriptor): New definition, containing
authorhilfingr <hilfingr>
Thu, 25 Sep 2003 08:40:44 +0000 (08:40 +0000)
committerhilfingr <hilfingr>
Thu, 25 Sep 2003 08:40:44 +0000 (08:40 +0000)
language-specific info for printing, prefixifying, dumping, and
evaluating expressions.
(exp_descriptor_standard): Declare new variable.
(print_subexp): Make global and declare here (from expprint.c).
(dump_subexp): Ditto.
(dump_subexp_body_standard): Declare.
(operator_length_standard): Declare.
(op_name_standard): Declare.
(print_subexp): Declare.
(print_subexp_standard): Declare.

* language.h (struct language_defn): Add la_exp_desc field to hold
pointer to table for language-specific operators.
Remove evaluate_exp field, which is now in struct exp_descriptor.

* parse.c (operator_length): Move most code to new
operator_length_standard function.  Use language-specific information.
(operator_length_standard): New function taking most code from
operator_length.
(exp_descriptor_standard): New constant.

* expression.h (enum exp_opcode): Add definitions of OP_EXTENDED0
and OP_EXTENDED_LAST.

* expprint.c (print_subexp): Use language-specific print_subexp.
Make global; remove static declaration.
Move most code to print_subexp_standard.
(print_subexp_standard): New function, containing code formerly in
print_subexp.
(op_name): Add expression to argument signature.
Use langauge-specific op_name.
Move most code to op_name_standard.
(op_name_standard): New function, containing code formerly in op_name.
(dump_subexp):  Use new version of op_name function.
Use language-specific dump_subexp_body, and move most existing code to
dump_subexp_body_standard.
(dump_raw_expression): Use new op_name interface.
(dump_subexp_body): Move most code to dump_subexp_body_standard.
(dump_subexp_body_standard): New function, containing code formerly
in dump_subexp_body.

* language.c (unknown_language): Add default la_exp_desc field and
remove evaluate_exp field.
(auto_language): Ditto.
(local_language): Ditto.
* f-lang.c (f_language_defn): Ditto.
* c-lang.c (c_language_defn): Ditto.
(cplus_language_defn): Ditto.
(asm_language_defn): Ditto.
(minimal_language_defn): Ditto.
* p-lang.c (pascal_language_defn): Ditto.
* m2-lang.c (m2_language_defn): Ditto.
* objc-lang.c (objc_language_defn): Ditto.

* jv-lang.c (exp_descriptor_java): New variable, containing
Java-specific expression evaluator.
(java_language_defn): Add la_exp_desc field and remove evaluate_exp
field.
* scm-lang.c (exp_descriptor_scm): New variable, containing
Scheme-specific expression evaluator.
(scm_language_defn): Add la_exp_desc field and remove evaluate_exp
field.
* objc-lang.c (print_object_command): Take evaluate_exp from the
la_exp_desc field.

* Makefile.in (eval.o): Add dependency on parser-defs.h.

* eval.c: Include parser-defs.h for the full declaration of
la_exp_desc's type.
(evaluate_subexp): Get evaluate_exp out of la_exp_desc field.

16 files changed:
gdb/ChangeLog
gdb/Makefile.in
gdb/c-lang.c
gdb/eval.c
gdb/expprint.c
gdb/expression.h
gdb/f-lang.c
gdb/jv-lang.c
gdb/language.c
gdb/language.h
gdb/m2-lang.c
gdb/objc-lang.c
gdb/p-lang.c
gdb/parse.c
gdb/parser-defs.h
gdb/scm-lang.c

index 04798de..12fd3c2 100644 (file)
@@ -1,3 +1,77 @@
+2003-09-24  Paul N. Hilfinger  <hilfingr@nile.gnat.com>
+
+       * parser-defs.h (struct exp_descriptor): New definition, containing 
+       language-specific info for printing, prefixifying, dumping, and 
+       evaluating expressions.
+       (exp_descriptor_standard): Declare new variable.
+       (print_subexp): Make global and declare here (from expprint.c).
+       (dump_subexp): Ditto.
+       (dump_subexp_body_standard): Declare.
+       (operator_length_standard): Declare.
+       (op_name_standard): Declare.
+       (print_subexp): Declare.
+       (print_subexp_standard): Declare.
+
+       * language.h (struct language_defn): Add la_exp_desc field to hold
+       pointer to table for language-specific operators.
+       Remove evaluate_exp field, which is now in struct exp_descriptor.
+       
+       * parse.c (operator_length): Move most code to new 
+       operator_length_standard function.  Use language-specific information.
+       (operator_length_standard): New function taking most code from 
+       operator_length.
+       (exp_descriptor_standard): New constant.
+       
+       * expression.h (enum exp_opcode): Add definitions of OP_EXTENDED0 
+       and OP_EXTENDED_LAST.
+       
+       * expprint.c (print_subexp): Use language-specific print_subexp.  
+       Make global; remove static declaration.
+       Move most code to print_subexp_standard.
+       (print_subexp_standard): New function, containing code formerly in 
+       print_subexp.
+       (op_name): Add expression to argument signature.
+       Use langauge-specific op_name. 
+       Move most code to op_name_standard.
+       (op_name_standard): New function, containing code formerly in op_name.
+       (dump_subexp):  Use new version of op_name function.
+       Use language-specific dump_subexp_body, and move most existing code to
+       dump_subexp_body_standard.
+       (dump_raw_expression): Use new op_name interface.
+       (dump_subexp_body): Move most code to dump_subexp_body_standard.
+       (dump_subexp_body_standard): New function, containing code formerly
+       in dump_subexp_body.
+       
+       * language.c (unknown_language): Add default la_exp_desc field and
+       remove evaluate_exp field.
+       (auto_language): Ditto.
+       (local_language): Ditto.
+       * f-lang.c (f_language_defn): Ditto.
+       * c-lang.c (c_language_defn): Ditto.
+       (cplus_language_defn): Ditto.
+       (asm_language_defn): Ditto.
+       (minimal_language_defn): Ditto.
+       * p-lang.c (pascal_language_defn): Ditto.
+       * m2-lang.c (m2_language_defn): Ditto.
+       * objc-lang.c (objc_language_defn): Ditto.
+       
+       * jv-lang.c (exp_descriptor_java): New variable, containing 
+       Java-specific expression evaluator.
+       (java_language_defn): Add la_exp_desc field and remove evaluate_exp
+       field.
+       * scm-lang.c (exp_descriptor_scm): New variable, containing 
+       Scheme-specific expression evaluator.
+       (scm_language_defn): Add la_exp_desc field and remove evaluate_exp
+       field.
+       * objc-lang.c (print_object_command): Take evaluate_exp from the
+       la_exp_desc field.
+       
+       * Makefile.in (eval.o): Add dependency on parser-defs.h.
+       
+       * eval.c: Include parser-defs.h for the full declaration of 
+       la_exp_desc's type.
+       (evaluate_subexp): Get evaluate_exp out of la_exp_desc field.
+       
 2003-09-23  Paul N. Hilfinger  <hilfingr@nile.gnat.com>
 
        * parser-defs.h (operator_length): Declare.
index 7b681e3..350a255 100644 (file)
@@ -1735,7 +1735,8 @@ elfread.o: elfread.c $(defs_h) $(bfd_h) $(gdb_string_h) $(elf_bfd_h) \
 environ.o: environ.c $(defs_h) $(environ_h) $(gdb_string_h)
 eval.o: eval.c $(defs_h) $(gdb_string_h) $(symtab_h) $(gdbtypes_h) \
        $(value_h) $(expression_h) $(target_h) $(frame_h) $(language_h) \
-       $(f_lang_h) $(cp_abi_h) $(infcall_h) $(objc_lang_h) $(block_h)
+       $(f_lang_h) $(cp_abi_h) $(infcall_h) $(objc_lang_h) $(block_h) \
+       $(parser_defs_h)
 event-loop.o: event-loop.c $(defs_h) $(event_loop_h) $(event_top_h) \
        $(gdb_string_h)
 event-top.o: event-top.c $(defs_h) $(top_h) $(inferior_h) $(target_h) \
index 4a5a362..f5a87a4 100644 (file)
@@ -543,9 +543,9 @@ const struct language_defn c_language_defn =
   range_check_off,
   type_check_off,
   case_sensitive_on,
+  &exp_descriptor_standard,
   c_preprocess_and_parse,
   c_error,
-  evaluate_subexp_standard,
   c_printchar,                 /* Print a character constant */
   c_printstr,                  /* Function to print string constant */
   c_emit_char,                 /* Print a single char */
@@ -599,9 +599,9 @@ const struct language_defn cplus_language_defn =
   range_check_off,
   type_check_off,
   case_sensitive_on,
+  &exp_descriptor_standard,
   c_preprocess_and_parse,
   c_error,
-  evaluate_subexp_standard,
   c_printchar,                 /* Print a character constant */
   c_printstr,                  /* Function to print string constant */
   c_emit_char,                 /* Print a single char */
@@ -632,9 +632,9 @@ const struct language_defn asm_language_defn =
   range_check_off,
   type_check_off,
   case_sensitive_on,
+  &exp_descriptor_standard,
   c_preprocess_and_parse,
   c_error,
-  evaluate_subexp_standard,
   c_printchar,                 /* Print a character constant */
   c_printstr,                  /* Function to print string constant */
   c_emit_char,                 /* Print a single char */
@@ -670,9 +670,9 @@ const struct language_defn minimal_language_defn =
   range_check_off,
   type_check_off,
   case_sensitive_on,
+  &exp_descriptor_standard,
   c_preprocess_and_parse,
   c_error,
-  evaluate_subexp_standard,
   c_printchar,                 /* Print a character constant */
   c_printstr,                  /* Function to print string constant */
   c_emit_char,                 /* Print a single char */
index 9a3af67..cda1494 100644 (file)
@@ -35,6 +35,7 @@
 #include "infcall.h"
 #include "objc-lang.h"
 #include "block.h"
+#include "parser-defs.h"
 
 /* Defined in symtab.c */
 extern int hp_som_som_object_present;
@@ -70,7 +71,8 @@ static struct value *
 evaluate_subexp (struct type *expect_type, struct expression *exp,
                 int *pos, enum noside noside)
 {
-  return (*exp->language_defn->evaluate_exp) (expect_type, exp, pos, noside);
+  return (*exp->language_defn->la_exp_desc->evaluate_exp) 
+    (expect_type, exp, pos, noside);
 }
 \f
 /* Parse the string EXP as a C expression, evaluate it,
index 8db4c36..5949475 100644 (file)
 #include <ctype.h>
 #endif
 
-/* Prototypes for local functions */
-
-static void print_subexp (struct expression *, int *, struct ui_file *,
-                         enum precedence);
-
 void
 print_expression (struct expression *exp, struct ui_file *stream)
 {
@@ -53,10 +48,19 @@ print_expression (struct expression *exp, struct ui_file *stream)
    if the precedence of the main operator of this subexpression is less,
    parentheses are needed here.  */
 
-static void
+void
 print_subexp (struct expression *exp, int *pos,
              struct ui_file *stream, enum precedence prec)
 {
+  exp->language_defn->la_exp_desc->print_subexp (exp, pos, stream, prec);
+}
+
+/* Standard implementation of print_subexp for use in language_defn
+   vectors.  */
+void
+print_subexp_standard (struct expression *exp, int *pos,
+                      struct ui_file *stream, enum precedence prec)
+{
   unsigned tem;
   const struct op_print *op_print_tab;
   int pc;
@@ -547,11 +551,22 @@ op_string (enum exp_opcode op)
 /* Support for dumping the raw data from expressions in a human readable
    form.  */
 
-static char *op_name (int opcode);
+static char *op_name (struct expression *, enum exp_opcode);
 static int dump_subexp_body (struct expression *exp, struct ui_file *, int);
 
+/* Name for OPCODE, when it appears in expression EXP. */
+
 static char *
-op_name (int opcode)
+op_name (struct expression *exp, enum exp_opcode opcode)
+{
+  return exp->language_defn->la_exp_desc->op_name (opcode);
+}
+
+/* Default name for the standard operator OPCODE (i.e., one defined in
+   the definition of enum exp_opcode).  */
+
+char *
+op_name_standard (enum exp_opcode opcode)
 {
   switch (opcode)
     {
@@ -756,7 +771,7 @@ dump_raw_expression (struct expression *exp, struct ui_file *stream,
   for (elt = 0; elt < exp->nelts; elt++)
     {
       fprintf_filtered (stream, "\t%5d  ", elt);
-      opcode_name = op_name (exp->elts[elt].opcode);
+      opcode_name = op_name (exp, exp->elts[elt].opcode);
 
       fprintf_filtered (stream, "%20s  ", opcode_name);
       print_longest (stream, 'd', 0, exp->elts[elt].longconst);
@@ -791,7 +806,7 @@ dump_subexp (struct expression *exp, struct ui_file *stream, int elt)
     fprintf_filtered (stream, " ");
   indent += 2;
 
-  fprintf_filtered (stream, "%-20s  ", op_name (exp->elts[elt].opcode));
+  fprintf_filtered (stream, "%-20s  ", op_name (exp, exp->elts[elt].opcode));
 
   elt = dump_subexp_body (exp, stream, elt);
 
@@ -807,6 +822,15 @@ dump_subexp (struct expression *exp, struct ui_file *stream, int elt)
 static int
 dump_subexp_body (struct expression *exp, struct ui_file *stream, int elt)
 {
+  return exp->language_defn->la_exp_desc->dump_subexp_body (exp, stream, elt);
+}
+
+/* Default value for subexp_body in exp_descriptor vector.  */
+
+int
+dump_subexp_body_standard (struct expression *exp, 
+                          struct ui_file *stream, int elt)
+{
   int opcode = exp->elts[elt++].opcode;
 
   switch (opcode)
index 356725e..03b45c2 100644 (file)
@@ -322,7 +322,27 @@ enum exp_opcode
     OP_EXPRSTRING,
 
     /* An Objective C Foundation Class NSString constant */
-    OP_OBJC_NSSTRING
+    OP_OBJC_NSSTRING,
+
+     /* First extension operator.  Individual language modules define
+        extra operators they need as constants with values 
+        OP_LANGUAGE_SPECIFIC0 + k, for k >= 0, using a separate 
+        enumerated type definition:
+           enum foo_extension_operator {
+             BINOP_MOGRIFY = OP_EXTENDED0,
+            BINOP_FROB,
+            ...
+           };      */
+    OP_EXTENDED0,
+  
+    /* Last possible extension operator.  Defined to provide an
+       explicit and finite number of extended operators. */
+    OP_EXTENDED_LAST = 0xff
+    /* NOTE: Eventually, we expect to convert to an object-oriented 
+       formulation for expression operators that does away with the
+       need for these extension operators, and indeed for this
+       entire enumeration type.  Therefore, consider the OP_EXTENDED
+       definitions to be a temporary measure. */
   };
 
 union exp_element
index 52f56b3..f84e050 100644 (file)
@@ -462,9 +462,9 @@ const struct language_defn f_language_defn =
   range_check_on,
   type_check_on,
   case_sensitive_off,
+  &exp_descriptor_standard,
   f_parse,                     /* parser */
   f_error,                     /* parser error function */
-  evaluate_subexp_standard,
   f_printchar,                 /* Print character constant */
   f_printstr,                  /* function to print string constant */
   f_emit_char,                 /* Function to print a single character */
index e9b86d2..0913ace 100644 (file)
@@ -1030,6 +1030,15 @@ const struct op_print java_op_print_tab[] =
   {NULL, 0, 0, 0}
 };
 
+const struct exp_descriptor exp_descriptor_java = 
+{
+  print_subexp_standard,
+  operator_length_standard,
+  op_name_standard,
+  dump_subexp_body_standard,
+  evaluate_subexp_java
+};
+
 const struct language_defn java_language_defn =
 {
   "java",                      /* Language name */
@@ -1038,9 +1047,9 @@ const struct language_defn java_language_defn =
   range_check_off,
   type_check_off,
   case_sensitive_on,
+  &exp_descriptor_java,
   java_parse,
   java_error,
-  evaluate_subexp_java,
   c_printchar,                 /* Print a character constant */
   c_printstr,                  /* Function to print string constant */
   java_emit_char,              /* Function to print a single character */
index 9d195d8..28cdd27 100644 (file)
@@ -1267,9 +1267,9 @@ const struct language_defn unknown_language_defn =
   range_check_off,
   type_check_off,
   case_sensitive_on,
+  &exp_descriptor_standard,
   unk_lang_parser,
   unk_lang_error,
-  evaluate_subexp_standard,
   unk_lang_printchar,          /* Print character constant */
   unk_lang_printstr,
   unk_lang_emit_char,
@@ -1301,9 +1301,9 @@ const struct language_defn auto_language_defn =
   range_check_off,
   type_check_off,
   case_sensitive_on,
+  &exp_descriptor_standard,
   unk_lang_parser,
   unk_lang_error,
-  evaluate_subexp_standard,
   unk_lang_printchar,          /* Print character constant */
   unk_lang_printstr,
   unk_lang_emit_char,
@@ -1334,9 +1334,9 @@ const struct language_defn local_language_defn =
   range_check_off,
   type_check_off,
   case_sensitive_on,
+  &exp_descriptor_standard,
   unk_lang_parser,
   unk_lang_error,
-  evaluate_subexp_standard,
   unk_lang_printchar,          /* Print character constant */
   unk_lang_printstr,
   unk_lang_emit_char,
index 75ca555..baa49ec 100644 (file)
@@ -167,6 +167,11 @@ struct language_defn
     /* Default case sensitivity */
     enum case_sensitivity la_case_sensitivity;
 
+    /* Definitions related to expression printing, prefixifying, and
+       dumping */
+
+    const struct exp_descriptor *la_exp_desc;
+
     /* Parser function. */
 
     int (*la_parser) (void);
@@ -175,10 +180,6 @@ struct language_defn
 
     void (*la_error) (char *);
 
-    /* Evaluate an expression. */
-    struct value *(*evaluate_exp) (struct type *, struct expression *,
-                                  int *, enum noside);
-
     void (*la_printchar) (int ch, struct ui_file * stream);
 
     void (*la_printstr) (struct ui_file * stream, char *string,
index a54d188..f067907 100644 (file)
@@ -415,9 +415,9 @@ const struct language_defn m2_language_defn =
   range_check_on,
   type_check_on,
   case_sensitive_on,
+  &exp_descriptor_standard,
   m2_parse,                    /* parser */
   m2_error,                    /* parser error function */
-  evaluate_subexp_standard,
   m2_printchar,                        /* Print character constant */
   m2_printstr,                 /* function to print string constant */
   m2_emit_char,                        /* Function to print a single character */
index e399818..7c74e6d 100644 (file)
@@ -659,9 +659,9 @@ const struct language_defn objc_language_defn = {
   range_check_off,
   type_check_off,
   case_sensitive_on,
+  &exp_descriptor_standard,
   objc_parse,
   objc_error,
-  evaluate_subexp_standard,
   objc_printchar,              /* Print a character constant */
   objc_printstr,               /* Function to print string constant */
   objc_emit_char,
@@ -1537,8 +1537,8 @@ print_object_command (char *args, int from_tty)
       make_cleanup (free_current_contents, &expr);
     int pc = 0;
 
-    object = expr->language_defn->evaluate_exp (builtin_type_void_data_ptr,
-                                               expr, &pc, EVAL_NORMAL);
+    object = expr->language_defn->la_exp_desc->evaluate_exp 
+      (builtin_type_void_data_ptr, expr, &pc, EVAL_NORMAL);
     do_cleanups (old_chain);
   }
 
index 836f5f3..a12f7ec 100644 (file)
@@ -451,9 +451,9 @@ const struct language_defn pascal_language_defn =
   range_check_on,
   type_check_on,
   case_sensitive_on,
+  &exp_descriptor_standard,
   pascal_parse,
   pascal_error,
-  evaluate_subexp_standard,
   pascal_printchar,            /* Print a character constant */
   pascal_printstr,             /* Function to print string constant */
   pascal_emit_char,            /* Print a single char */
index 6166cf6..da39866 100644 (file)
 #include "gdb_assert.h"
 #include "block.h"
 
+/* Standard set of definitions for printing, dumping, prefixifying,
+ * and evaluating expressions.  */
+
+const struct exp_descriptor exp_descriptor_standard = 
+  {
+    print_subexp_standard,
+    operator_length_standard,
+    op_name_standard,
+    dump_subexp_body_standard,
+    evaluate_subexp_standard
+  };
 \f
 /* Symbols which architectures can redefine.  */
 
@@ -810,12 +821,22 @@ length_of_subexp (struct expression *expr, int endpos)
 void
 operator_length (struct expression *expr, int endpos, int *oplenp, int *argsp)
 {
+  expr->language_defn->la_exp_desc->operator_length (expr, endpos,
+                                                    oplenp, argsp);
+}
+
+/* Default value for operator_length in exp_descriptor vectors.  */
+
+void
+operator_length_standard (struct expression *expr, int endpos,
+                         int *oplenp, int *argsp)
+{
   int oplen = 1;
   int args = 0;
   int i;
 
   if (endpos < 1)
-    error ("?error in operator_length");
+    error ("?error in operator_length_standard");
 
   i = (int) expr->elts[endpos - 1].opcode;
 
index 54b39a8..c84fcad 100644 (file)
@@ -159,8 +159,17 @@ extern int pop_type_int (void);
 
 extern int length_of_subexp (struct expression *, int);
 
+extern int dump_subexp (struct expression *, struct ui_file *, int);
+
+extern int dump_subexp_body_standard (struct expression *, 
+                                     struct ui_file *, int);
+
 extern void operator_length (struct expression *, int, int *, int *);
 
+extern void operator_length_standard (struct expression *, int, int *, int *);
+
+extern char *op_name_standard (enum exp_opcode);
+
 extern struct type *follow_types (struct type *);
 
 /* During parsing of a C expression, the pointer to the next character
@@ -222,6 +231,46 @@ struct op_print
     int right_assoc;
   };
 
+/* Information needed to print, prefixify, and evaluate expressions for 
+   a given language.  */
+
+struct exp_descriptor
+  {
+    /* Print subexpression.  */
+    void (*print_subexp) (struct expression *, int *, struct ui_file *,
+                         enum precedence);
+
+    /* Returns number of exp_elements needed to represent an operator and
+       the number of subexpressions it takes.  */
+    void (*operator_length) (struct expression*, int, int*, int *);
+
+    /* Name of this operator for dumping purposes.  */
+    char *(*op_name) (enum exp_opcode);
+
+    /* Dump the rest of this (prefix) expression after the operator
+       itself has been printed.  See dump_subexp_body_standard in
+       (expprint.c).  */
+    int (*dump_subexp_body) (struct expression *, struct ui_file *, int);
+
+    /* Evaluate an expression.  */
+    struct value *(*evaluate_exp) (struct type *, struct expression *,
+                                  int *, enum noside);
+  };
+
+
+/* Default descriptor containing standard definitions of all
+   elements.  */
+extern const struct exp_descriptor exp_descriptor_standard;
+
+/* Functions used by language-specific extended operators to (recursively)
+   print/dump subexpressions.  */
+
+extern void print_subexp (struct expression *, int *, struct ui_file *,
+                         enum precedence);
+
+extern void print_subexp_standard (struct expression *, int *, 
+                                  struct ui_file *, enum precedence);
+
 /* Function used to avoid direct calls to fprintf
    in the code generated by the bison parser.  */
 
index 83d88cc..b02fd6f 100644 (file)
@@ -233,6 +233,15 @@ nosideret:
   return value_from_longest (builtin_type_long, (LONGEST) 1);
 }
 
+const struct exp_descriptor exp_descriptor_scm = 
+{
+  print_subexp_standard,
+  operator_length_standard,
+  op_name_standard,
+  dump_subexp_body_standard,
+  evaluate_subexp_scm
+};
+
 const struct language_defn scm_language_defn =
 {
   "scheme",                    /* Language name */
@@ -241,9 +250,9 @@ const struct language_defn scm_language_defn =
   range_check_off,
   type_check_off,
   case_sensitive_off,
+  &exp_descriptor_scm,
   scm_parse,
   c_error,
-  evaluate_subexp_scm,
   scm_printchar,               /* Print a character constant */
   scm_printstr,                        /* Function to print string constant */
   NULL,                                /* Function to print a single character */