Robert Bihlmeyer wrote: > Shouldn't 'print System.out.println(token)' work too?
It should - but it isn't implemented. I made a start at implementing method invocation. In fact, I have a bunch of gdb patches I haven't gotten around to checking in. If people want to check my patches, I'd like to know how they work. -- --Per Bothner [EMAIL PROTECTED] http://www.bothner.com/per/
2002-04-10 Per Bothner <[EMAIL PROTECTED]> * eval.c (evaluate_subexp_standard): Do overload resolution for Java. * infcmd.c (run_command): Reset innermost_block. * jv-exp.y (MethodInvocation)): Add preliminary support. * valops.c (search_struct_field): Make non-static. * jv-lang.c (java_class_from_object): De-reference first. Then call search_struct_field. * jv-lang.c: Comment out (using #if DYNAMICS) support for generating type by reading Class structures from inferior. Needs work. * jv-lang.c (evaluate_subexp_java): On UNOP_IND, just smash type. * jv-valprint.c (java_value_print): Call value_copy instead of value_copy. Don't remember why - it may be faster. * language.c (unk_lang_create_fundamental_type): Remove. (unknown_language_defn, auto_language_defn, local_language_defn): In place of unk_lang_create_fundamental_type use c_create_fundamental_type. Index: eval.c =================================================================== RCS file: /cvs/src/src/gdb/eval.c,v retrieving revision 1.21 diff -u -p -r1.21 eval.c --- eval.c 16 Mar 2002 20:51:44 -0000 1.21 +++ eval.c 11 Apr 2002 19:44:57 -0000 @@ -827,7 +827,9 @@ evaluate_subexp_standard (struct type *e /* Name of method from expression */ strcpy (tstr, &exp->elts[pc2 + 2].string); - if (overload_resolution && (exp->language_defn->la_language == language_cplus)) + if (overload_resolution + && (exp->language_defn->la_language == language_cplus + || exp->language_defn->la_language == language_java)) { /* Language is C++, do some overload resolution before evaluation */ struct value *valp = NULL; Index: infcmd.c =================================================================== RCS file: /cvs/src/src/gdb/infcmd.c,v retrieving revision 1.43 diff -u -p -r1.43 infcmd.c --- infcmd.c 28 Mar 2002 01:35:55 -0000 1.43 +++ infcmd.c 11 Apr 2002 19:44:59 -0000 @@ -387,6 +387,8 @@ Start it from the beginning? ")) init_wait_for_inferior (); } + innermost_block = NULL; + clear_breakpoint_hit_counts (); /* Purge old solib objfiles. */ Index: jv-exp.y =================================================================== RCS file: /cvs/src/src/gdb/jv-exp.y,v retrieving revision 1.5 diff -u -p -r1.5 jv-exp.y --- jv-exp.y 21 Feb 2002 02:54:46 -0000 1.5 +++ jv-exp.y 11 Apr 2002 19:44:59 -0000 @@ -442,12 +442,25 @@ FieldAccess: ; MethodInvocation: - Name '(' ArgumentList_opt ')' - { error ("method invocation not implemented"); } -| Primary '.' SimpleName '(' ArgumentList_opt ')' - { error ("method invocation not implemented"); } + Name '(' + { push_expression_name ($1); + /* FIXME does not handle static calls, i.e. Name is a Type. */ + start_arglist (); } + ArgumentList_opt ')' + { write_exp_elt_opcode (OP_FUNCALL); + write_exp_elt_longcst ((LONGEST) end_arglist ()); + write_exp_elt_opcode (OP_FUNCALL); } +| Primary '.' SimpleName '(' + { write_exp_elt_opcode (STRUCTOP_PTR); + write_exp_string ($3); + write_exp_elt_opcode (STRUCTOP_PTR); + start_arglist (); } + ArgumentList_opt ')' + { write_exp_elt_opcode (OP_FUNCALL); + write_exp_elt_longcst ((LONGEST) end_arglist ()); + write_exp_elt_opcode (OP_FUNCALL); } | SUPER '.' SimpleName '(' ArgumentList_opt ')' - { error ("method invocation not implemented"); } + { error ("super method invocation not implemented"); } ; ArrayAccess: Index: jv-lang.c =================================================================== RCS file: /cvs/src/src/gdb/jv-lang.c,v retrieving revision 1.11 diff -u -p -r1.11 jv-lang.c --- jv-lang.c 2 Dec 2001 22:43:59 -0000 1.11 +++ jv-lang.c 11 Apr 2002 19:45:00 -0000 @@ -68,6 +68,9 @@ static struct objfile *dynamics_objfile static struct type *java_link_class_type (struct type *, struct value *); +#define DYNAMICS 0 + +#if DYNAMICS static struct objfile * get_dynamics_objfile (void) { @@ -77,8 +80,9 @@ get_dynamics_objfile (void) } return dynamics_objfile; } +#endif -#if 1 +#if DYNAMICS /* symtab contains classes read from the inferior. */ static struct symtab *class_symtab = NULL; @@ -164,7 +168,7 @@ add_class_symbol (struct type *type, COR SYMBOL_VALUE_ADDRESS (sym) = addr; return sym; } -#endif +#endif /* DYNAMICS */ struct type * java_lookup_class (char *name) @@ -200,8 +204,9 @@ java_lookup_class (char *name) #endif } -/* Return a nul-terminated string (allocated on OBSTACK) for - a name given by NAME (which has type Utf8Const*). */ +/* Return a nul-terminated string for a name given by NAME (which has + type Utf8Const*). The result is allocated on OBSTACK if it that is + non-null, otherwise xmalloc is used. */ char * get_java_utf8_name (struct obstack *obstack, struct value *name) @@ -214,7 +219,10 @@ get_java_utf8_name (struct obstack *obst name_length = (int) value_as_long (temp); data_addr = VALUE_ADDRESS (temp) + VALUE_OFFSET (temp) + TYPE_LENGTH (VALUE_TYPE (temp)); - chrs = obstack_alloc (obstack, name_length + 1); + if (obstack == NULL) + chrs = xmalloc (name_length + 1); + else + chrs = obstack_alloc (obstack, name_length + 1); chrs[name_length] = '\0'; read_memory (data_addr, chrs, name_length); return chrs; @@ -226,12 +234,22 @@ java_class_from_object (struct value *ob /* This is all rather inefficient, since the offsets of vtable and class are fixed. FIXME */ struct value *vtable_val; + register struct type *t; if (TYPE_CODE (VALUE_TYPE (obj_val)) == TYPE_CODE_PTR && TYPE_LENGTH (TYPE_TARGET_TYPE (VALUE_TYPE (obj_val))) == 0) obj_val = value_at (get_java_object_type (), value_as_address (obj_val), NULL); + t = check_typedef (VALUE_TYPE (obj_val)); + if (TYPE_CODE (t) == TYPE_CODE_PTR || TYPE_CODE (t) == TYPE_CODE_REF) + { + obj_val = value_ind (obj_val); + t = check_typedef (VALUE_TYPE (obj_val)); + } + + obj_val = search_struct_field ("java.lang.Object", obj_val, 0, t, 1); + vtable_val = value_struct_elt (&obj_val, NULL, "vtable", NULL, "structure"); return value_struct_elt (&vtable_val, NULL, "class", NULL, "structure"); } @@ -245,7 +263,7 @@ java_class_is_primitive (struct value *c return (int) (i & 0x7fffffff) == (int) 0x7fffffff; } -/* Read a GCJ Class object, and generated a gdb (TYPE_CODE_STRUCT) type. */ +/* Read a GCJ Class object, and generates a gdb (TYPE_CODE_STRUCT) type. */ struct type * type_from_class (struct value *clas) @@ -281,7 +299,6 @@ type_from_class (struct value *clas) } #endif - objfile = get_dynamics_objfile (); if (java_class_is_primitive (clas)) { struct value *sig; @@ -291,10 +308,17 @@ type_from_class (struct value *clas) } /* Get Class name. */ - /* if clasloader non-null, prepend loader address. FIXME */ + /* if clasloader non-null, prepend loader address. FIXME + * Check this by looking for a type, and seeing if its class$ field matches. + */ temp = clas; utf8_name = value_struct_elt (&temp, NULL, "name", NULL, "structure"); +#if DYNAMICS + objfile = get_dynamics_objfile (); name = get_java_utf8_name (&objfile->type_obstack, utf8_name); +#else + name = get_java_utf8_name (NULL, utf8_name); +#endif for (nptr = name; *nptr != 0; nptr++) { if (*nptr == '/') @@ -303,8 +327,15 @@ type_from_class (struct value *clas) type = java_lookup_class (name); if (type != NULL) - return type; - + { +#if ! DYNAMICS + free (name); +#endif + return type; + } +#if ! DYNAMICS + error ("unknown type '%s'", name); +#else type = alloc_type (objfile); TYPE_CODE (type) = TYPE_CODE_STRUCT; INIT_CPLUS_SPECIFIC (type); @@ -330,8 +361,10 @@ type_from_class (struct value *clas) add_class_symtab_symbol (add_class_symbol (type, addr)); return java_link_class_type (type, clas); +#endif } +#if DYNAMICS /* Fill in class TYPE with data from the CLAS value. */ struct type * @@ -569,6 +602,7 @@ java_link_class_type (struct type *type, return type; } +#endif /* DYNAMICS */ static struct type *java_object_type; @@ -867,10 +901,8 @@ evaluate_subexp_java (struct type *expec struct type *type; type = type_from_class (java_class_from_object (arg1)); - arg1 = value_cast (lookup_pointer_type (type), arg1); + VALUE_TYPE (arg1) = lookup_pointer_type (type); } - if (noside == EVAL_SKIP) - goto nosideret; return value_ind (arg1); case BINOP_SUBSCRIPT: @@ -1082,6 +1114,7 @@ extern void java_rerun_cleanup (void); void java_rerun_cleanup (void) { +#if DYNAMICS if (class_symtab != NULL) { free_symtab (class_symtab); /* ??? */ @@ -1092,6 +1125,7 @@ java_rerun_cleanup (void) free_objfile (dynamics_objfile); dynamics_objfile = NULL; } +#endif java_object_type = NULL; } Index: jv-valprint.c =================================================================== RCS file: /cvs/src/src/gdb/jv-valprint.c,v retrieving revision 1.9 diff -u -p -r1.9 jv-valprint.c --- jv-valprint.c 21 Oct 2001 01:57:42 -0000 1.9 +++ jv-valprint.c 11 Apr 2002 19:45:00 -0000 @@ -65,7 +65,8 @@ java_value_print (struct value *val, str type = type_from_class (java_class_from_object (val)); type = lookup_pointer_type (type); - val = value_at (type, address, NULL); + val = value_copy (val); + VALUE_TYPE (val) = type; } } Index: language.c =================================================================== RCS file: /cvs/src/src/gdb/language.c,v retrieving revision 1.23 diff -u -p -r1.23 language.c --- language.c 28 Mar 2002 01:35:55 -0000 1.23 +++ language.c 11 Apr 2002 19:45:01 -0000 @@ -41,6 +41,7 @@ #include "language.h" #include "target.h" #include "parser-defs.h" +#include "c-lang.h" #include "jv-lang.h" extern void _initialize_language (void); @@ -1416,12 +1417,6 @@ unk_lang_printstr (struct ui_file *strea error ("internal error - unimplemented function unk_lang_printstr called."); } -static struct type * -unk_lang_create_fundamental_type (struct objfile *objfile, int typeid) -{ - error ("internal error - unimplemented function unk_lang_create_fundamental_type called."); -} - static void unk_lang_print_type (struct type *type, char *varstring, struct ui_file *stream, int show, int level) @@ -1467,7 +1462,7 @@ const struct language_defn unknown_langu unk_lang_printchar, /* Print character constant */ unk_lang_printstr, unk_lang_emit_char, - unk_lang_create_fundamental_type, + c_create_fundamental_type, unk_lang_print_type, /* Print a type using appropriate syntax */ unk_lang_val_print, /* Print a value using appropriate syntax */ unk_lang_value_print, /* Print a top-level value */ @@ -1497,7 +1492,7 @@ const struct language_defn auto_language unk_lang_printchar, /* Print character constant */ unk_lang_printstr, unk_lang_emit_char, - unk_lang_create_fundamental_type, + c_create_fundamental_type, unk_lang_print_type, /* Print a type using appropriate syntax */ unk_lang_val_print, /* Print a value using appropriate syntax */ unk_lang_value_print, /* Print a top-level value */ @@ -1526,7 +1521,7 @@ const struct language_defn local_languag unk_lang_printchar, /* Print character constant */ unk_lang_printstr, unk_lang_emit_char, - unk_lang_create_fundamental_type, + c_create_fundamental_type, unk_lang_print_type, /* Print a type using appropriate syntax */ unk_lang_val_print, /* Print a value using appropriate syntax */ unk_lang_value_print, /* Print a top-level value */ Index: valops.c =================================================================== RCS file: /cvs/src/src/gdb/valops.c,v retrieving revision 1.53 diff -u -p -r1.53 valops.c --- valops.c 22 Mar 2002 18:57:08 -0000 1.53 +++ valops.c 11 Apr 2002 19:45:03 -0000 @@ -52,7 +52,7 @@ static struct value *value_arg_coerce (s static CORE_ADDR value_push (CORE_ADDR, struct value *); -static struct value *search_struct_field (char *, struct value *, int, +extern struct value *search_struct_field (char *, struct value *, int, struct type *, int); static struct value *search_struct_method (char *, struct value **, @@ -2010,7 +2010,7 @@ typecmp (int staticp, struct type *t1[], If LOOKING_FOR_BASECLASS, then instead of looking for struct fields, look for a baseclass named NAME. */ -static struct value * + struct value * search_struct_field (char *name, struct value *arg1, int offset, register struct type *type, int looking_for_baseclass) {