| 1 | # Copyright (C) 1992-1998, 2000-2012 Free Software Foundation, Inc. |
| 2 | # |
| 3 | # This file is part of GNU Emacs. |
| 4 | # |
| 5 | # GNU Emacs is free software; you can redistribute it and/or modify |
| 6 | # it under the terms of the GNU General Public License as published by |
| 7 | # the Free Software Foundation; either version 3, or (at your option) |
| 8 | # any later version. |
| 9 | # |
| 10 | # GNU Emacs is distributed in the hope that it will be useful, |
| 11 | # but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 12 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 13 | # GNU General Public License for more details. |
| 14 | # |
| 15 | # You should have received a copy of the GNU General Public License |
| 16 | # along with GNU Emacs; see the file COPYING. If not, write to the |
| 17 | # Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, |
| 18 | # Boston, MA 02110-1301, USA. |
| 19 | |
| 20 | # Force loading of symbols, enough to give us gdb_valbits etc. |
| 21 | set main |
| 22 | # With some compilers, we need this to give us struct Lisp_Symbol etc.: |
| 23 | set Fmake_symbol |
| 24 | |
| 25 | # Find lwlib source files too. |
| 26 | dir ../lwlib |
| 27 | #dir /gd/gnu/lesstif-0.89.9/lib/Xm |
| 28 | |
| 29 | # Don't enter GDB when user types C-g to quit. |
| 30 | # This has one unfortunate effect: you can't type C-c |
| 31 | # at the GDB to stop Emacs, when using X. |
| 32 | # However, C-z works just as well in that case. |
| 33 | handle 2 noprint pass |
| 34 | |
| 35 | # Make it work like SIGINT normally does. |
| 36 | handle SIGTSTP nopass |
| 37 | |
| 38 | # Pass on user signals |
| 39 | handle SIGUSR1 noprint pass |
| 40 | handle SIGUSR2 noprint pass |
| 41 | |
| 42 | # Don't pass SIGALRM to Emacs. This makes problems when |
| 43 | # debugging. |
| 44 | handle SIGALRM ignore |
| 45 | |
| 46 | # $valmask and $tagmask are mask values set up by the xreload macro below. |
| 47 | |
| 48 | # Use $bugfix so that the value isn't a constant. |
| 49 | # Using a constant runs into GDB bugs sometimes. |
| 50 | define xgetptr |
| 51 | set $bugfix = $arg0 |
| 52 | set $ptr = (gdb_use_union ? (gdb_use_lsb ? $bugfix.u.val << gdb_gctypebits : $bugfix.u.val) : $bugfix & $valmask) | gdb_data_seg_bits |
| 53 | end |
| 54 | |
| 55 | define xgetint |
| 56 | set $bugfix = $arg0 |
| 57 | set $int = gdb_use_union ? $bugfix.s.val : (gdb_use_lsb ? $bugfix : $bugfix << gdb_gctypebits) >> gdb_gctypebits |
| 58 | end |
| 59 | |
| 60 | define xgettype |
| 61 | set $bugfix = $arg0 |
| 62 | set $type = gdb_use_union ? $bugfix.s.type : (enum Lisp_Type) (gdb_use_lsb ? $bugfix & $tagmask : $bugfix >> gdb_valbits) |
| 63 | end |
| 64 | |
| 65 | # Set up something to print out s-expressions. |
| 66 | # We save and restore print_output_debug_flag to prevent the w32 port |
| 67 | # from calling OutputDebugString, which causes GDB to display each |
| 68 | # character twice (yuk!). |
| 69 | define pr |
| 70 | set $output_debug = print_output_debug_flag |
| 71 | set print_output_debug_flag = 0 |
| 72 | set debug_print ($) |
| 73 | set print_output_debug_flag = $output_debug |
| 74 | end |
| 75 | document pr |
| 76 | Print the emacs s-expression which is $. |
| 77 | Works only when an inferior emacs is executing. |
| 78 | end |
| 79 | |
| 80 | # Print out s-expressions |
| 81 | define pp |
| 82 | set $tmp = $arg0 |
| 83 | set $output_debug = print_output_debug_flag |
| 84 | set print_output_debug_flag = 0 |
| 85 | set safe_debug_print ($tmp) |
| 86 | set print_output_debug_flag = $output_debug |
| 87 | end |
| 88 | document pp |
| 89 | Print the argument as an emacs s-expression |
| 90 | Works only when an inferior emacs is executing. |
| 91 | end |
| 92 | |
| 93 | # Print out s-expressions from tool bar |
| 94 | define pp1 |
| 95 | set $tmp = $arg0 |
| 96 | set $output_debug = print_output_debug_flag |
| 97 | set print_output_debug_flag = 0 |
| 98 | set safe_debug_print ($tmp) |
| 99 | set print_output_debug_flag = $output_debug |
| 100 | end |
| 101 | document pp1 |
| 102 | Print the argument as an emacs s-expression. |
| 103 | Works only when an inferior emacs is executing. |
| 104 | For use on tool bar when debugging in Emacs |
| 105 | where the variable name would not otherwise |
| 106 | be recorded in the GUD buffer. |
| 107 | end |
| 108 | |
| 109 | # Print value of lisp variable |
| 110 | define pv |
| 111 | set $tmp = "$arg0" |
| 112 | set $output_debug = print_output_debug_flag |
| 113 | set print_output_debug_flag = 0 |
| 114 | set safe_debug_print ( find_symbol_value (intern ($tmp))) |
| 115 | set print_output_debug_flag = $output_debug |
| 116 | end |
| 117 | document pv |
| 118 | Print the value of the lisp variable given as argument. |
| 119 | Works only when an inferior emacs is executing. |
| 120 | end |
| 121 | |
| 122 | # Print value of lisp variable |
| 123 | define pv1 |
| 124 | set $tmp = "$arg0" |
| 125 | set $output_debug = print_output_debug_flag |
| 126 | set print_output_debug_flag = 0 |
| 127 | set safe_debug_print (find_symbol_value (intern ($tmp))) |
| 128 | set print_output_debug_flag = $output_debug |
| 129 | end |
| 130 | document pv1 |
| 131 | Print the value of the lisp variable given as argument. |
| 132 | Works only when an inferior emacs is executing. |
| 133 | For use when debugging in Emacs where the variable |
| 134 | name would not otherwise be recorded in the GUD buffer. |
| 135 | end |
| 136 | |
| 137 | # Print out current buffer point and boundaries |
| 138 | define ppt |
| 139 | set $b = current_buffer |
| 140 | set $t = $b->text |
| 141 | printf "BUF PT: %d", $b->pt |
| 142 | if ($b->pt != $b->pt_byte) |
| 143 | printf "[%d]", $b->pt_byte |
| 144 | end |
| 145 | printf " of 1..%d", $t->z |
| 146 | if ($t->z != $t->z_byte) |
| 147 | printf "[%d]", $t->z_byte |
| 148 | end |
| 149 | if ($b->begv != 1 || $b->zv != $t->z) |
| 150 | printf " NARROW=%d..%d", $b->begv, $b->zv |
| 151 | if ($b->begv != $b->begv_byte || $b->zv != $b->zv_byte) |
| 152 | printf " [%d..%d]", $b->begv_byte, $b->zv_byte |
| 153 | end |
| 154 | end |
| 155 | printf " GAP: %d", $t->gpt |
| 156 | if ($t->gpt != $t->gpt_byte) |
| 157 | printf "[%d]", $t->gpt_byte |
| 158 | end |
| 159 | printf " SZ=%d\n", $t->gap_size |
| 160 | end |
| 161 | document ppt |
| 162 | Print current buffer's point and boundaries. |
| 163 | Prints values of point, beg, end, narrow, and gap for current buffer. |
| 164 | end |
| 165 | |
| 166 | define pitmethod |
| 167 | set $itmethod = $arg0 |
| 168 | # output $itmethod |
| 169 | if ($itmethod == 0) |
| 170 | printf "GET_FROM_BUFFER" |
| 171 | end |
| 172 | if ($itmethod == 1) |
| 173 | printf "GET_FROM_DISPLAY_VECTOR" |
| 174 | end |
| 175 | if ($itmethod == 2) |
| 176 | printf "GET_FROM_STRING" |
| 177 | end |
| 178 | if ($itmethod == 3) |
| 179 | printf "GET_FROM_C_STRING" |
| 180 | end |
| 181 | if ($itmethod == 4) |
| 182 | printf "GET_FROM_IMAGE" |
| 183 | end |
| 184 | if ($itmethod == 5) |
| 185 | printf "GET_FROM_STRETCH" |
| 186 | end |
| 187 | if ($itmethod < 0 || $itmethod > 5) |
| 188 | output $itmethod |
| 189 | end |
| 190 | end |
| 191 | document pitmethod |
| 192 | Pretty print it->method given as first arg |
| 193 | end |
| 194 | |
| 195 | # Print out iterator given as first arg |
| 196 | define pitx |
| 197 | set $it = $arg0 |
| 198 | printf "cur=%d", $it->current.pos.charpos |
| 199 | if ($it->current.pos.charpos != $it->current.pos.bytepos) |
| 200 | printf "[%d]", $it->current.pos.bytepos |
| 201 | end |
| 202 | printf " pos=%d", $it->position.charpos |
| 203 | if ($it->position.charpos != $it->position.bytepos) |
| 204 | printf "[%d]", $it->position.bytepos |
| 205 | end |
| 206 | printf " start=%d", $it->start.pos.charpos |
| 207 | if ($it->start.pos.charpos != $it->start.pos.bytepos) |
| 208 | printf "[%d]", $it->start.pos.bytepos |
| 209 | end |
| 210 | printf " end=%d", $it->end_charpos |
| 211 | printf " stop=%d", $it->stop_charpos |
| 212 | printf " face=%d", $it->face_id |
| 213 | if ($it->multibyte_p) |
| 214 | printf " MB" |
| 215 | end |
| 216 | if ($it->header_line_p) |
| 217 | printf " HL" |
| 218 | end |
| 219 | if ($it->n_overlay_strings > 0) |
| 220 | printf " nov=%d", $it->n_overlay_strings |
| 221 | end |
| 222 | if ($it->sp != 0) |
| 223 | printf " sp=%d", $it->sp |
| 224 | end |
| 225 | # IT_CHARACTER |
| 226 | if ($it->what == 0) |
| 227 | if ($it->len == 1 && $it->c >= ' ' && it->c < 255) |
| 228 | printf " ch='%c'", $it->c |
| 229 | else |
| 230 | printf " ch=[%d,%d]", $it->c, $it->len |
| 231 | end |
| 232 | else |
| 233 | printf " " |
| 234 | # output $it->what |
| 235 | if ($it->what == 0) |
| 236 | printf "IT_CHARACTER" |
| 237 | end |
| 238 | if ($it->what == 1) |
| 239 | printf "IT_COMPOSITION" |
| 240 | end |
| 241 | if ($it->what == 2) |
| 242 | printf "IT_IMAGE" |
| 243 | end |
| 244 | if ($it->what == 3) |
| 245 | printf "IT_STRETCH" |
| 246 | end |
| 247 | if ($it->what == 4) |
| 248 | printf "IT_EOB" |
| 249 | end |
| 250 | if ($it->what == 5) |
| 251 | printf "IT_TRUNCATION" |
| 252 | end |
| 253 | if ($it->what == 6) |
| 254 | printf "IT_CONTINUATION" |
| 255 | end |
| 256 | if ($it->what < 0 || $it->what > 6) |
| 257 | output $it->what |
| 258 | end |
| 259 | end |
| 260 | if ($it->method != 0) |
| 261 | # !GET_FROM_BUFFER |
| 262 | printf " next=" |
| 263 | pitmethod $it->method |
| 264 | if ($it->method == 2) |
| 265 | # GET_FROM_STRING |
| 266 | printf "[%d]", $it->current.string_pos.charpos |
| 267 | end |
| 268 | if ($it->method == 4) |
| 269 | # GET_FROM_IMAGE |
| 270 | printf "[%d]", $it->image_id |
| 271 | end |
| 272 | end |
| 273 | printf "\n" |
| 274 | if ($it->bidi_p) |
| 275 | printf "BIDI: base_stop=%d prev_stop=%d level=%d\n", $it->base_level_stop, $it->prev_stop, $it->bidi_it.resolved_level |
| 276 | end |
| 277 | if ($it->region_beg_charpos >= 0) |
| 278 | printf "reg=%d-%d ", $it->region_beg_charpos, $it->region_end_charpos |
| 279 | end |
| 280 | printf "vpos=%d hpos=%d", $it->vpos, $it->hpos, |
| 281 | printf " y=%d lvy=%d", $it->current_y, $it->last_visible_y |
| 282 | printf " x=%d vx=%d-%d", $it->current_x, $it->first_visible_x, $it->last_visible_x |
| 283 | printf " w=%d", $it->pixel_width |
| 284 | printf " a+d=%d+%d=%d", $it->ascent, $it->descent, $it->ascent+$it->descent |
| 285 | printf " max=%d+%d=%d", $it->max_ascent, $it->max_descent, $it->max_ascent+$it->max_descent |
| 286 | printf "\n" |
| 287 | set $i = 0 |
| 288 | while ($i < $it->sp && $i < 4) |
| 289 | set $e = $it->stack[$i] |
| 290 | printf "stack[%d]: ", $i |
| 291 | pitmethod $e->method |
| 292 | printf "[%d]", $e->position.charpos |
| 293 | printf "\n" |
| 294 | set $i = $i + 1 |
| 295 | end |
| 296 | end |
| 297 | document pitx |
| 298 | Pretty print a display iterator. |
| 299 | Take one arg, an iterator object or pointer. |
| 300 | end |
| 301 | |
| 302 | define pit |
| 303 | pitx it |
| 304 | end |
| 305 | document pit |
| 306 | Pretty print the display iterator it. |
| 307 | end |
| 308 | |
| 309 | define prowx |
| 310 | set $row = $arg0 |
| 311 | printf "y=%d x=%d pwid=%d", $row->y, $row->x, $row->pixel_width |
| 312 | printf " a+d=%d+%d=%d", $row->ascent, $row->height-$row->ascent, $row->height |
| 313 | printf " phys=%d+%d=%d", $row->phys_ascent, $row->phys_height-$row->phys_ascent, $row->phys_height |
| 314 | printf " vis=%d\n", $row->visible_height |
| 315 | printf "used=(LMargin=%d,Text=%d,RMargin=%d) Hash=%d\n", $row->used[0], $row->used[1], $row->used[2], $row->hash |
| 316 | printf "start=%d end=%d", $row->start.pos.charpos, $row->end.pos.charpos |
| 317 | if ($row->enabled_p) |
| 318 | printf " ENA" |
| 319 | end |
| 320 | if ($row->displays_text_p) |
| 321 | printf " DISP" |
| 322 | end |
| 323 | if ($row->mode_line_p) |
| 324 | printf " MODEL" |
| 325 | end |
| 326 | if ($row->continued_p) |
| 327 | printf " CONT" |
| 328 | end |
| 329 | if ($row-> truncated_on_left_p) |
| 330 | printf " TRUNC:L" |
| 331 | end |
| 332 | if ($row-> truncated_on_right_p) |
| 333 | printf " TRUNC:R" |
| 334 | end |
| 335 | if ($row->starts_in_middle_of_char_p) |
| 336 | printf " STARTMID" |
| 337 | end |
| 338 | if ($row->ends_in_middle_of_char_p) |
| 339 | printf " ENDMID" |
| 340 | end |
| 341 | if ($row->ends_in_newline_from_string_p) |
| 342 | printf " ENDNLFS" |
| 343 | end |
| 344 | if ($row->ends_at_zv_p) |
| 345 | printf " ENDZV" |
| 346 | end |
| 347 | if ($row->overlapped_p) |
| 348 | printf " OLAPD" |
| 349 | end |
| 350 | if ($row->overlapping_p) |
| 351 | printf " OLAPNG" |
| 352 | end |
| 353 | printf "\n" |
| 354 | end |
| 355 | document prowx |
| 356 | Pretty print information about glyph_row. |
| 357 | Takes one argument, a row object or pointer. |
| 358 | end |
| 359 | |
| 360 | define prow |
| 361 | prowx row |
| 362 | end |
| 363 | document prow |
| 364 | Pretty print information about glyph_row in row. |
| 365 | end |
| 366 | |
| 367 | |
| 368 | define pcursorx |
| 369 | set $cp = $arg0 |
| 370 | printf "y=%d x=%d vpos=%d hpos=%d", $cp->y, $cp->x, $cp->vpos, $cp->hpos |
| 371 | end |
| 372 | document pcursorx |
| 373 | Pretty print a window cursor. |
| 374 | end |
| 375 | |
| 376 | define pcursor |
| 377 | printf "output: " |
| 378 | pcursorx output_cursor |
| 379 | printf "\n" |
| 380 | end |
| 381 | document pcursor |
| 382 | Pretty print the output_cursor. |
| 383 | end |
| 384 | |
| 385 | define pwinx |
| 386 | set $w = $arg0 |
| 387 | xgetint $w->sequence_number |
| 388 | if ($w->mini_p != Qnil) |
| 389 | printf "Mini " |
| 390 | end |
| 391 | printf "Window %d ", $int |
| 392 | xgetptr $w->buffer |
| 393 | set $tem = (struct buffer *) $ptr |
| 394 | xgetptr $tem->name_ |
| 395 | printf "%s", ((struct Lisp_String *) $ptr)->data |
| 396 | printf "\n" |
| 397 | xgetptr $w->start |
| 398 | set $tem = (struct Lisp_Marker *) $ptr |
| 399 | printf "start=%d end:", $tem->charpos |
| 400 | if ($w->window_end_valid != Qnil) |
| 401 | xgetint $w->window_end_pos |
| 402 | printf "pos=%d", $int |
| 403 | xgetint $w->window_end_vpos |
| 404 | printf " vpos=%d", $int |
| 405 | else |
| 406 | printf "invalid" |
| 407 | end |
| 408 | printf " vscroll=%d", $w->vscroll |
| 409 | if ($w->force_start != Qnil) |
| 410 | printf " FORCE_START" |
| 411 | end |
| 412 | if ($w->must_be_updated_p) |
| 413 | printf " MUST_UPD" |
| 414 | end |
| 415 | printf "\n" |
| 416 | printf "cursor: " |
| 417 | pcursorx $w->cursor |
| 418 | printf " phys: " |
| 419 | pcursorx $w->phys_cursor |
| 420 | if ($w->phys_cursor_on_p) |
| 421 | printf " ON" |
| 422 | else |
| 423 | printf " OFF" |
| 424 | end |
| 425 | printf " blk=" |
| 426 | if ($w->last_cursor_off_p != $w->cursor_off_p) |
| 427 | if ($w->last_cursor_off_p) |
| 428 | printf "ON->" |
| 429 | else |
| 430 | printf "OFF->" |
| 431 | end |
| 432 | end |
| 433 | if ($w->cursor_off_p) |
| 434 | printf "ON" |
| 435 | else |
| 436 | printf "OFF" |
| 437 | end |
| 438 | printf "\n" |
| 439 | end |
| 440 | document pwinx |
| 441 | Pretty print a window structure. |
| 442 | Takes one argument, a pointer to a window structure. |
| 443 | end |
| 444 | |
| 445 | define pwin |
| 446 | pwinx w |
| 447 | end |
| 448 | document pwin |
| 449 | Pretty print window structure w. |
| 450 | end |
| 451 | |
| 452 | define pbiditype |
| 453 | if ($arg0 == 0) |
| 454 | printf "UNDEF" |
| 455 | end |
| 456 | if ($arg0 == 1) |
| 457 | printf "L" |
| 458 | end |
| 459 | if ($arg0 == 2) |
| 460 | printf "R" |
| 461 | end |
| 462 | if ($arg0 == 3) |
| 463 | printf "EN" |
| 464 | end |
| 465 | if ($arg0 == 4) |
| 466 | printf "AN" |
| 467 | end |
| 468 | if ($arg0 == 5) |
| 469 | printf "BN" |
| 470 | end |
| 471 | if ($arg0 == 6) |
| 472 | printf "B" |
| 473 | end |
| 474 | if ($arg0 < 0 || $arg0 > 6) |
| 475 | printf "%d??", $arg0 |
| 476 | end |
| 477 | end |
| 478 | document pbiditype |
| 479 | Print textual description of bidi type given as first argument. |
| 480 | end |
| 481 | |
| 482 | define pgx |
| 483 | set $g = $arg0 |
| 484 | # CHAR_GLYPH |
| 485 | if ($g.type == 0) |
| 486 | if ($g.u.ch >= ' ' && $g.u.ch < 127) |
| 487 | printf "CHAR[%c]", $g.u.ch |
| 488 | else |
| 489 | printf "CHAR[0x%x]", $g.u.ch |
| 490 | end |
| 491 | end |
| 492 | # COMPOSITE_GLYPH |
| 493 | if ($g.type == 1) |
| 494 | printf "COMP[%d (%d..%d)]", $g.u.cmp.id, $g.slice.cmp.from, $g.slice.cmp.to |
| 495 | end |
| 496 | # GLYPHLESS_GLYPH |
| 497 | if ($g.type == 2) |
| 498 | printf "GLYPHLESS[" |
| 499 | if ($g.u.glyphless.method == 0) |
| 500 | printf "THIN]" |
| 501 | end |
| 502 | if ($g.u.glyphless.method == 1) |
| 503 | printf "EMPTY]" |
| 504 | end |
| 505 | if ($g.u.glyphless.method == 2) |
| 506 | printf "ACRO]" |
| 507 | end |
| 508 | if ($g.u.glyphless.method == 3) |
| 509 | printf "HEX]" |
| 510 | end |
| 511 | end |
| 512 | # IMAGE_GLYPH |
| 513 | if ($g.type == 3) |
| 514 | printf "IMAGE[%d]", $g.u.img_id |
| 515 | end |
| 516 | # STRETCH_GLYPH |
| 517 | if ($g.type == 4) |
| 518 | printf "STRETCH[%d+%d]", $g.u.stretch.height, $g.u.stretch.ascent |
| 519 | end |
| 520 | xgettype ($g.object) |
| 521 | if ($type == Lisp_String) |
| 522 | printf " str=%x[%d]", $g.object, $g.charpos |
| 523 | else |
| 524 | printf " pos=%d", $g.charpos |
| 525 | end |
| 526 | # For characters, print their resolved level and bidi type |
| 527 | if ($g.type == 0) |
| 528 | printf " blev=%d,btyp=", $g.resolved_level |
| 529 | pbiditype $g.bidi_type |
| 530 | end |
| 531 | printf " w=%d a+d=%d+%d", $g.pixel_width, $g.ascent, $g.descent |
| 532 | # If not DEFAULT_FACE_ID |
| 533 | if ($g.face_id != 0) |
| 534 | printf " face=%d", $g.face_id |
| 535 | end |
| 536 | if ($g.voffset) |
| 537 | printf " vof=%d", $g.voffset |
| 538 | end |
| 539 | if ($g.multibyte_p) |
| 540 | printf " MB" |
| 541 | end |
| 542 | if ($g.padding_p) |
| 543 | printf " PAD" |
| 544 | end |
| 545 | if ($g.glyph_not_available_p) |
| 546 | printf " N/A" |
| 547 | end |
| 548 | if ($g.overlaps_vertically_p) |
| 549 | printf " OVL" |
| 550 | end |
| 551 | if ($g.avoid_cursor_p) |
| 552 | printf " AVOID" |
| 553 | end |
| 554 | if ($g.left_box_line_p) |
| 555 | printf " [" |
| 556 | end |
| 557 | if ($g.right_box_line_p) |
| 558 | printf " ]" |
| 559 | end |
| 560 | if ($g.slice.img.x || $g.slice.img.y || $g.slice.img.width || $g.slice.img.height) |
| 561 | printf " slice=%d,%d,%d,%d" ,$g.slice.img.x, $g.slice.img.y, $g.slice.img.width, $g.slice.img.height |
| 562 | end |
| 563 | printf "\n" |
| 564 | end |
| 565 | document pgx |
| 566 | Pretty print a glyph structure. |
| 567 | Takes one argument, a pointer to a glyph structure. |
| 568 | end |
| 569 | |
| 570 | define pg |
| 571 | set $pgidx = 0 |
| 572 | pgx glyph |
| 573 | end |
| 574 | document pg |
| 575 | Pretty print glyph structure glyph. |
| 576 | end |
| 577 | |
| 578 | define pgi |
| 579 | set $pgidx = $arg0 |
| 580 | pgx (&glyph[$pgidx]) |
| 581 | end |
| 582 | document pgi |
| 583 | Pretty print glyph structure glyph[I]. |
| 584 | Takes one argument, a integer I. |
| 585 | end |
| 586 | |
| 587 | define pgn |
| 588 | set $pgidx = $pgidx + 1 |
| 589 | pgx (&glyph[$pgidx]) |
| 590 | end |
| 591 | document pgn |
| 592 | Pretty print next glyph structure. |
| 593 | end |
| 594 | |
| 595 | define pgrowx |
| 596 | set $row = $arg0 |
| 597 | set $area = 0 |
| 598 | set $xofs = $row->x |
| 599 | while ($area < 3) |
| 600 | set $used = $row->used[$area] |
| 601 | if ($used > 0) |
| 602 | set $gl0 = $row->glyphs[$area] |
| 603 | set $pgidx = 0 |
| 604 | printf "%s: %d glyphs\n", ($area == 0 ? "LEFT" : $area == 2 ? "RIGHT" : "TEXT"), $used |
| 605 | while ($pgidx < $used) |
| 606 | printf "%3d %4d: ", $pgidx, $xofs |
| 607 | pgx $gl0[$pgidx] |
| 608 | set $xofs = $xofs + $gl0[$pgidx]->pixel_width |
| 609 | set $pgidx = $pgidx + 1 |
| 610 | end |
| 611 | end |
| 612 | set $area = $area + 1 |
| 613 | end |
| 614 | end |
| 615 | document pgrowx |
| 616 | Pretty print all glyphs in a row structure. |
| 617 | Takes one argument, a pointer to a row structure. |
| 618 | end |
| 619 | |
| 620 | define pgrow |
| 621 | pgrowx row |
| 622 | end |
| 623 | document pgrow |
| 624 | Pretty print all glyphs in row structure row. |
| 625 | end |
| 626 | |
| 627 | define pgrowit |
| 628 | pgrowx it->glyph_row |
| 629 | end |
| 630 | document pgrowit |
| 631 | Pretty print all glyphs in it->glyph_row. |
| 632 | end |
| 633 | |
| 634 | define prowlims |
| 635 | printf "edges=(%d,%d),r2l=%d,cont=%d,trunc=(%d,%d),at_zv=%d\n", $arg0->minpos.charpos, $arg0->maxpos.charpos, $arg0->reversed_p, $arg0->continued_p, $arg0->truncated_on_left_p, $arg0->truncated_on_right_p, $arg0->ends_at_zv_p |
| 636 | end |
| 637 | document prowlims |
| 638 | Print important attributes of a glyph_row structure. |
| 639 | Takes one argument, a pointer to a glyph_row structure. |
| 640 | end |
| 641 | |
| 642 | define pmtxrows |
| 643 | set $mtx = $arg0 |
| 644 | set $gl = $mtx->rows |
| 645 | set $glend = $mtx->rows + $mtx->nrows - 1 |
| 646 | set $i = 0 |
| 647 | while ($gl < $glend) |
| 648 | printf "%d: ", $i |
| 649 | prowlims $gl |
| 650 | set $gl = $gl + 1 |
| 651 | set $i = $i + 1 |
| 652 | end |
| 653 | end |
| 654 | document pmtxrows |
| 655 | Print data about glyph rows in a glyph matrix. |
| 656 | Takes one argument, a pointer to a glyph_matrix structure. |
| 657 | end |
| 658 | |
| 659 | define xtype |
| 660 | xgettype $ |
| 661 | output $type |
| 662 | echo \n |
| 663 | if $type == Lisp_Misc |
| 664 | xmisctype |
| 665 | else |
| 666 | if $type == Lisp_Vectorlike |
| 667 | xvectype |
| 668 | end |
| 669 | end |
| 670 | end |
| 671 | document xtype |
| 672 | Print the type of $, assuming it is an Emacs Lisp value. |
| 673 | If the first type printed is Lisp_Vector or Lisp_Misc, |
| 674 | a second line gives the more precise type. |
| 675 | end |
| 676 | |
| 677 | define xvectype |
| 678 | xgetptr $ |
| 679 | set $size = ((struct Lisp_Vector *) $ptr)->header.size |
| 680 | output ($size & PVEC_FLAG) ? (enum pvec_type) ($size & PVEC_TYPE_MASK) : $size & ~gdb_array_mark_flag |
| 681 | echo \n |
| 682 | end |
| 683 | document xvectype |
| 684 | Print the size or vector subtype of $. |
| 685 | This command assumes that $ is a vector or pseudovector. |
| 686 | end |
| 687 | |
| 688 | define xmisctype |
| 689 | xgetptr $ |
| 690 | output (enum Lisp_Misc_Type) (((struct Lisp_Free *) $ptr)->type) |
| 691 | echo \n |
| 692 | end |
| 693 | document xmisctype |
| 694 | Assume that $ is some misc type and print its specific type. |
| 695 | end |
| 696 | |
| 697 | define xint |
| 698 | xgetint $ |
| 699 | print $int |
| 700 | end |
| 701 | document xint |
| 702 | Print $ as an Emacs Lisp integer. This gets the sign right. |
| 703 | end |
| 704 | |
| 705 | define xptr |
| 706 | xgetptr $ |
| 707 | print (void *) $ptr |
| 708 | end |
| 709 | document xptr |
| 710 | Print the pointer portion of an Emacs Lisp value in $. |
| 711 | end |
| 712 | |
| 713 | define xmarker |
| 714 | xgetptr $ |
| 715 | print (struct Lisp_Marker *) $ptr |
| 716 | end |
| 717 | document xmarker |
| 718 | Print $ as a marker pointer. |
| 719 | This command assumes that $ is an Emacs Lisp marker value. |
| 720 | end |
| 721 | |
| 722 | define xoverlay |
| 723 | xgetptr $ |
| 724 | print (struct Lisp_Overlay *) $ptr |
| 725 | end |
| 726 | document xoverlay |
| 727 | Print $ as a overlay pointer. |
| 728 | This command assumes that $ is an Emacs Lisp overlay value. |
| 729 | end |
| 730 | |
| 731 | define xmiscfree |
| 732 | xgetptr $ |
| 733 | print (struct Lisp_Free *) $ptr |
| 734 | end |
| 735 | document xmiscfree |
| 736 | Print $ as a misc free-cell pointer. |
| 737 | This command assumes that $ is an Emacs Lisp Misc value. |
| 738 | end |
| 739 | |
| 740 | define xintfwd |
| 741 | xgetptr $ |
| 742 | print (struct Lisp_Intfwd *) $ptr |
| 743 | end |
| 744 | document xintfwd |
| 745 | Print $ as an integer forwarding pointer. |
| 746 | This command assumes that $ is an Emacs Lisp Misc value. |
| 747 | end |
| 748 | |
| 749 | define xboolfwd |
| 750 | xgetptr $ |
| 751 | print (struct Lisp_Boolfwd *) $ptr |
| 752 | end |
| 753 | document xboolfwd |
| 754 | Print $ as a boolean forwarding pointer. |
| 755 | This command assumes that $ is an Emacs Lisp Misc value. |
| 756 | end |
| 757 | |
| 758 | define xobjfwd |
| 759 | xgetptr $ |
| 760 | print (struct Lisp_Objfwd *) $ptr |
| 761 | end |
| 762 | document xobjfwd |
| 763 | Print $ as an object forwarding pointer. |
| 764 | This command assumes that $ is an Emacs Lisp Misc value. |
| 765 | end |
| 766 | |
| 767 | define xbufobjfwd |
| 768 | xgetptr $ |
| 769 | print (struct Lisp_Buffer_Objfwd *) $ptr |
| 770 | end |
| 771 | document xbufobjfwd |
| 772 | Print $ as a buffer-local object forwarding pointer. |
| 773 | This command assumes that $ is an Emacs Lisp Misc value. |
| 774 | end |
| 775 | |
| 776 | define xkbobjfwd |
| 777 | xgetptr $ |
| 778 | print (struct Lisp_Kboard_Objfwd *) $ptr |
| 779 | end |
| 780 | document xkbobjfwd |
| 781 | Print $ as a kboard-local object forwarding pointer. |
| 782 | This command assumes that $ is an Emacs Lisp Misc value. |
| 783 | end |
| 784 | |
| 785 | define xbuflocal |
| 786 | xgetptr $ |
| 787 | print (struct Lisp_Buffer_Local_Value *) $ptr |
| 788 | end |
| 789 | document xbuflocal |
| 790 | Print $ as a buffer-local-value pointer. |
| 791 | This command assumes that $ is an Emacs Lisp Misc value. |
| 792 | end |
| 793 | |
| 794 | define xsymbol |
| 795 | set $sym = $ |
| 796 | xgetptr $sym |
| 797 | print (struct Lisp_Symbol *) $ptr |
| 798 | xprintsym $sym |
| 799 | echo \n |
| 800 | end |
| 801 | document xsymbol |
| 802 | Print the name and address of the symbol $. |
| 803 | This command assumes that $ is an Emacs Lisp symbol value. |
| 804 | end |
| 805 | |
| 806 | define xstring |
| 807 | xgetptr $ |
| 808 | print (struct Lisp_String *) $ptr |
| 809 | xprintstr $ |
| 810 | echo \n |
| 811 | end |
| 812 | document xstring |
| 813 | Print the contents and address of the string $. |
| 814 | This command assumes that $ is an Emacs Lisp string value. |
| 815 | end |
| 816 | |
| 817 | define xvector |
| 818 | xgetptr $ |
| 819 | print (struct Lisp_Vector *) $ptr |
| 820 | output ($->header.size > 50) ? 0 : ($->contents[0])@($->header.size & ~gdb_array_mark_flag) |
| 821 | echo \n |
| 822 | end |
| 823 | document xvector |
| 824 | Print the contents and address of the vector $. |
| 825 | This command assumes that $ is an Emacs Lisp vector value. |
| 826 | end |
| 827 | |
| 828 | define xprocess |
| 829 | xgetptr $ |
| 830 | print (struct Lisp_Process *) $ptr |
| 831 | output *$ |
| 832 | echo \n |
| 833 | end |
| 834 | document xprocess |
| 835 | Print the address of the struct Lisp_process to which $ points. |
| 836 | This command assumes that $ is a Lisp_Object. |
| 837 | end |
| 838 | |
| 839 | define xframe |
| 840 | xgetptr $ |
| 841 | print (struct frame *) $ptr |
| 842 | xgetptr $->name |
| 843 | set $ptr = (struct Lisp_String *) $ptr |
| 844 | xprintstr $ptr |
| 845 | echo \n |
| 846 | end |
| 847 | document xframe |
| 848 | Print $ as a frame pointer. |
| 849 | This command assumes $ is an Emacs Lisp frame value. |
| 850 | end |
| 851 | |
| 852 | define xcompiled |
| 853 | xgetptr $ |
| 854 | print (struct Lisp_Vector *) $ptr |
| 855 | output ($->contents[0])@($->header.size & 0xff) |
| 856 | end |
| 857 | document xcompiled |
| 858 | Print $ as a compiled function pointer. |
| 859 | This command assumes that $ is an Emacs Lisp compiled value. |
| 860 | end |
| 861 | |
| 862 | define xwindow |
| 863 | xgetptr $ |
| 864 | print (struct window *) $ptr |
| 865 | set $window = (struct window *) $ptr |
| 866 | xgetint $window->total_cols |
| 867 | set $width=$int |
| 868 | xgetint $window->total_lines |
| 869 | set $height=$int |
| 870 | xgetint $window->left_col |
| 871 | set $left=$int |
| 872 | xgetint $window->top_line |
| 873 | set $top=$int |
| 874 | printf "%dx%d+%d+%d\n", $width, $height, $left, $top |
| 875 | end |
| 876 | document xwindow |
| 877 | Print $ as a window pointer, assuming it is an Emacs Lisp window value. |
| 878 | Print the window's position as "WIDTHxHEIGHT+LEFT+TOP". |
| 879 | end |
| 880 | |
| 881 | define xwinconfig |
| 882 | xgetptr $ |
| 883 | print (struct save_window_data *) $ptr |
| 884 | end |
| 885 | document xwinconfig |
| 886 | Print $ as a window configuration pointer. |
| 887 | This command assumes that $ is an Emacs Lisp window configuration value. |
| 888 | end |
| 889 | |
| 890 | define xsubr |
| 891 | xgetptr $ |
| 892 | print (struct Lisp_Subr *) $ptr |
| 893 | output *$ |
| 894 | echo \n |
| 895 | end |
| 896 | document xsubr |
| 897 | Print the address of the subr which the Lisp_Object $ points to. |
| 898 | end |
| 899 | |
| 900 | define xchartable |
| 901 | xgetptr $ |
| 902 | print (struct Lisp_Char_Table *) $ptr |
| 903 | printf "Purpose: " |
| 904 | xprintsym $->purpose |
| 905 | printf " %d extra slots", ($->header.size & 0x1ff) - 68 |
| 906 | echo \n |
| 907 | end |
| 908 | document xchartable |
| 909 | Print the address of the char-table $, and its purpose. |
| 910 | This command assumes that $ is an Emacs Lisp char-table value. |
| 911 | end |
| 912 | |
| 913 | define xsubchartable |
| 914 | xgetptr $ |
| 915 | print (struct Lisp_Sub_Char_Table *) $ptr |
| 916 | xgetint $->depth |
| 917 | set $depth = $int |
| 918 | xgetint $->min_char |
| 919 | printf "Depth: %d, Min char: %d (0x%x)\n", $depth, $int, $int |
| 920 | end |
| 921 | document xsubchartable |
| 922 | Print the address of the sub-char-table $, its depth and min-char. |
| 923 | This command assumes that $ is an Emacs Lisp sub-char-table value. |
| 924 | end |
| 925 | |
| 926 | define xboolvector |
| 927 | xgetptr $ |
| 928 | print (struct Lisp_Bool_Vector *) $ptr |
| 929 | output ($->header.size > 256) ? 0 : ($->data[0])@((($->header.size & ~gdb_array_mark_flag) + 7)/ 8) |
| 930 | echo \n |
| 931 | end |
| 932 | document xboolvector |
| 933 | Print the contents and address of the bool-vector $. |
| 934 | This command assumes that $ is an Emacs Lisp bool-vector value. |
| 935 | end |
| 936 | |
| 937 | define xbuffer |
| 938 | xgetptr $ |
| 939 | print (struct buffer *) $ptr |
| 940 | xgetptr $->name_ |
| 941 | output ((struct Lisp_String *) $ptr)->data |
| 942 | echo \n |
| 943 | end |
| 944 | document xbuffer |
| 945 | Set $ as a buffer pointer and the name of the buffer. |
| 946 | This command assumes $ is an Emacs Lisp buffer value. |
| 947 | end |
| 948 | |
| 949 | define xhashtable |
| 950 | xgetptr $ |
| 951 | print (struct Lisp_Hash_Table *) $ptr |
| 952 | end |
| 953 | document xhashtable |
| 954 | Set $ as a hash table pointer. |
| 955 | This command assumes that $ is an Emacs Lisp hash table value. |
| 956 | end |
| 957 | |
| 958 | define xcons |
| 959 | xgetptr $ |
| 960 | print (struct Lisp_Cons *) $ptr |
| 961 | output/x *$ |
| 962 | echo \n |
| 963 | end |
| 964 | document xcons |
| 965 | Print the contents of $ as an Emacs Lisp cons. |
| 966 | end |
| 967 | |
| 968 | define nextcons |
| 969 | p $.u.cdr |
| 970 | xcons |
| 971 | end |
| 972 | document nextcons |
| 973 | Print the contents of the next cell in a list. |
| 974 | This command assumes that the last thing you printed was a cons cell contents |
| 975 | (type struct Lisp_Cons) or a pointer to one. |
| 976 | end |
| 977 | define xcar |
| 978 | xgetptr $ |
| 979 | xgettype $ |
| 980 | print/x ($type == Lisp_Cons ? ((struct Lisp_Cons *) $ptr)->car : 0) |
| 981 | end |
| 982 | document xcar |
| 983 | Assume that $ is an Emacs Lisp pair and print its car. |
| 984 | end |
| 985 | |
| 986 | define xcdr |
| 987 | xgetptr $ |
| 988 | xgettype $ |
| 989 | print/x ($type == Lisp_Cons ? ((struct Lisp_Cons *) $ptr)->u.cdr : 0) |
| 990 | end |
| 991 | document xcdr |
| 992 | Assume that $ is an Emacs Lisp pair and print its cdr. |
| 993 | end |
| 994 | |
| 995 | define xlist |
| 996 | xgetptr $ |
| 997 | set $cons = (struct Lisp_Cons *) $ptr |
| 998 | xgetptr Qnil |
| 999 | set $nil = $ptr |
| 1000 | set $i = 0 |
| 1001 | while $cons != $nil && $i < 10 |
| 1002 | p/x $cons->car |
| 1003 | xpr |
| 1004 | xgetptr $cons->u.cdr |
| 1005 | set $cons = (struct Lisp_Cons *) $ptr |
| 1006 | set $i = $i + 1 |
| 1007 | printf "---\n" |
| 1008 | end |
| 1009 | if $cons == $nil |
| 1010 | printf "nil\n" |
| 1011 | else |
| 1012 | printf "...\n" |
| 1013 | p $ptr |
| 1014 | end |
| 1015 | end |
| 1016 | document xlist |
| 1017 | Print $ assuming it is a list. |
| 1018 | end |
| 1019 | |
| 1020 | define xfloat |
| 1021 | xgetptr $ |
| 1022 | print ((struct Lisp_Float *) $ptr)->u.data |
| 1023 | end |
| 1024 | document xfloat |
| 1025 | Print $ assuming it is a lisp floating-point number. |
| 1026 | end |
| 1027 | |
| 1028 | define xscrollbar |
| 1029 | xgetptr $ |
| 1030 | print (struct scrollbar *) $ptr |
| 1031 | output *$ |
| 1032 | echo \n |
| 1033 | end |
| 1034 | document xscrollbar |
| 1035 | Print $ as a scrollbar pointer. |
| 1036 | end |
| 1037 | |
| 1038 | define xpr |
| 1039 | xtype |
| 1040 | if $type == Lisp_Int |
| 1041 | xint |
| 1042 | end |
| 1043 | if $type == Lisp_Symbol |
| 1044 | xsymbol |
| 1045 | end |
| 1046 | if $type == Lisp_String |
| 1047 | xstring |
| 1048 | end |
| 1049 | if $type == Lisp_Cons |
| 1050 | xcons |
| 1051 | end |
| 1052 | if $type == Lisp_Float |
| 1053 | xfloat |
| 1054 | end |
| 1055 | if $type == Lisp_Misc |
| 1056 | set $misc = (enum Lisp_Misc_Type) (((struct Lisp_Free *) $ptr)->type) |
| 1057 | if $misc == Lisp_Misc_Free |
| 1058 | xmiscfree |
| 1059 | end |
| 1060 | if $misc == Lisp_Misc_Boolfwd |
| 1061 | xboolfwd |
| 1062 | end |
| 1063 | if $misc == Lisp_Misc_Marker |
| 1064 | xmarker |
| 1065 | end |
| 1066 | if $misc == Lisp_Misc_Intfwd |
| 1067 | xintfwd |
| 1068 | end |
| 1069 | if $misc == Lisp_Misc_Boolfwd |
| 1070 | xboolfwd |
| 1071 | end |
| 1072 | if $misc == Lisp_Misc_Objfwd |
| 1073 | xobjfwd |
| 1074 | end |
| 1075 | if $misc == Lisp_Misc_Buffer_Objfwd |
| 1076 | xbufobjfwd |
| 1077 | end |
| 1078 | if $misc == Lisp_Misc_Buffer_Local_Value |
| 1079 | xbuflocal |
| 1080 | end |
| 1081 | # if $misc == Lisp_Misc_Some_Buffer_Local_Value |
| 1082 | # xvalue |
| 1083 | # end |
| 1084 | if $misc == Lisp_Misc_Overlay |
| 1085 | xoverlay |
| 1086 | end |
| 1087 | if $misc == Lisp_Misc_Kboard_Objfwd |
| 1088 | xkbobjfwd |
| 1089 | end |
| 1090 | # if $misc == Lisp_Misc_Save_Value |
| 1091 | # xsavevalue |
| 1092 | # end |
| 1093 | end |
| 1094 | if $type == Lisp_Vectorlike |
| 1095 | set $size = ((struct Lisp_Vector *) $ptr)->header.size |
| 1096 | if ($size & PVEC_FLAG) |
| 1097 | set $vec = (enum pvec_type) ($size & PVEC_TYPE_MASK) |
| 1098 | if $vec == PVEC_NORMAL_VECTOR |
| 1099 | xvector |
| 1100 | end |
| 1101 | if $vec == PVEC_PROCESS |
| 1102 | xprocess |
| 1103 | end |
| 1104 | if $vec == PVEC_FRAME |
| 1105 | xframe |
| 1106 | end |
| 1107 | if $vec == PVEC_COMPILED |
| 1108 | xcompiled |
| 1109 | end |
| 1110 | if $vec == PVEC_WINDOW |
| 1111 | xwindow |
| 1112 | end |
| 1113 | if $vec == PVEC_WINDOW_CONFIGURATION |
| 1114 | xwinconfig |
| 1115 | end |
| 1116 | if $vec == PVEC_SUBR |
| 1117 | xsubr |
| 1118 | end |
| 1119 | if $vec == PVEC_CHAR_TABLE |
| 1120 | xchartable |
| 1121 | end |
| 1122 | if $vec == PVEC_BOOL_VECTOR |
| 1123 | xboolvector |
| 1124 | end |
| 1125 | if $vec == PVEC_BUFFER |
| 1126 | xbuffer |
| 1127 | end |
| 1128 | if $vec == PVEC_HASH_TABLE |
| 1129 | xhashtable |
| 1130 | end |
| 1131 | else |
| 1132 | xvector |
| 1133 | end |
| 1134 | end |
| 1135 | end |
| 1136 | document xpr |
| 1137 | Print $ as a lisp object of any type. |
| 1138 | end |
| 1139 | |
| 1140 | define xprintstr |
| 1141 | set $data = (char *) $arg0->data |
| 1142 | output ($arg0->size > 1000) ? 0 : ($data[0])@($arg0->size_byte < 0 ? $arg0->size & ~gdb_array_mark_flag : $arg0->size_byte) |
| 1143 | end |
| 1144 | |
| 1145 | define xprintsym |
| 1146 | xgetptr $arg0 |
| 1147 | set $sym = (struct Lisp_Symbol *) $ptr |
| 1148 | xgetptr $sym->xname |
| 1149 | set $sym_name = (struct Lisp_String *) $ptr |
| 1150 | xprintstr $sym_name |
| 1151 | end |
| 1152 | document xprintsym |
| 1153 | Print argument as a symbol. |
| 1154 | end |
| 1155 | |
| 1156 | define xcoding |
| 1157 | set $tmp = (struct Lisp_Hash_Table *) ((Vcoding_system_hash_table & $valmask) | gdb_data_seg_bits) |
| 1158 | set $tmp = (struct Lisp_Vector *) (($tmp->key_and_value & $valmask) | gdb_data_seg_bits) |
| 1159 | set $name = $tmp->contents[$arg0 * 2] |
| 1160 | print $name |
| 1161 | pr |
| 1162 | print $tmp->contents[$arg0 * 2 + 1] |
| 1163 | pr |
| 1164 | end |
| 1165 | document xcoding |
| 1166 | Print the name and attributes of coding system that has ID (argument). |
| 1167 | end |
| 1168 | |
| 1169 | define xcharset |
| 1170 | set $tmp = (struct Lisp_Hash_Table *) ((Vcharset_hash_table & $valmask) | gdb_data_seg_bits) |
| 1171 | set $tmp = (struct Lisp_Vector *) (($tmp->key_and_value & $valmask) | gdb_data_seg_bits) |
| 1172 | p $tmp->contents[charset_table[$arg0].hash_index * 2] |
| 1173 | pr |
| 1174 | end |
| 1175 | document xcharset |
| 1176 | Print the name of charset that has ID (argument). |
| 1177 | end |
| 1178 | |
| 1179 | define xfontset |
| 1180 | xgetptr $ |
| 1181 | set $tbl = (struct Lisp_Char_Table *) $ptr |
| 1182 | print $tbl |
| 1183 | xgetint $tbl->extras[0] |
| 1184 | printf " ID:%d", $int |
| 1185 | xgettype $tbl->extras[1] |
| 1186 | xgetptr $tbl->extras[1] |
| 1187 | if $type == Lisp_String |
| 1188 | set $ptr = (struct Lisp_String *) $ptr |
| 1189 | printf " Name:" |
| 1190 | xprintstr $ptr |
| 1191 | else |
| 1192 | xgetptr $tbl->extras[2] |
| 1193 | set $ptr = (struct Lisp_Char_Table *) $ptr |
| 1194 | xgetptr $ptr->extras[1] |
| 1195 | set $ptr = (struct Lisp_String *) $ptr |
| 1196 | printf " Realized from:" |
| 1197 | xprintstr $ptr |
| 1198 | end |
| 1199 | echo \n |
| 1200 | end |
| 1201 | |
| 1202 | define xfont |
| 1203 | xgetptr $ |
| 1204 | set $size = (((struct Lisp_Vector *) $ptr)->header.size & 0x1FF) |
| 1205 | if $size == FONT_SPEC_MAX |
| 1206 | print (struct font_spec *) $ptr |
| 1207 | else |
| 1208 | if $size == FONT_ENTITY_MAX |
| 1209 | print (struct font_entity *) $ptr |
| 1210 | else |
| 1211 | print (struct font *) $ptr |
| 1212 | end |
| 1213 | end |
| 1214 | end |
| 1215 | document xfont |
| 1216 | Print $ assuming it is a list font (font-spec, font-entity, or font-object). |
| 1217 | end |
| 1218 | |
| 1219 | define xbacktrace |
| 1220 | set $bt = backtrace_list |
| 1221 | while $bt |
| 1222 | xgettype (*$bt->function) |
| 1223 | if $type == Lisp_Symbol |
| 1224 | xprintsym (*$bt->function) |
| 1225 | printf " (0x%x)\n", $bt->args |
| 1226 | else |
| 1227 | xgetptr *$bt->function |
| 1228 | printf "0x%x ", $ptr |
| 1229 | if $type == Lisp_Vectorlike |
| 1230 | xgetptr (*$bt->function) |
| 1231 | set $size = ((struct Lisp_Vector *) $ptr)->header.size |
| 1232 | output ($size & PVEC_FLAG) ? (enum pvec_type) ($size & PVEC_TYPE_MASK) : $size & ~gdb_array_mark_flag |
| 1233 | else |
| 1234 | printf "Lisp type %d", $type |
| 1235 | end |
| 1236 | echo \n |
| 1237 | end |
| 1238 | set $bt = $bt->next |
| 1239 | end |
| 1240 | end |
| 1241 | document xbacktrace |
| 1242 | Print a backtrace of Lisp function calls from backtrace_list. |
| 1243 | Set a breakpoint at Fsignal and call this to see from where |
| 1244 | an error was signaled. |
| 1245 | end |
| 1246 | |
| 1247 | define xprintbytestr |
| 1248 | set $data = (char *) $arg0->data |
| 1249 | printf "Bytecode: " |
| 1250 | output/u ($arg0->size > 1000) ? 0 : ($data[0])@($arg0->size_byte < 0 ? $arg0->size & ~gdb_array_mark_flag : $arg0->size_byte) |
| 1251 | end |
| 1252 | document xprintbytestr |
| 1253 | Print a string of byte code. |
| 1254 | end |
| 1255 | |
| 1256 | define xwhichsymbols |
| 1257 | set $output_debug = print_output_debug_flag |
| 1258 | set print_output_debug_flag = 0 |
| 1259 | set safe_debug_print (which_symbols ($arg0, $arg1)) |
| 1260 | set print_output_debug_flag = $output_debug |
| 1261 | end |
| 1262 | document xwhichsymbols |
| 1263 | Print symbols which references a given lisp object |
| 1264 | either as its symbol value or symbol function. |
| 1265 | Call with two arguments: the lisp object and the |
| 1266 | maximum number of symbols referencing it to produce. |
| 1267 | end |
| 1268 | |
| 1269 | define xbytecode |
| 1270 | set $bt = byte_stack_list |
| 1271 | while $bt |
| 1272 | xgetptr $bt->byte_string |
| 1273 | set $ptr = (struct Lisp_String *) $ptr |
| 1274 | xprintbytestr $ptr |
| 1275 | printf "\n0x%x => ", $bt->byte_string |
| 1276 | xwhichsymbols $bt->byte_string 5 |
| 1277 | set $bt = $bt->next |
| 1278 | end |
| 1279 | end |
| 1280 | document xbytecode |
| 1281 | Print a backtrace of the byte code stack. |
| 1282 | end |
| 1283 | |
| 1284 | # Show Lisp backtrace after normal backtrace. |
| 1285 | define hookpost-backtrace |
| 1286 | set $bt = backtrace_list |
| 1287 | if $bt |
| 1288 | echo \n |
| 1289 | echo Lisp Backtrace:\n |
| 1290 | xbacktrace |
| 1291 | end |
| 1292 | end |
| 1293 | |
| 1294 | define xreload |
| 1295 | set $tagmask = (((long)1 << gdb_gctypebits) - 1) |
| 1296 | set $valmask = gdb_use_lsb ? ~($tagmask) : ((long)1 << gdb_valbits) - 1 |
| 1297 | end |
| 1298 | document xreload |
| 1299 | When starting Emacs a second time in the same gdb session under |
| 1300 | FreeBSD 2.2.5, gdb 4.13, $valmask have lost |
| 1301 | their values. (The same happens on current (2000) versions of GNU/Linux |
| 1302 | with gdb 5.0.) |
| 1303 | This function reloads them. |
| 1304 | end |
| 1305 | xreload |
| 1306 | |
| 1307 | # Flush display (X only) |
| 1308 | define ff |
| 1309 | set x_flush (0) |
| 1310 | end |
| 1311 | document ff |
| 1312 | Flush pending X window display updates to screen. |
| 1313 | Works only when an inferior emacs is executing. |
| 1314 | end |
| 1315 | |
| 1316 | |
| 1317 | define hook-run |
| 1318 | xreload |
| 1319 | end |
| 1320 | |
| 1321 | # Call xreload if a new Emacs executable is loaded. |
| 1322 | define hookpost-run |
| 1323 | xreload |
| 1324 | end |
| 1325 | |
| 1326 | set print pretty on |
| 1327 | set print sevenbit-strings |
| 1328 | |
| 1329 | show environment DISPLAY |
| 1330 | show environment TERM |
| 1331 | |
| 1332 | # People get bothered when they see messages about non-existent functions... |
| 1333 | xgetptr globals.f_Vsystem_type |
| 1334 | # $ptr is NULL in temacs |
| 1335 | if ($ptr != 0) |
| 1336 | set $tem = (struct Lisp_Symbol *) $ptr |
| 1337 | xgetptr $tem->xname |
| 1338 | set $tem = (struct Lisp_String *) $ptr |
| 1339 | set $tem = (char *) $tem->data |
| 1340 | |
| 1341 | # Don't let abort actually run, as it will make stdio stop working and |
| 1342 | # therefore the `pr' command above as well. |
| 1343 | if $tem[0] == 'w' && $tem[1] == 'i' && $tem[2] == 'n' && $tem[3] == 'd' |
| 1344 | # The windows-nt build replaces abort with its own function. |
| 1345 | break w32_abort |
| 1346 | else |
| 1347 | break abort |
| 1348 | end |
| 1349 | end |
| 1350 | |
| 1351 | # x_error_quitter is defined only on X. But window-system is set up |
| 1352 | # only at run time, during Emacs startup, so we need to defer setting |
| 1353 | # the breakpoint. init_sys_modes is the first function called on |
| 1354 | # every platform after init_display, where window-system is set. |
| 1355 | tbreak init_sys_modes |
| 1356 | commands |
| 1357 | silent |
| 1358 | xgetptr globals.f_Vinitial_window_system |
| 1359 | set $tem = (struct Lisp_Symbol *) $ptr |
| 1360 | xgetptr $tem->xname |
| 1361 | set $tem = (struct Lisp_String *) $ptr |
| 1362 | set $tem = (char *) $tem->data |
| 1363 | # If we are running in synchronous mode, we want a chance to look |
| 1364 | # around before Emacs exits. Perhaps we should put the break |
| 1365 | # somewhere else instead... |
| 1366 | if $tem[0] == 'x' && $tem[1] == '\0' |
| 1367 | break x_error_quitter |
| 1368 | end |
| 1369 | continue |
| 1370 | end |