From fe20eda53c2bcc8182720978f7695b84efc9ec29 Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Tue, 7 Feb 2023 12:14:54 -0700 Subject: [PATCH] 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 * 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. --- bfd/ChangeLog | 11 +++++++++++ bfd/doc/chew.c | 46 +++++++++++++++++++++++++++++++++------------- bfd/doc/proto.str | 12 ++++++------ 3 files changed, 50 insertions(+), 19 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 72c70e6e91d..6e8888d2364 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,14 @@ +2023-02-07 Tom Tromey + + * 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 * doc/chew.c (pcu) : Now intptr_t. diff --git a/bfd/doc/chew.c b/bfd/doc/chew.c index 510a8e968c5..b17b20a183f 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) { @@ -993,19 +1002,10 @@ skip_past_newline (void) pc++; } -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 7bebbc26f8f..5206f7f3877 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 ; -- 2.30.2