1 /* Java language support routines for GDB, the GNU debugger. 2 Copyright 1997, 1998, 1999, 2000, 2003, 2004 Free Software Foundation, Inc. 3 4 This file is part of GDB. 5 6 This program is free software; you can redistribute it and/or modify 7 it under the terms of the GNU General Public License as published by 8 the Free Software Foundation; either version 2 of the License, or 9 (at your option) any later version. 10 11 This program is distributed in the hope that it will be useful, 12 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 GNU General Public License for more details. 15 16 You should have received a copy of the GNU General Public License 17 along with this program; if not, write to the Free Software 18 Foundation, Inc., 59 Temple Place - Suite 330, 19 Boston, MA 02111-1307, USA. */ 20 21 #include "defs.h" 22 #include "symtab.h" 23 #include "gdbtypes.h" 24 #include "expression.h" 25 #include "parser-defs.h" 26 #include "language.h" 27 #include "gdbtypes.h" 28 #include "symtab.h" 29 #include "symfile.h" 30 #include "objfiles.h" 31 #include "gdb_string.h" 32 #include "value.h" 33 #include "c-lang.h" 34 #include "jv-lang.h" 35 #include "gdbcore.h" 36 #include "block.h" 37 #include "demangle.h" 38 #include "dictionary.h" 39 #include <ctype.h> 40 41 struct type *java_int_type; 42 struct type *java_byte_type; 43 struct type *java_short_type; 44 struct type *java_long_type; 45 struct type *java_boolean_type; 46 struct type *java_char_type; 47 struct type *java_float_type; 48 struct type *java_double_type; 49 struct type *java_void_type; 50 51 /* Local functions */ 52 53 extern void _initialize_java_language (void); 54 55 static int java_demangled_signature_length (char *); 56 static void java_demangled_signature_copy (char *, char *); 57 58 static struct symtab *get_java_class_symtab (void); 59 static char *get_java_utf8_name (struct obstack *obstack, struct value *name); 60 static int java_class_is_primitive (struct value *clas); 61 static struct value *java_value_string (char *ptr, int len); 62 63 static void java_emit_char (int c, struct ui_file * stream, int quoter); 64 65 static char *java_class_name_from_physname (const char *physname); 66 67 /* This objfile contains symtabs that have been dynamically created 68 to record dynamically loaded Java classes and dynamically 69 compiled java methods. */ 70 71 static struct objfile *dynamics_objfile = NULL; 72 73 static struct type *java_link_class_type (struct type *, struct value *); 74 75 /* FIXME: carlton/2003-02-04: This is the main or only caller of 76 allocate_objfile with first argument NULL; as a result, this code 77 breaks every so often. Somebody should write a test case that 78 exercises GDB in various ways (e.g. something involving loading a 79 dynamic library) after this code has been called. */ 80 81 static struct objfile * 82 get_dynamics_objfile (void) 83 { 84 if (dynamics_objfile == NULL) 85 { 86 dynamics_objfile = allocate_objfile (NULL, 0); 87 } 88 return dynamics_objfile; 89 } 90 91 #if 1 92 /* symtab contains classes read from the inferior. */ 93 94 static struct symtab *class_symtab = NULL; 95 96 static void free_class_block (struct symtab *symtab); 97 98 static struct symtab * 99 get_java_class_symtab (void) 100 { 101 if (class_symtab == NULL) 102 { 103 struct objfile *objfile = get_dynamics_objfile (); 104 struct blockvector *bv; 105 struct block *bl; 106 class_symtab = allocate_symtab ("<java-classes>", objfile); 107 class_symtab->language = language_java; 108 bv = (struct blockvector *) 109 obstack_alloc (&objfile->objfile_obstack, 110 sizeof (struct blockvector) + sizeof (struct block *)); 111 BLOCKVECTOR_NBLOCKS (bv) = 1; 112 BLOCKVECTOR (class_symtab) = bv; 113 114 /* Allocate dummy STATIC_BLOCK. */ 115 bl = allocate_block (&objfile->objfile_obstack); 116 BLOCK_DICT (bl) = dict_create_linear (&objfile->objfile_obstack, 117 NULL); 118 BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK) = bl; 119 120 /* Allocate GLOBAL_BLOCK. */ 121 bl = allocate_block (&objfile->objfile_obstack); 122 BLOCK_DICT (bl) = dict_create_hashed_expandable (); 123 BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK) = bl; 124 class_symtab->free_func = free_class_block; 125 } 126 return class_symtab; 127 } 128 129 static void 130 add_class_symtab_symbol (struct symbol *sym) 131 { 132 struct symtab *symtab = get_java_class_symtab (); 133 struct blockvector *bv = BLOCKVECTOR (symtab); 134 dict_add_symbol (BLOCK_DICT (BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK)), sym); 135 } 136 137 static struct symbol *add_class_symbol (struct type *type, CORE_ADDR addr); 138 139 static struct symbol * 140 add_class_symbol (struct type *type, CORE_ADDR addr) 141 { 142 struct symbol *sym; 143 sym = (struct symbol *) 144 obstack_alloc (&dynamics_objfile->objfile_obstack, sizeof (struct symbol)); 145 memset (sym, 0, sizeof (struct symbol)); 146 SYMBOL_LANGUAGE (sym) = language_java; 147 DEPRECATED_SYMBOL_NAME (sym) = TYPE_TAG_NAME (type); 148 SYMBOL_CLASS (sym) = LOC_TYPEDEF; 149 /* SYMBOL_VALUE (sym) = valu; */ 150 SYMBOL_TYPE (sym) = type; 151 SYMBOL_DOMAIN (sym) = STRUCT_DOMAIN; 152 SYMBOL_VALUE_ADDRESS (sym) = addr; 153 return sym; 154 } 155 156 /* Free the dynamic symbols block. */ 157 static void 158 free_class_block (struct symtab *symtab) 159 { 160 struct blockvector *bv = BLOCKVECTOR (symtab); 161 struct block *bl = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK); 162 163 dict_free (BLOCK_DICT (bl)); 164 } 165 #endif 166 167 struct type * 168 java_lookup_class (char *name) 169 { 170 struct symbol *sym; 171 sym = lookup_symbol (name, expression_context_block, STRUCT_DOMAIN, 172 (int *) 0, (struct symtab **) NULL); 173 if (sym != NULL) 174 return SYMBOL_TYPE (sym); 175 #if 0 176 CORE_ADDR addr; 177 if (called from parser) 178 { 179 call lookup_class (or similar) in inferior; 180 if not 181 found: 182 return NULL; 183 addr = found in inferior; 184 } 185 else 186 addr = 0; 187 struct type *type; 188 type = alloc_type (objfile); 189 TYPE_CODE (type) = TYPE_CODE_STRUCT; 190 INIT_CPLUS_SPECIFIC (type); 191 TYPE_TAG_NAME (type) = obsavestring (name, strlen (name), &objfile->objfile_obstack); 192 TYPE_FLAGS (type) |= TYPE_FLAG_STUB; 193 TYPE ? = addr; 194 return type; 195 #else 196 /* FIXME - should search inferior's symbol table. */ 197 return NULL; 198 #endif 199 } 200 201 /* Return a nul-terminated string (allocated on OBSTACK) for 202 a name given by NAME (which has type Utf8Const*). */ 203 204 char * 205 get_java_utf8_name (struct obstack *obstack, struct value *name) 206 { 207 char *chrs; 208 struct value *temp = name; 209 int name_length; 210 CORE_ADDR data_addr; 211 temp = value_struct_elt (&temp, NULL, "length", NULL, "structure"); 212 name_length = (int) value_as_long (temp); 213 data_addr = VALUE_ADDRESS (temp) + VALUE_OFFSET (temp) 214 + TYPE_LENGTH (VALUE_TYPE (temp)); 215 chrs = obstack_alloc (obstack, name_length + 1); 216 chrs[name_length] = '\0'; 217 read_memory (data_addr, chrs, name_length); 218 return chrs; 219 } 220 221 struct value * 222 java_class_from_object (struct value *obj_val) 223 { 224 /* This is all rather inefficient, since the offsets of vtable and 225 class are fixed. FIXME */ 226 struct value *vtable_val; 227 228 if (TYPE_CODE (VALUE_TYPE (obj_val)) == TYPE_CODE_PTR 229 && TYPE_LENGTH (TYPE_TARGET_TYPE (VALUE_TYPE (obj_val))) == 0) 230 obj_val = value_at (get_java_object_type (), 231 value_as_address (obj_val), NULL); 232 233 vtable_val = value_struct_elt (&obj_val, NULL, "vtable", NULL, "structure"); 234 return value_struct_elt (&vtable_val, NULL, "class", NULL, "structure"); 235 } 236 237 /* Check if CLASS_IS_PRIMITIVE(value of clas): */ 238 static int 239 java_class_is_primitive (struct value *clas) 240 { 241 struct value *vtable = value_struct_elt (&clas, NULL, "vtable", NULL, "struct"); 242 CORE_ADDR i = value_as_address (vtable); 243 return (int) (i & 0x7fffffff) == (int) 0x7fffffff; 244 } 245 246 /* Read a GCJ Class object, and generated a gdb (TYPE_CODE_STRUCT) type. */ 247 248 struct type * 249 type_from_class (struct value *clas) 250 { 251 struct type *type; 252 char *name; 253 struct value *temp; 254 struct objfile *objfile; 255 struct value *utf8_name; 256 char *nptr; 257 CORE_ADDR addr; 258 struct block *bl; 259 struct dict_iterator iter; 260 int is_array = 0; 261 262 type = check_typedef (VALUE_TYPE (clas)); 263 if (TYPE_CODE (type) == TYPE_CODE_PTR) 264 { 265 if (value_logical_not (clas)) 266 return NULL; 267 clas = value_ind (clas); 268 } 269 addr = VALUE_ADDRESS (clas) + VALUE_OFFSET (clas); 270 271 #if 0 272 get_java_class_symtab (); 273 bl = BLOCKVECTOR_BLOCK (BLOCKVECTOR (class_symtab), GLOBAL_BLOCK); 274 ALL_BLOCK_SYMBOLS (block, iter, sym) 275 { 276 if (SYMBOL_VALUE_ADDRESS (sym) == addr) 277 return SYMBOL_TYPE (sym); 278 } 279 #endif 280 281 objfile = get_dynamics_objfile (); 282 if (java_class_is_primitive (clas)) 283 { 284 struct value *sig; 285 temp = clas; 286 sig = value_struct_elt (&temp, NULL, "method_count", NULL, "structure"); 287 return java_primitive_type (value_as_long (sig)); 288 } 289 290 /* Get Class name. */ 291 /* if clasloader non-null, prepend loader address. FIXME */ 292 temp = clas; 293 utf8_name = value_struct_elt (&temp, NULL, "name", NULL, "structure"); 294 name = get_java_utf8_name (&objfile->objfile_obstack, utf8_name); 295 for (nptr = name; *nptr != 0; nptr++) 296 { 297 if (*nptr == '/') 298 *nptr = '.'; 299 } 300 301 type = java_lookup_class (name); 302 if (type != NULL) 303 return type; 304 305 type = alloc_type (objfile); 306 TYPE_CODE (type) = TYPE_CODE_STRUCT; 307 INIT_CPLUS_SPECIFIC (type); 308 309 if (name[0] == '[') 310 { 311 char *signature = name; 312 int namelen = java_demangled_signature_length (signature); 313 if (namelen > strlen (name)) 314 name = obstack_alloc (&objfile->objfile_obstack, namelen + 1); 315 java_demangled_signature_copy (name, signature); 316 name[namelen] = '\0'; 317 is_array = 1; 318 temp = clas; 319 /* Set array element type. */ 320 temp = value_struct_elt (&temp, NULL, "methods", NULL, "structure"); 321 VALUE_TYPE (temp) = lookup_pointer_type (VALUE_TYPE (clas)); 322 TYPE_TARGET_TYPE (type) = type_from_class (temp); 323 } 324 325 ALLOCATE_CPLUS_STRUCT_TYPE (type); 326 TYPE_TAG_NAME (type) = name; 327 328 add_class_symtab_symbol (add_class_symbol (type, addr)); 329 return java_link_class_type (type, clas); 330 } 331 332 /* Fill in class TYPE with data from the CLAS value. */ 333 334 struct type * 335 java_link_class_type (struct type *type, struct value *clas) 336 { 337 struct value *temp; 338 char *unqualified_name; 339 char *name = TYPE_TAG_NAME (type); 340 int ninterfaces, nfields, nmethods; 341 int type_is_object = 0; 342 struct fn_field *fn_fields; 343 struct fn_fieldlist *fn_fieldlists; 344 struct value *fields; 345 struct value *methods; 346 struct value *method = NULL; 347 struct value *field = NULL; 348 int i, j; 349 struct objfile *objfile = get_dynamics_objfile (); 350 struct type *tsuper; 351 352 unqualified_name = strrchr (name, '.'); 353 if (unqualified_name == NULL) 354 unqualified_name = name; 355 356 temp = clas; 357 temp = value_struct_elt (&temp, NULL, "superclass", NULL, "structure"); 358 if (name != NULL && strcmp (name, "java.lang.Object") == 0) 359 { 360 tsuper = get_java_object_type (); 361 if (tsuper && TYPE_CODE (tsuper) == TYPE_CODE_PTR) 362 tsuper = TYPE_TARGET_TYPE (tsuper); 363 type_is_object = 1; 364 } 365 else 366 tsuper = type_from_class (temp); 367 368 #if 1 369 ninterfaces = 0; 370 #else 371 temp = clas; 372 ninterfaces = value_as_long (value_struct_elt (&temp, NULL, "interface_len", NULL, "structure")); 373 #endif 374 TYPE_N_BASECLASSES (type) = (tsuper == NULL ? 0 : 1) + ninterfaces; 375 temp = clas; 376 nfields = value_as_long (value_struct_elt (&temp, NULL, "field_count", NULL, "structure")); 377 nfields += TYPE_N_BASECLASSES (type); 378 nfields++; /* Add one for dummy "class" field. */ 379 TYPE_NFIELDS (type) = nfields; 380 TYPE_FIELDS (type) = (struct field *) 381 TYPE_ALLOC (type, sizeof (struct field) * nfields); 382 383 memset (TYPE_FIELDS (type), 0, sizeof (struct field) * nfields); 384 385 TYPE_FIELD_PRIVATE_BITS (type) = 386 (B_TYPE *) TYPE_ALLOC (type, B_BYTES (nfields)); 387 B_CLRALL (TYPE_FIELD_PRIVATE_BITS (type), nfields); 388 389 TYPE_FIELD_PROTECTED_BITS (type) = 390 (B_TYPE *) TYPE_ALLOC (type, B_BYTES (nfields)); 391 B_CLRALL (TYPE_FIELD_PROTECTED_BITS (type), nfields); 392 393 TYPE_FIELD_IGNORE_BITS (type) = 394 (B_TYPE *) TYPE_ALLOC (type, B_BYTES (nfields)); 395 B_CLRALL (TYPE_FIELD_IGNORE_BITS (type), nfields); 396 397 TYPE_FIELD_VIRTUAL_BITS (type) = (B_TYPE *) 398 TYPE_ALLOC (type, B_BYTES (TYPE_N_BASECLASSES (type))); 399 B_CLRALL (TYPE_FIELD_VIRTUAL_BITS (type), TYPE_N_BASECLASSES (type)); 400 401 if (tsuper != NULL) 402 { 403 TYPE_BASECLASS (type, 0) = tsuper; 404 if (type_is_object) 405 SET_TYPE_FIELD_PRIVATE (type, 0); 406 } 407 408 i = strlen (name); 409 if (i > 2 && name[i - 1] == ']' && tsuper != NULL) 410 { 411 /* FIXME */ 412 TYPE_LENGTH (type) = TYPE_LENGTH (tsuper) + 4; /* size with "length" */ 413 } 414 else 415 { 416 temp = clas; 417 temp = value_struct_elt (&temp, NULL, "size_in_bytes", NULL, "structure"); 418 TYPE_LENGTH (type) = value_as_long (temp); 419 } 420 421 fields = NULL; 422 nfields--; /* First set up dummy "class" field. */ 423 SET_FIELD_PHYSADDR (TYPE_FIELD (type, nfields), 424 VALUE_ADDRESS (clas) + VALUE_OFFSET (clas)); 425 TYPE_FIELD_NAME (type, nfields) = "class"; 426 TYPE_FIELD_TYPE (type, nfields) = VALUE_TYPE (clas); 427 SET_TYPE_FIELD_PRIVATE (type, nfields); 428 429 for (i = TYPE_N_BASECLASSES (type); i < nfields; i++) 430 { 431 int accflags; 432 int boffset; 433 if (fields == NULL) 434 { 435 temp = clas; 436 fields = value_struct_elt (&temp, NULL, "fields", NULL, "structure"); 437 field = value_ind (fields); 438 } 439 else 440 { /* Re-use field value for next field. */ 441 VALUE_ADDRESS (field) += TYPE_LENGTH (VALUE_TYPE (field)); 442 VALUE_LAZY (field) = 1; 443 } 444 temp = field; 445 temp = value_struct_elt (&temp, NULL, "name", NULL, "structure"); 446 TYPE_FIELD_NAME (type, i) = 447 get_java_utf8_name (&objfile->objfile_obstack, temp); 448 temp = field; 449 accflags = value_as_long (value_struct_elt (&temp, NULL, "accflags", 450 NULL, "structure")); 451 temp = field; 452 temp = value_struct_elt (&temp, NULL, "info", NULL, "structure"); 453 boffset = value_as_long (value_struct_elt (&temp, NULL, "boffset", 454 NULL, "structure")); 455 if (accflags & 0x0001) /* public access */ 456 { 457 /* ??? */ 458 } 459 if (accflags & 0x0002) /* private access */ 460 { 461 SET_TYPE_FIELD_PRIVATE (type, i); 462 } 463 if (accflags & 0x0004) /* protected access */ 464 { 465 SET_TYPE_FIELD_PROTECTED (type, i); 466 } 467 if (accflags & 0x0008) /* ACC_STATIC */ 468 SET_FIELD_PHYSADDR (TYPE_FIELD (type, i), boffset); 469 else 470 TYPE_FIELD_BITPOS (type, i) = 8 * boffset; 471 if (accflags & 0x8000) /* FIELD_UNRESOLVED_FLAG */ 472 { 473 TYPE_FIELD_TYPE (type, i) = get_java_object_type (); /* FIXME */ 474 } 475 else 476 { 477 struct type *ftype; 478 temp = field; 479 temp = value_struct_elt (&temp, NULL, "type", NULL, "structure"); 480 ftype = type_from_class (temp); 481 if (TYPE_CODE (ftype) == TYPE_CODE_STRUCT) 482 ftype = lookup_pointer_type (ftype); 483 TYPE_FIELD_TYPE (type, i) = ftype; 484 } 485 } 486 487 temp = clas; 488 nmethods = value_as_long (value_struct_elt (&temp, NULL, "method_count", 489 NULL, "structure")); 490 TYPE_NFN_FIELDS_TOTAL (type) = nmethods; 491 j = nmethods * sizeof (struct fn_field); 492 fn_fields = (struct fn_field *) 493 obstack_alloc (&dynamics_objfile->objfile_obstack, j); 494 memset (fn_fields, 0, j); 495 fn_fieldlists = (struct fn_fieldlist *) 496 alloca (nmethods * sizeof (struct fn_fieldlist)); 497 498 methods = NULL; 499 for (i = 0; i < nmethods; i++) 500 { 501 char *mname; 502 int k; 503 if (methods == NULL) 504 { 505 temp = clas; 506 methods = value_struct_elt (&temp, NULL, "methods", NULL, "structure"); 507 method = value_ind (methods); 508 } 509 else 510 { /* Re-use method value for next method. */ 511 VALUE_ADDRESS (method) += TYPE_LENGTH (VALUE_TYPE (method)); 512 VALUE_LAZY (method) = 1; 513 } 514 515 /* Get method name. */ 516 temp = method; 517 temp = value_struct_elt (&temp, NULL, "name", NULL, "structure"); 518 mname = get_java_utf8_name (&objfile->objfile_obstack, temp); 519 if (strcmp (mname, "<init>") == 0) 520 mname = unqualified_name; 521 522 /* Check for an existing method with the same name. 523 * This makes building the fn_fieldslists an O(nmethods**2) 524 * operation. That could be using hashing, but I doubt it 525 * is worth it. Note that we do maintain the order of methods 526 * in the inferior's Method table (as long as that is grouped 527 * by method name), which I think is desirable. --PB */ 528 for (k = 0, j = TYPE_NFN_FIELDS (type);;) 529 { 530 if (--j < 0) 531 { /* No match - new method name. */ 532 j = TYPE_NFN_FIELDS (type)++; 533 fn_fieldlists[j].name = mname; 534 fn_fieldlists[j].length = 1; 535 fn_fieldlists[j].fn_fields = &fn_fields[i]; 536 k = i; 537 break; 538 } 539 if (strcmp (mname, fn_fieldlists[j].name) == 0) 540 { /* Found an existing method with the same name. */ 541 int l; 542 if (mname != unqualified_name) 543 obstack_free (&objfile->objfile_obstack, mname); 544 mname = fn_fieldlists[j].name; 545 fn_fieldlists[j].length++; 546 k = i - k; /* Index of new slot. */ 547 /* Shift intervening fn_fields (between k and i) down. */ 548 for (l = i; l > k; l--) 549 fn_fields[l] = fn_fields[l - 1]; 550 for (l = TYPE_NFN_FIELDS (type); --l > j;) 551 fn_fieldlists[l].fn_fields++; 552 break; 553 } 554 k += fn_fieldlists[j].length; 555 } 556 fn_fields[k].physname = ""; 557 fn_fields[k].is_stub = 1; 558 fn_fields[k].type = make_function_type (java_void_type, NULL); /* FIXME */ 559 TYPE_CODE (fn_fields[k].type) = TYPE_CODE_METHOD; 560 } 561 562 j = TYPE_NFN_FIELDS (type) * sizeof (struct fn_fieldlist); 563 TYPE_FN_FIELDLISTS (type) = (struct fn_fieldlist *) 564 obstack_alloc (&dynamics_objfile->objfile_obstack, j); 565 memcpy (TYPE_FN_FIELDLISTS (type), fn_fieldlists, j); 566 567 return type; 568 } 569 570 static struct type *java_object_type; 571 572 struct type * 573 get_java_object_type (void) 574 { 575 if (java_object_type == NULL) 576 { 577 struct symbol *sym; 578 sym = lookup_symbol ("java.lang.Object", NULL, STRUCT_DOMAIN, 579 (int *) 0, (struct symtab **) NULL); 580 if (sym == NULL) 581 error ("cannot find java.lang.Object"); 582 java_object_type = SYMBOL_TYPE (sym); 583 } 584 return java_object_type; 585 } 586 587 int 588 get_java_object_header_size (void) 589 { 590 struct type *objtype = get_java_object_type (); 591 if (objtype == NULL) 592 return (2 * TARGET_PTR_BIT / TARGET_CHAR_BIT); 593 else 594 return TYPE_LENGTH (objtype); 595 } 596 597 int 598 is_object_type (struct type *type) 599 { 600 CHECK_TYPEDEF (type); 601 if (TYPE_CODE (type) == TYPE_CODE_PTR) 602 { 603 struct type *ttype = check_typedef (TYPE_TARGET_TYPE (type)); 604 char *name; 605 if (TYPE_CODE (ttype) != TYPE_CODE_STRUCT) 606 return 0; 607 while (TYPE_N_BASECLASSES (ttype) > 0) 608 ttype = TYPE_BASECLASS (ttype, 0); 609 name = TYPE_TAG_NAME (ttype); 610 if (name != NULL && strcmp (name, "java.lang.Object") == 0) 611 return 1; 612 name = TYPE_NFIELDS (ttype) > 0 ? TYPE_FIELD_NAME (ttype, 0) : (char *) 0; 613 if (name != NULL && strcmp (name, "vtable") == 0) 614 { 615 if (java_object_type == NULL) 616 java_object_type = type; 617 return 1; 618 } 619 } 620 return 0; 621 } 622 623 struct type * 624 java_primitive_type (int signature) 625 { 626 switch (signature) 627 { 628 case 'B': 629 return java_byte_type; 630 case 'S': 631 return java_short_type; 632 case 'I': 633 return java_int_type; 634 case 'J': 635 return java_long_type; 636 case 'Z': 637 return java_boolean_type; 638 case 'C': 639 return java_char_type; 640 case 'F': 641 return java_float_type; 642 case 'D': 643 return java_double_type; 644 case 'V': 645 return java_void_type; 646 } 647 error ("unknown signature '%c' for primitive type", (char) signature); 648 } 649 650 /* If name[0 .. namelen-1] is the name of a primitive Java type, 651 return that type. Otherwise, return NULL. */ 652 653 struct type * 654 java_primitive_type_from_name (char *name, int namelen) 655 { 656 switch (name[0]) 657 { 658 case 'b': 659 if (namelen == 4 && memcmp (name, "byte", 4) == 0) 660 return java_byte_type; 661 if (namelen == 7 && memcmp (name, "boolean", 7) == 0) 662 return java_boolean_type; 663 break; 664 case 'c': 665 if (namelen == 4 && memcmp (name, "char", 4) == 0) 666 return java_char_type; 667 case 'd': 668 if (namelen == 6 && memcmp (name, "double", 6) == 0) 669 return java_double_type; 670 break; 671 case 'f': 672 if (namelen == 5 && memcmp (name, "float", 5) == 0) 673 return java_float_type; 674 break; 675 case 'i': 676 if (namelen == 3 && memcmp (name, "int", 3) == 0) 677 return java_int_type; 678 break; 679 case 'l': 680 if (namelen == 4 && memcmp (name, "long", 4) == 0) 681 return java_long_type; 682 break; 683 case 's': 684 if (namelen == 5 && memcmp (name, "short", 5) == 0) 685 return java_short_type; 686 break; 687 case 'v': 688 if (namelen == 4 && memcmp (name, "void", 4) == 0) 689 return java_void_type; 690 break; 691 } 692 return NULL; 693 } 694 695 /* Return the length (in bytes) of demangled name of the Java type 696 signature string SIGNATURE. */ 697 698 static int 699 java_demangled_signature_length (char *signature) 700 { 701 int array = 0; 702 for (; *signature == '['; signature++) 703 array += 2; /* Two chars for "[]". */ 704 switch (signature[0]) 705 { 706 case 'L': 707 /* Subtract 2 for 'L' and ';'. */ 708 return strlen (signature) - 2 + array; 709 default: 710 return strlen (TYPE_NAME (java_primitive_type (signature[0]))) + array; 711 } 712 } 713 714 /* Demangle the Java type signature SIGNATURE, leaving the result in RESULT. */ 715 716 static void 717 java_demangled_signature_copy (char *result, char *signature) 718 { 719 int array = 0; 720 char *ptr; 721 int i; 722 while (*signature == '[') 723 { 724 array++; 725 signature++; 726 } 727 switch (signature[0]) 728 { 729 case 'L': 730 /* Subtract 2 for 'L' and ';', but add 1 for final nul. */ 731 signature++; 732 ptr = result; 733 for (; *signature != ';' && *signature != '\0'; signature++) 734 { 735 if (*signature == '/') 736 *ptr++ = '.'; 737 else 738 *ptr++ = *signature; 739 } 740 break; 741 default: 742 ptr = TYPE_NAME (java_primitive_type (signature[0])); 743 i = strlen (ptr); 744 strcpy (result, ptr); 745 ptr = result + i; 746 break; 747 } 748 while (--array >= 0) 749 { 750 *ptr++ = '['; 751 *ptr++ = ']'; 752 } 753 } 754 755 /* Return the demangled name of the Java type signature string SIGNATURE, 756 as a freshly allocated copy. */ 757 758 char * 759 java_demangle_type_signature (char *signature) 760 { 761 int length = java_demangled_signature_length (signature); 762 char *result = xmalloc (length + 1); 763 java_demangled_signature_copy (result, signature); 764 result[length] = '\0'; 765 return result; 766 } 767 768 /* Return the type of TYPE followed by DIMS pairs of [ ]. 769 If DIMS == 0, TYPE is returned. */ 770 771 struct type * 772 java_array_type (struct type *type, int dims) 773 { 774 struct type *range_type; 775 776 while (dims-- > 0) 777 { 778 range_type = create_range_type (NULL, builtin_type_int, 0, 0); 779 /* FIXME This is bogus! Java arrays are not gdb arrays! */ 780 type = create_array_type (NULL, type, range_type); 781 } 782 783 return type; 784 } 785 786 /* Create a Java string in the inferior from a (Utf8) literal. */ 787 788 static struct value * 789 java_value_string (char *ptr, int len) 790 { 791 error ("not implemented - java_value_string"); /* FIXME */ 792 } 793 794 /* Print the character C on STREAM as part of the contents of a literal 795 string whose delimiter is QUOTER. Note that that format for printing 796 characters and strings is language specific. */ 797 798 static void 799 java_emit_char (int c, struct ui_file *stream, int quoter) 800 { 801 switch (c) 802 { 803 case '\\': 804 case '\'': 805 fprintf_filtered (stream, "\\%c", c); 806 break; 807 case '\b': 808 fputs_filtered ("\\b", stream); 809 break; 810 case '\t': 811 fputs_filtered ("\\t", stream); 812 break; 813 case '\n': 814 fputs_filtered ("\\n", stream); 815 break; 816 case '\f': 817 fputs_filtered ("\\f", stream); 818 break; 819 case '\r': 820 fputs_filtered ("\\r", stream); 821 break; 822 default: 823 if (isprint (c)) 824 fputc_filtered (c, stream); 825 else 826 fprintf_filtered (stream, "\\u%.4x", (unsigned int) c); 827 break; 828 } 829 } 830 831 static struct value * 832 evaluate_subexp_java (struct type *expect_type, struct expression *exp, 833 int *pos, enum noside noside) 834 { 835 int pc = *pos; 836 int i; 837 char *name; 838 enum exp_opcode op = exp->elts[*pos].opcode; 839 struct value *arg1; 840 struct value *arg2; 841 struct type *type; 842 switch (op) 843 { 844 case UNOP_IND: 845 if (noside == EVAL_SKIP) 846 goto standard; 847 (*pos)++; 848 arg1 = evaluate_subexp_java (NULL_TYPE, exp, pos, EVAL_NORMAL); 849 if (is_object_type (VALUE_TYPE (arg1))) 850 { 851 struct type *type; 852 853 type = type_from_class (java_class_from_object (arg1)); 854 arg1 = value_cast (lookup_pointer_type (type), arg1); 855 } 856 if (noside == EVAL_SKIP) 857 goto nosideret; 858 return value_ind (arg1); 859 860 case BINOP_SUBSCRIPT: 861 (*pos)++; 862 arg1 = evaluate_subexp_with_coercion (exp, pos, noside); 863 arg2 = evaluate_subexp_with_coercion (exp, pos, noside); 864 if (noside == EVAL_SKIP) 865 goto nosideret; 866 /* If the user attempts to subscript something that is not an 867 array or pointer type (like a plain int variable for example), 868 then report this as an error. */ 869 870 COERCE_REF (arg1); 871 type = check_typedef (VALUE_TYPE (arg1)); 872 if (TYPE_CODE (type) == TYPE_CODE_PTR) 873 type = check_typedef (TYPE_TARGET_TYPE (type)); 874 name = TYPE_NAME (type); 875 if (name == NULL) 876 name = TYPE_TAG_NAME (type); 877 i = name == NULL ? 0 : strlen (name); 878 if (TYPE_CODE (type) == TYPE_CODE_STRUCT 879 && i > 2 && name[i - 1] == ']') 880 { 881 CORE_ADDR address; 882 long length, index; 883 struct type *el_type; 884 char buf4[4]; 885 886 struct value *clas = java_class_from_object (arg1); 887 struct value *temp = clas; 888 /* Get CLASS_ELEMENT_TYPE of the array type. */ 889 temp = value_struct_elt (&temp, NULL, "methods", 890 NULL, "structure"); 891 VALUE_TYPE (temp) = VALUE_TYPE (clas); 892 el_type = type_from_class (temp); 893 if (TYPE_CODE (el_type) == TYPE_CODE_STRUCT) 894 el_type = lookup_pointer_type (el_type); 895 896 if (noside == EVAL_AVOID_SIDE_EFFECTS) 897 return value_zero (el_type, VALUE_LVAL (arg1)); 898 address = value_as_address (arg1); 899 address += JAVA_OBJECT_SIZE; 900 read_memory (address, buf4, 4); 901 length = (long) extract_signed_integer (buf4, 4); 902 index = (long) value_as_long (arg2); 903 if (index >= length || index < 0) 904 error ("array index (%ld) out of bounds (length: %ld)", 905 index, length); 906 address = (address + 4) + index * TYPE_LENGTH (el_type); 907 return value_at (el_type, address, NULL); 908 } 909 else if (TYPE_CODE (type) == TYPE_CODE_ARRAY) 910 { 911 if (noside == EVAL_AVOID_SIDE_EFFECTS) 912 return value_zero (TYPE_TARGET_TYPE (type), VALUE_LVAL (arg1)); 913 else 914 return value_subscript (arg1, arg2); 915 } 916 if (name) 917 error ("cannot subscript something of type `%s'", name); 918 else 919 error ("cannot subscript requested type"); 920 921 case OP_STRING: 922 (*pos)++; 923 i = longest_to_int (exp->elts[pc + 1].longconst); 924 (*pos) += 3 + BYTES_TO_EXP_ELEM (i + 1); 925 if (noside == EVAL_SKIP) 926 goto nosideret; 927 return java_value_string (&exp->elts[pc + 2].string, i); 928 929 case STRUCTOP_STRUCT: 930 arg1 = evaluate_subexp_standard (expect_type, exp, pos, noside); 931 /* Convert object field (such as TYPE.class) to reference. */ 932 if (TYPE_CODE (VALUE_TYPE (arg1)) == TYPE_CODE_STRUCT) 933 arg1 = value_addr (arg1); 934 return arg1; 935 default: 936 break; 937 } 938 standard: 939 return evaluate_subexp_standard (expect_type, exp, pos, noside); 940 nosideret: 941 return value_from_longest (builtin_type_long, (LONGEST) 1); 942 } 943 944 static struct type * 945 java_create_fundamental_type (struct objfile *objfile, int typeid) 946 { 947 switch (typeid) 948 { 949 case FT_VOID: 950 return java_void_type; 951 case FT_BOOLEAN: 952 return java_boolean_type; 953 case FT_CHAR: 954 return java_char_type; 955 case FT_FLOAT: 956 return java_float_type; 957 case FT_DBL_PREC_FLOAT: 958 return java_double_type; 959 case FT_BYTE: 960 case FT_SIGNED_CHAR: 961 return java_byte_type; 962 case FT_SHORT: 963 case FT_SIGNED_SHORT: 964 return java_short_type; 965 case FT_INTEGER: 966 case FT_SIGNED_INTEGER: 967 return java_int_type; 968 case FT_LONG: 969 case FT_SIGNED_LONG: 970 return java_long_type; 971 } 972 return c_create_fundamental_type (objfile, typeid); 973 } 974 975 static char *java_demangle (const char *mangled, int options) 976 { 977 return cplus_demangle (mangled, options | DMGL_JAVA); 978 } 979 980 /* Find the member function name of the demangled name NAME. NAME 981 must be a method name including arguments, in order to correctly 982 locate the last component. 983 984 This function return a pointer to the first dot before the 985 member function name, or NULL if the name was not of the 986 expected form. */ 987 988 static const char * 989 java_find_last_component (const char *name) 990 { 991 const char *p; 992 993 /* Find argument list. */ 994 p = strchr (name, '('); 995 996 if (p == NULL) 997 return NULL; 998 999 /* Back up and find first dot prior to argument list. */ 1000 while (p > name && *p != '.') 1001 p--; 1002 1003 if (p == name) 1004 return NULL; 1005 1006 return p; 1007 } 1008 1009 /* Return the name of the class containing method PHYSNAME. */ 1010 1011 static char * 1012 java_class_name_from_physname (const char *physname) 1013 { 1014 char *ret = NULL; 1015 const char *end; 1016 int depth = 0; 1017 char *demangled_name = java_demangle (physname, DMGL_PARAMS | DMGL_ANSI); 1018 1019 if (demangled_name == NULL) 1020 return NULL; 1021 1022 end = java_find_last_component (demangled_name); 1023 if (end != NULL) 1024 { 1025 ret = xmalloc (end - demangled_name + 1); 1026 memcpy (ret, demangled_name, end - demangled_name); 1027 ret[end - demangled_name] = '\0'; 1028 } 1029 1030 xfree (demangled_name); 1031 return ret; 1032 } 1033 1034 /* Table mapping opcodes into strings for printing operators 1035 and precedences of the operators. */ 1036 1037 const struct op_print java_op_print_tab[] = 1038 { 1039 {",", BINOP_COMMA, PREC_COMMA, 0}, 1040 {"=", BINOP_ASSIGN, PREC_ASSIGN, 1}, 1041 {"||", BINOP_LOGICAL_OR, PREC_LOGICAL_OR, 0}, 1042 {"&&", BINOP_LOGICAL_AND, PREC_LOGICAL_AND, 0}, 1043 {"|", BINOP_BITWISE_IOR, PREC_BITWISE_IOR, 0}, 1044 {"^", BINOP_BITWISE_XOR, PREC_BITWISE_XOR, 0}, 1045 {"&", BINOP_BITWISE_AND, PREC_BITWISE_AND, 0}, 1046 {"==", BINOP_EQUAL, PREC_EQUAL, 0}, 1047 {"!=", BINOP_NOTEQUAL, PREC_EQUAL, 0}, 1048 {"<=", BINOP_LEQ, PREC_ORDER, 0}, 1049 {">=", BINOP_GEQ, PREC_ORDER, 0}, 1050 {">", BINOP_GTR, PREC_ORDER, 0}, 1051 {"<", BINOP_LESS, PREC_ORDER, 0}, 1052 {">>", BINOP_RSH, PREC_SHIFT, 0}, 1053 {"<<", BINOP_LSH, PREC_SHIFT, 0}, 1054 #if 0 1055 {">>>", BINOP_ ? ? ?, PREC_SHIFT, 0}, 1056 #endif 1057 {"+", BINOP_ADD, PREC_ADD, 0}, 1058 {"-", BINOP_SUB, PREC_ADD, 0}, 1059 {"*", BINOP_MUL, PREC_MUL, 0}, 1060 {"/", BINOP_DIV, PREC_MUL, 0}, 1061 {"%", BINOP_REM, PREC_MUL, 0}, 1062 {"-", UNOP_NEG, PREC_PREFIX, 0}, 1063 {"!", UNOP_LOGICAL_NOT, PREC_PREFIX, 0}, 1064 {"~", UNOP_COMPLEMENT, PREC_PREFIX, 0}, 1065 {"*", UNOP_IND, PREC_PREFIX, 0}, 1066 #if 0 1067 {"instanceof", ? ? ?, ? ? ?, 0}, 1068 #endif 1069 {"++", UNOP_PREINCREMENT, PREC_PREFIX, 0}, 1070 {"--", UNOP_PREDECREMENT, PREC_PREFIX, 0}, 1071 {NULL, 0, 0, 0} 1072 }; 1073 1074 const struct exp_descriptor exp_descriptor_java = 1075 { 1076 print_subexp_standard, 1077 operator_length_standard, 1078 op_name_standard, 1079 dump_subexp_body_standard, 1080 evaluate_subexp_java 1081 }; 1082 1083 const struct language_defn java_language_defn = 1084 { 1085 "java", /* Language name */ 1086 language_java, 1087 NULL, 1088 range_check_off, 1089 type_check_off, 1090 case_sensitive_on, 1091 array_row_major, 1092 &exp_descriptor_java, 1093 java_parse, 1094 java_error, 1095 null_post_parser, 1096 c_printchar, /* Print a character constant */ 1097 c_printstr, /* Function to print string constant */ 1098 java_emit_char, /* Function to print a single character */ 1099 java_create_fundamental_type, /* Create fundamental type in this language */ 1100 java_print_type, /* Print a type using appropriate syntax */ 1101 java_val_print, /* Print a value using appropriate syntax */ 1102 java_value_print, /* Print a top-level value */ 1103 NULL, /* Language specific skip_trampoline */ 1104 value_of_this, /* value_of_this */ 1105 basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */ 1106 basic_lookup_transparent_type,/* lookup_transparent_type */ 1107 java_demangle, /* Language specific symbol demangler */ 1108 java_class_name_from_physname,/* Language specific class name */ 1109 java_op_print_tab, /* expression operators for printing */ 1110 0, /* not c-style arrays */ 1111 0, /* String lower bound */ 1112 NULL, 1113 default_word_break_characters, 1114 c_language_arch_info, 1115 LANG_MAGIC 1116 }; 1117 1118 void 1119 _initialize_java_language (void) 1120 { 1121 1122 java_int_type = init_type (TYPE_CODE_INT, 4, 0, "int", NULL); 1123 java_short_type = init_type (TYPE_CODE_INT, 2, 0, "short", NULL); 1124 java_long_type = init_type (TYPE_CODE_INT, 8, 0, "long", NULL); 1125 java_byte_type = init_type (TYPE_CODE_INT, 1, 0, "byte", NULL); 1126 java_boolean_type = init_type (TYPE_CODE_BOOL, 1, 0, "boolean", NULL); 1127 java_char_type = init_type (TYPE_CODE_CHAR, 2, TYPE_FLAG_UNSIGNED, "char", NULL); 1128 java_float_type = init_type (TYPE_CODE_FLT, 4, 0, "float", NULL); 1129 java_double_type = init_type (TYPE_CODE_FLT, 8, 0, "double", NULL); 1130 java_void_type = init_type (TYPE_CODE_VOID, 1, 0, "void", NULL); 1131 1132 add_language (&java_language_defn); 1133 } 1134 1135 /* Cleanup code that should be run on every "run". 1136 We should use make_run_cleanup to have this be called. 1137 But will that mess up values in value histry? FIXME */ 1138 1139 extern void java_rerun_cleanup (void); 1140 void 1141 java_rerun_cleanup (void) 1142 { 1143 if (class_symtab != NULL) 1144 { 1145 free_symtab (class_symtab); /* ??? */ 1146 class_symtab = NULL; 1147 } 1148 if (dynamics_objfile != NULL) 1149 { 1150 free_objfile (dynamics_objfile); 1151 dynamics_objfile = NULL; 1152 } 1153 1154 java_object_type = NULL; 1155 } 1156