diff options
author | Tom Tromey <tom@tromey.com> | 2023-02-07 12:14:54 -0700 |
---|---|---|
committer | Tom Tromey <tom@tromey.com> | 2023-02-15 10:27:34 -0700 |
commit | fe20eda53c2bcc8182720978f7695b84efc9ec29 (patch) | |
tree | 6230d611c75e8d57729f5bccc2714d9e4238bf15 | |
parent | 126eff23d218581ce91560bc088fb550aac36942 (diff) | |
download | gdb-fe20eda53c2bcc8182720978f7695b84efc9ec29.zip gdb-fe20eda53c2bcc8182720978f7695b84efc9ec29.tar.gz gdb-fe20eda53c2bcc8182720978f7695b84efc9ec29.tar.bz2 |
Change internalmode to be an intrinsic variable
Currently, internalmode is a special word to set an internal state
variable. Because this series adds variables anyway, change this to
be a variable instead.
I saw some commits in the history that made sure that chew did not
leak memory, so I put some extra effort into trying to handle this for
variables as well.
2023-02-07 Tom Tromey <tom@tromey.com>
* doc/proto.str (external, internal, ifinternal, ENUMEQ, ENUMDOC):
Update.
* doc/chew.c (internalmode): Remove.
(add_intrinsic_variable): New function.
(main): Add internalmode as intrinsic.
(internal_mode): Remove global.
(maybecatstr): Update.
(free_words): Free variables.
-rw-r--r-- | bfd/ChangeLog | 11 | ||||
-rw-r--r-- | bfd/doc/chew.c | 46 | ||||
-rw-r--r-- | bfd/doc/proto.str | 12 |
3 files changed, 50 insertions, 19 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 72c70e6..6e8888d 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,5 +1,16 @@ 2023-02-07 Tom Tromey <tom@tromey.com> + * doc/proto.str (external, internal, ifinternal, ENUMEQ, ENUMDOC): + Update. + * doc/chew.c (internalmode): Remove. + (add_intrinsic_variable): New function. + (main): Add internalmode as intrinsic. + (internal_mode): Remove global. + (maybecatstr): Update. + (free_words): Free variables. + +2023-02-07 Tom Tromey <tom@tromey.com> + * doc/chew.c (pcu) <l>: Now intptr_t. (internal_mode, istack, isp): Likewise. (bang, atsign): Use intptr_t. diff --git a/bfd/doc/chew.c b/bfd/doc/chew.c index 510a8e9..b17b20a1 100644 --- a/bfd/doc/chew.c +++ b/bfd/doc/chew.c @@ -70,12 +70,13 @@ translatecomments - turn {* and *} into comment delimiters kill_bogus_lines - get rid of extra newlines indent - internalmode - pop from integer stack, set `internalmode' to that value print_stack_level - print current stack depth to stderr strip_trailing_newlines - go ahead, guess... [quoted string] - push string onto string stack [word starting with digit] - push atol(str) onto integer stack + internalmode - the internalmode variable (evaluates to address) + A command must be all upper-case, and alone on a line. Foo. */ @@ -119,7 +120,7 @@ typedef struct dict_struct } dict_type; int internal_wanted; -intptr_t internal_mode; +intptr_t *internal_mode; int warning; @@ -376,6 +377,14 @@ push_number (void) pc++; } +/* This is a wrapper for push_number just so we can correctly free the + variable at the end. */ +static void +push_variable (void) +{ + push_number (); +} + static void push_text (void) { @@ -994,18 +1003,9 @@ skip_past_newline (void) } static void -internalmode (void) -{ - internal_mode = *(isp); - isp--; - icheck_range (); - pc++; -} - -static void maybecatstr (void) { - if (internal_wanted == internal_mode) + if (internal_wanted == *internal_mode) { catstr (tos - 1, tos); } @@ -1138,6 +1138,11 @@ free_words (void) free (ptr->code[i + 1].s - 1); ++i; } + else if (ptr->code[i].f == push_variable) + { + free ((void *) ptr->code[i + 1].l); + ++i; + } free (ptr->code); } next = ptr->next; @@ -1217,6 +1222,18 @@ add_intrinsic (char *name, void (*func) (void)) add_to_definition (new_d, p); } +static void +add_intrinsic_variable (char *name, intptr_t *loc) +{ + dict_type *new_d = newentry (xstrdup (name)); + pcu p = { push_variable }; + add_to_definition (new_d, p); + p.l = (intptr_t) loc; + add_to_definition (new_d, p); + p.f = 0; + add_to_definition (new_d, p); +} + void compile (char *string) { @@ -1430,10 +1447,13 @@ main (int ac, char *av[]) add_intrinsic ("translatecomments", translatecomments); add_intrinsic ("kill_bogus_lines", kill_bogus_lines); add_intrinsic ("indent", indent); - add_intrinsic ("internalmode", internalmode); add_intrinsic ("print_stack_level", print_stack_level); add_intrinsic ("strip_trailing_newlines", strip_trailing_newlines); + internal_mode = xmalloc (sizeof (intptr_t)); + *internal_mode = 0; + add_intrinsic_variable ("internalmode", internal_mode); + /* Put a nl at the start. */ catchar (&buffer, '\n'); diff --git a/bfd/doc/proto.str b/bfd/doc/proto.str index 7bebbc2..5206f7f 100644 --- a/bfd/doc/proto.str +++ b/bfd/doc/proto.str @@ -34,16 +34,16 @@ ignore ; : external - 0 internalmode ignore ; + 0 internalmode ! ignore ; : internal - 1 internalmode ignore ; + 1 internalmode ! ignore ; - input stack { a b } output b if internal, a if external : ifinternal - "" swap 1 internalmode maybecatstr + "" swap 1 internalmode ! maybecatstr swap - "" swap 0 internalmode maybecatstr + "" swap 0 internalmode ! maybecatstr catstr ; @@ -123,7 +123,7 @@ catstr copy_past_newline catstr - "" swap 0 internalmode maybecatstr + "" swap 0 internalmode ! maybecatstr ; : ENUMEQX ENUMEQ catstr ; : ENUMDOC @@ -133,7 +133,7 @@ "\n{* " swap catstr " *}\n" catstr translatecomments - discard it if we're doing internal mode - "" swap 0 internalmode maybecatstr + "" swap 0 internalmode ! maybecatstr swap catstr catstr ; |