diff options
| author | Gerd Möllmann | 2022-10-20 11:25:43 +0200 |
|---|---|---|
| committer | Gerd Möllmann | 2022-10-20 11:26:29 +0200 |
| commit | 7acb6c5ca1c629846bb413c8ab0605a045bb3752 (patch) | |
| tree | 6a94b6972dd8b3b1f270906f61c46ed3cded9ae2 /src | |
| parent | 6b0304f2dd84f9904885f31b1d73f4b9f905a522 (diff) | |
| download | emacs-7acb6c5ca1c629846bb413c8ab0605a045bb3752.tar.gz emacs-7acb6c5ca1c629846bb413c8ab0605a045bb3752.zip | |
Intrdduce pkg_find_symbol
Diffstat (limited to 'src')
| -rw-r--r-- | src/lisp.h | 1 | ||||
| -rw-r--r-- | src/pkg.c | 39 | ||||
| -rw-r--r-- | src/print.c | 12 |
3 files changed, 27 insertions, 25 deletions
diff --git a/src/lisp.h b/src/lisp.h index 5417881a0ad..461333f01bc 100644 --- a/src/lisp.h +++ b/src/lisp.h | |||
| @@ -2280,6 +2280,7 @@ extern void pkg_break (void); | |||
| 2280 | extern void pkg_define_builtin_symbols (void); | 2280 | extern void pkg_define_builtin_symbols (void); |
| 2281 | extern void pkg_map_symbols_c_fn (void (*fn) (Lisp_Object, Lisp_Object), Lisp_Object arg); | 2281 | extern void pkg_map_symbols_c_fn (void (*fn) (Lisp_Object, Lisp_Object), Lisp_Object arg); |
| 2282 | extern Lisp_Object pkg_find_package (Lisp_Object name); | 2282 | extern Lisp_Object pkg_find_package (Lisp_Object name); |
| 2283 | extern Lisp_Object pkg_find_symbol (Lisp_Object name, Lisp_Object package, Lisp_Object *status); | ||
| 2283 | 2284 | ||
| 2284 | 2285 | ||
| 2285 | /* Return whether a value might be a valid docstring. | 2286 | /* Return whether a value might be a valid docstring. |
| @@ -209,7 +209,7 @@ package_or_default (Lisp_Object designator) | |||
| 209 | recursion. */ | 209 | recursion. */ |
| 210 | 210 | ||
| 211 | static Lisp_Object | 211 | static Lisp_Object |
| 212 | lookup_symbol1 (Lisp_Object name, Lisp_Object package, Lisp_Object seen, | 212 | pkg_find_symbol1 (Lisp_Object name, Lisp_Object package, Lisp_Object seen, |
| 213 | Lisp_Object *status) | 213 | Lisp_Object *status) |
| 214 | { | 214 | { |
| 215 | eassert (STRINGP (name)); | 215 | eassert (STRINGP (name)); |
| @@ -240,7 +240,7 @@ lookup_symbol1 (Lisp_Object name, Lisp_Object package, Lisp_Object seen, | |||
| 240 | if (NILP (Fmemq (used_package, seen))) | 240 | if (NILP (Fmemq (used_package, seen))) |
| 241 | { | 241 | { |
| 242 | seen = Fcons (used_package, seen); | 242 | seen = Fcons (used_package, seen); |
| 243 | symbol = lookup_symbol1 (name, used_package, seen, NULL); | 243 | symbol = pkg_find_symbol1 (name, used_package, seen, NULL); |
| 244 | if (!EQ (symbol, Qunbound)) | 244 | if (!EQ (symbol, Qunbound)) |
| 245 | return symbol; | 245 | return symbol; |
| 246 | } | 246 | } |
| @@ -250,10 +250,10 @@ lookup_symbol1 (Lisp_Object name, Lisp_Object package, Lisp_Object seen, | |||
| 250 | return symbol; | 250 | return symbol; |
| 251 | } | 251 | } |
| 252 | 252 | ||
| 253 | static Lisp_Object | 253 | Lisp_Object |
| 254 | lookup_symbol (Lisp_Object name, Lisp_Object package, Lisp_Object *status) | 254 | pkg_find_symbol (Lisp_Object name, Lisp_Object package, Lisp_Object *status) |
| 255 | { | 255 | { |
| 256 | return lookup_symbol1 (name, package, Qnil, status); | 256 | return pkg_find_symbol1 (name, package, Qnil, status); |
| 257 | } | 257 | } |
| 258 | 258 | ||
| 259 | /* Add a SYMBOL to package PACKAGE. Value is SYMBOL. The symbol | 259 | /* Add a SYMBOL to package PACKAGE. Value is SYMBOL. The symbol |
| @@ -303,7 +303,7 @@ pkg_intern_symbol1 (const Lisp_Object name, Lisp_Object package, | |||
| 303 | eassert (PACKAGEP (package)); | 303 | eassert (PACKAGEP (package)); |
| 304 | 304 | ||
| 305 | /* If already accessible in package, return that. */ | 305 | /* If already accessible in package, return that. */ |
| 306 | Lisp_Object symbol = lookup_symbol (name, package, status); | 306 | Lisp_Object symbol = pkg_find_symbol (name, package, status); |
| 307 | if (!EQ (symbol, Qunbound)) | 307 | if (!EQ (symbol, Qunbound)) |
| 308 | return symbol; | 308 | return symbol; |
| 309 | 309 | ||
| @@ -376,7 +376,7 @@ pkg_lookup_non_keyword_c_string (const char *ptr, ptrdiff_t nchars, ptrdiff_t nb | |||
| 376 | { | 376 | { |
| 377 | eassert (*ptr != ':'); | 377 | eassert (*ptr != ':'); |
| 378 | const Lisp_Object name = make_string_from_bytes (ptr, nchars, nbytes); | 378 | const Lisp_Object name = make_string_from_bytes (ptr, nchars, nbytes); |
| 379 | return lookup_symbol (name, Vearmuffs_package, NULL); | 379 | return pkg_find_symbol (name, Vearmuffs_package, NULL); |
| 380 | } | 380 | } |
| 381 | 381 | ||
| 382 | static Lisp_Object | 382 | static Lisp_Object |
| @@ -386,7 +386,7 @@ pkg_unintern_symbol (Lisp_Object symbol, Lisp_Object package) | |||
| 386 | package = package_or_default (package); | 386 | package = package_or_default (package); |
| 387 | 387 | ||
| 388 | Lisp_Object status; | 388 | Lisp_Object status; |
| 389 | Lisp_Object found = lookup_symbol (SYMBOL_NAME (symbol), package, &status); | 389 | Lisp_Object found = pkg_find_symbol (SYMBOL_NAME (symbol), package, &status); |
| 390 | Lisp_Object removedp = Qnil; | 390 | Lisp_Object removedp = Qnil; |
| 391 | 391 | ||
| 392 | if (!EQ (found, Qunbound) && !EQ (status, QCinherited)) | 392 | if (!EQ (found, Qunbound) && !EQ (status, QCinherited)) |
| @@ -514,7 +514,7 @@ pkg_emacs_intern_soft (Lisp_Object name, Lisp_Object package) | |||
| 514 | package = fake_me_an_obarray (package); | 514 | package = fake_me_an_obarray (package); |
| 515 | package = package_or_default (package); | 515 | package = package_or_default (package); |
| 516 | 516 | ||
| 517 | Lisp_Object found = lookup_symbol (name, package, NULL); | 517 | Lisp_Object found = pkg_find_symbol (name, package, NULL); |
| 518 | if (EQ (found, Qunbound)) | 518 | if (EQ (found, Qunbound)) |
| 519 | return Qnil; | 519 | return Qnil; |
| 520 | 520 | ||
| @@ -563,7 +563,8 @@ pkg_qualified_symbol (Lisp_Object name, Lisp_Object package, bool external) | |||
| 563 | { | 563 | { |
| 564 | /* If we want a symbol for a given package, check the | 564 | /* If we want a symbol for a given package, check the |
| 565 | package has that symbol and its accessibily. */ | 565 | package has that symbol and its accessibily. */ |
| 566 | Lisp_Object found = Ffind_symbol (name, package); | 566 | Lisp_Object status; |
| 567 | Lisp_Object found = pkg_find_symbol (name, package, &status); | ||
| 567 | 568 | ||
| 568 | if (EQ (package, Vkeyword_package)) | 569 | if (EQ (package, Vkeyword_package)) |
| 569 | { | 570 | { |
| @@ -571,23 +572,22 @@ pkg_qualified_symbol (Lisp_Object name, Lisp_Object package, bool external) | |||
| 571 | PKG-FIXME: there might already be a symbol named | 572 | PKG-FIXME: there might already be a symbol named |
| 572 | 'test' in the obarray, and we'd like to use that | 573 | 'test' in the obarray, and we'd like to use that |
| 573 | name for ':test'. That's a problem. */ | 574 | name for ':test'. That's a problem. */ |
| 574 | if (NILP (found)) | 575 | if (EQ (found, Qunbound)) |
| 575 | return pkg_intern_symbol (name, package, NULL); | 576 | return pkg_intern_symbol (name, package, NULL); |
| 576 | return XCAR (found); | 577 | return found; |
| 577 | } | 578 | } |
| 578 | 579 | ||
| 579 | if (NILP (found)) | 580 | if (EQ (found, Qunbound)) |
| 580 | pkg_error ("Symbol '%s' is not accessible in package '%s'", | 581 | pkg_error ("Symbol '%s' is not accessible in package '%s'", |
| 581 | SDATA (name), SDATA (XPACKAGE (package)->name)); | 582 | SDATA (name), SDATA (XPACKAGE (package)->name)); |
| 582 | 583 | ||
| 583 | /* Check if the symbol is accesible in the package as external | 584 | /* Check if the symbol is accesible in the package as external |
| 584 | symbol. PKG-FIXME: Check what to do for inherited symbols. */ | 585 | symbol. PKG-FIXME: Check what to do for inherited symbols. */ |
| 585 | const Lisp_Object status = XCAR (XCDR (found)); | ||
| 586 | if (external && EQ (status, QCinternal)) | 586 | if (external && EQ (status, QCinternal)) |
| 587 | pkg_error ("Symbol '%s' is internal in package '%s'", | 587 | pkg_error ("Symbol '%s' is internal in package '%s'", |
| 588 | SDATA (name), SDATA (XPACKAGE (package)->name)); | 588 | SDATA (name), SDATA (XPACKAGE (package)->name)); |
| 589 | 589 | ||
| 590 | return XCAR (found); | 590 | return found; |
| 591 | } | 591 | } |
| 592 | 592 | ||
| 593 | /* Return symbol with name NAME when accessed without qualification in | 593 | /* Return symbol with name NAME when accessed without qualification in |
| @@ -603,9 +603,10 @@ pkg_unqualified_symbol (Lisp_Object name) | |||
| 603 | 603 | ||
| 604 | /* If we want a symbol for a given package, check the | 604 | /* If we want a symbol for a given package, check the |
| 605 | package has that symboland its accessibily. */ | 605 | package has that symboland its accessibily. */ |
| 606 | const Lisp_Object found = Ffind_symbol (name, package); | 606 | Lisp_Object status; |
| 607 | if (!NILP (found)) | 607 | const Lisp_Object found = pkg_find_symbol (name, package, &status); |
| 608 | return XCAR (found); | 608 | if (!EQ (found, Qunbound)) |
| 609 | return found; | ||
| 609 | return pkg_intern_symbol (name, package, NULL); | 610 | return pkg_intern_symbol (name, package, NULL); |
| 610 | } | 611 | } |
| 611 | 612 | ||
| @@ -657,7 +658,7 @@ symbol that was found, and STATUS is one of the following: | |||
| 657 | CHECK_STRING (name); | 658 | CHECK_STRING (name); |
| 658 | package = package_or_default (package); | 659 | package = package_or_default (package); |
| 659 | Lisp_Object status; | 660 | Lisp_Object status; |
| 660 | const Lisp_Object symbol = lookup_symbol (name, package, &status); | 661 | const Lisp_Object symbol = pkg_find_symbol (name, package, &status); |
| 661 | if (EQ (symbol, Qunbound)) | 662 | if (EQ (symbol, Qunbound)) |
| 662 | return Qnil; | 663 | return Qnil; |
| 663 | return list2 (symbol, status); | 664 | return list2 (symbol, status); |
diff --git a/src/print.c b/src/print.c index fed549099a2..e76bd44a82f 100644 --- a/src/print.c +++ b/src/print.c | |||
| @@ -2235,15 +2235,15 @@ print_symbol (Lisp_Object symbol, Lisp_Object printcharfun, | |||
| 2235 | else | 2235 | else |
| 2236 | { | 2236 | { |
| 2237 | /* If the symbol is accessible, it need not be qualified. */ | 2237 | /* If the symbol is accessible, it need not be qualified. */ |
| 2238 | const Lisp_Object found = Ffind_symbol (name, Vearmuffs_package); | 2238 | Lisp_Object status; |
| 2239 | const bool accessible = !NILP (found); | 2239 | const Lisp_Object found = pkg_find_symbol (name, Vearmuffs_package, &status); |
| 2240 | if (!accessible || !EQ (XCAR (found), symbol)) | 2240 | const bool accessible = !EQ (found, Qunbound); |
| 2241 | if (!accessible || !EQ (found, symbol)) | ||
| 2241 | { | 2242 | { |
| 2242 | print_symbol_name (XPACKAGE (package)->name, | 2243 | print_symbol_name (XPACKAGE (package)->name, |
| 2243 | printcharfun, escape); | 2244 | printcharfun, escape); |
| 2244 | const Lisp_Object found = Ffind_symbol (name, package); | 2245 | const Lisp_Object found = pkg_find_symbol (name, package, &status); |
| 2245 | eassert (!NILP (found)); | 2246 | eassert (!EQ (found, Qunbound)); |
| 2246 | const Lisp_Object status = XCAR (XCDR (found)); | ||
| 2247 | if (EQ (status, QCexternal)) | 2247 | if (EQ (status, QCexternal)) |
| 2248 | print_c_string (":", printcharfun); | 2248 | print_c_string (":", printcharfun); |
| 2249 | else | 2249 | else |