diff options
| author | Lars Ingebrigtsen | 2022-05-16 15:01:08 +0200 |
|---|---|---|
| committer | Lars Ingebrigtsen | 2022-05-16 15:01:08 +0200 |
| commit | f5ee56c5eae8a42a1bb83e31e0c12e14a2571860 (patch) | |
| tree | af6699c1958ee9baca42552e517a364cc0894e21 | |
| parent | 5a6e727ddb155e6d4210bc7b7a30cf8933d556c8 (diff) | |
| download | emacs-f5ee56c5eae8a42a1bb83e31e0c12e14a2571860.tar.gz emacs-f5ee56c5eae8a42a1bb83e31e0c12e14a2571860.zip | |
Don't expose Vprint_variable_mapping to Lisp
* src/print.c: Don't expose Vprint_variable_mapping to the Lisp
world, because it really should be immutable.
(print_create_variable_mapping): Initialization moved here from
syms_of_print.
(print_bind_overrides): Call it.
(syms_of_print): Protect the mapping variable.
| -rw-r--r-- | src/print.c | 72 |
1 files changed, 39 insertions, 33 deletions
diff --git a/src/print.c b/src/print.c index 41c0a188163..55f4c2345a3 100644 --- a/src/print.c +++ b/src/print.c | |||
| @@ -620,10 +620,12 @@ If PRINTCHARFUN is omitted or nil, the value of `standard-output' is used. */) | |||
| 620 | return val; | 620 | return val; |
| 621 | } | 621 | } |
| 622 | 622 | ||
| 623 | static Lisp_Object Vprint_variable_mapping; | ||
| 624 | |||
| 623 | static void | 625 | static void |
| 624 | print_bind_all_defaults (void) | 626 | print_bind_all_defaults (void) |
| 625 | { | 627 | { |
| 626 | for (Lisp_Object vars = Vprint__variable_mapping; !NILP (vars); | 628 | for (Lisp_Object vars = Vprint_variable_mapping; !NILP (vars); |
| 627 | vars = XCDR (vars)) | 629 | vars = XCDR (vars)) |
| 628 | { | 630 | { |
| 629 | Lisp_Object elem = XCDR (XCAR (vars)); | 631 | Lisp_Object elem = XCDR (XCAR (vars)); |
| @@ -632,8 +634,41 @@ print_bind_all_defaults (void) | |||
| 632 | } | 634 | } |
| 633 | 635 | ||
| 634 | static void | 636 | static void |
| 637 | print_create_variable_mapping (void) | ||
| 638 | { | ||
| 639 | Lisp_Object total[] = { | ||
| 640 | list3 (intern ("length"), intern ("print-length"), Qnil), | ||
| 641 | list3 (intern ("level"), intern ("print-level"), Qnil), | ||
| 642 | list3 (intern ("circle"), intern ("print-circle"), Qnil), | ||
| 643 | list3 (intern ("quoted"), intern ("print-quoted"), Qt), | ||
| 644 | list3 (intern ("escape-newlines"), intern ("print-escape-newlines"), Qnil), | ||
| 645 | list3 (intern ("escape-control-characters"), | ||
| 646 | intern ("print-escape-control-characters"), Qnil), | ||
| 647 | list3 (intern ("escape-nonascii"), intern ("print-escape-nonascii"), Qnil), | ||
| 648 | list3 (intern ("escape-multibyte"), | ||
| 649 | intern ("print-escape-multibyte"), Qnil), | ||
| 650 | list3 (intern ("charset-text-property"), | ||
| 651 | intern ("print-charset-text-property"), Qnil), | ||
| 652 | list3 (intern ("unreadeable-function"), | ||
| 653 | intern ("print-unreadable-function"), Qnil), | ||
| 654 | list3 (intern ("gensym"), intern ("print-gensym"), Qnil), | ||
| 655 | list3 (intern ("continuous-numbering"), | ||
| 656 | intern ("print-continuous-numbering"), Qnil), | ||
| 657 | list3 (intern ("number-table"), intern ("print-number-table"), Qnil), | ||
| 658 | list3 (intern ("float-format"), intern ("float-output-format"), Qnil), | ||
| 659 | list3 (intern ("integers-as-characters"), | ||
| 660 | intern ("print-integers-as-characters"), Qnil), | ||
| 661 | }; | ||
| 662 | |||
| 663 | Vprint_variable_mapping = CALLMANY (Flist, total); | ||
| 664 | } | ||
| 665 | |||
| 666 | static void | ||
| 635 | print_bind_overrides (Lisp_Object overrides) | 667 | print_bind_overrides (Lisp_Object overrides) |
| 636 | { | 668 | { |
| 669 | if (NILP (Vprint_variable_mapping)) | ||
| 670 | print_create_variable_mapping (); | ||
| 671 | |||
| 637 | if (EQ (overrides, Qt)) | 672 | if (EQ (overrides, Qt)) |
| 638 | print_bind_all_defaults (); | 673 | print_bind_all_defaults (); |
| 639 | else if (!CONSP (overrides)) | 674 | else if (!CONSP (overrides)) |
| @@ -651,7 +686,7 @@ print_bind_overrides (Lisp_Object overrides) | |||
| 651 | { | 686 | { |
| 652 | Lisp_Object key = XCAR (setting), | 687 | Lisp_Object key = XCAR (setting), |
| 653 | value = XCDR (setting); | 688 | value = XCDR (setting); |
| 654 | Lisp_Object map = Fassq (key, Vprint__variable_mapping); | 689 | Lisp_Object map = Fassq (key, Vprint_variable_mapping); |
| 655 | if (NILP (map)) | 690 | if (NILP (map)) |
| 656 | xsignal2 (Qwrong_type_argument, Qsymbolp, map); | 691 | xsignal2 (Qwrong_type_argument, Qsymbolp, map); |
| 657 | specbind (XCAR (XCDR (map)), value); | 692 | specbind (XCAR (XCDR (map)), value); |
| @@ -2643,35 +2678,6 @@ be printed. */); | |||
| 2643 | 2678 | ||
| 2644 | defsubr (&Sflush_standard_output); | 2679 | defsubr (&Sflush_standard_output); |
| 2645 | 2680 | ||
| 2646 | DEFVAR_LISP ("print--variable-mapping", Vprint__variable_mapping, | 2681 | /* Initialized in print_create_variable_mapping. */ |
| 2647 | doc: /* Mapping for print variables in `prin1'. | 2682 | staticpro (&Vprint_variable_mapping); |
| 2648 | Internal use only. | ||
| 2649 | Do not modify this list. */); | ||
| 2650 | Vprint__variable_mapping = Qnil; | ||
| 2651 | Lisp_Object total[] = { | ||
| 2652 | list3 (intern ("length"), intern ("print-length"), Qnil), | ||
| 2653 | list3 (intern ("level"), intern ("print-level"), Qnil), | ||
| 2654 | list3 (intern ("circle"), intern ("print-circle"), Qnil), | ||
| 2655 | list3 (intern ("quoted"), intern ("print-quoted"), Qt), | ||
| 2656 | list3 (intern ("escape-newlines"), intern ("print-escape-newlines"), Qnil), | ||
| 2657 | list3 (intern ("escape-control-characters"), | ||
| 2658 | intern ("print-escape-control-characters"), Qnil), | ||
| 2659 | list3 (intern ("escape-nonascii"), intern ("print-escape-nonascii"), Qnil), | ||
| 2660 | list3 (intern ("escape-multibyte"), | ||
| 2661 | intern ("print-escape-multibyte"), Qnil), | ||
| 2662 | list3 (intern ("charset-text-property"), | ||
| 2663 | intern ("print-charset-text-property"), Qnil), | ||
| 2664 | list3 (intern ("unreadeable-function"), | ||
| 2665 | intern ("print-unreadable-function"), Qnil), | ||
| 2666 | list3 (intern ("gensym"), intern ("print-gensym"), Qnil), | ||
| 2667 | list3 (intern ("continuous-numbering"), | ||
| 2668 | intern ("print-continuous-numbering"), Qnil), | ||
| 2669 | list3 (intern ("number-table"), intern ("print-number-table"), Qnil), | ||
| 2670 | list3 (intern ("float-format"), intern ("float-output-format"), Qnil), | ||
| 2671 | list3 (intern ("integers-as-characters"), | ||
| 2672 | intern ("print-integers-as-characters"), Qnil), | ||
| 2673 | }; | ||
| 2674 | |||
| 2675 | Vprint__variable_mapping = CALLMANY (Flist, total); | ||
| 2676 | make_symbol_constant (intern_c_string ("print--variable-mapping")); | ||
| 2677 | } | 2683 | } |