Mercurial > hg > xemacs-beta
comparison src/specifier.c @ 280:7df0dd720c89 r21-0b38
Import from CVS: tag r21-0b38
author | cvs |
---|---|
date | Mon, 13 Aug 2007 10:32:22 +0200 |
parents | 6330739388db |
children | 558f606b08ae |
comparison
equal
deleted
inserted
replaced
279:c20b2fb5bb0a | 280:7df0dd720c89 |
---|---|
22 | 22 |
23 /* Synched up with: Not in FSF. */ | 23 /* Synched up with: Not in FSF. */ |
24 | 24 |
25 /* Design by Ben Wing; | 25 /* Design by Ben Wing; |
26 Original version by Chuck Thompson; | 26 Original version by Chuck Thompson; |
27 rewritten by Ben Wing */ | 27 rewritten by Ben Wing; |
28 Magic specifiers by Kirill Katsnelson; | |
29 */ | |
28 | 30 |
29 #include <config.h> | 31 #include <config.h> |
30 #include "lisp.h" | 32 #include "lisp.h" |
31 | 33 |
32 #include "buffer.h" | 34 #include "buffer.h" |
67 | 69 |
68 static Lisp_Object Vcached_specifiers; | 70 static Lisp_Object Vcached_specifiers; |
69 /* Do NOT mark through this, or specifiers will never be GC'd. */ | 71 /* Do NOT mark through this, or specifiers will never be GC'd. */ |
70 static Lisp_Object Vall_specifiers; | 72 static Lisp_Object Vall_specifiers; |
71 | 73 |
72 static Lisp_Object Vreveal_ghoste_specifiers; | 74 static Lisp_Object Vunlock_ghost_specifiers; |
73 | 75 |
74 /* #### The purpose of this is to check for inheritance loops | 76 /* #### The purpose of this is to check for inheritance loops |
75 in specifiers that can inherit from other specifiers, but it's | 77 in specifiers that can inherit from other specifiers, but it's |
76 not yet implemented. | 78 not yet implemented. |
77 | 79 |
78 #### Look into this for 19.14. */ | 80 #### Look into this for 19.14. */ |
79 static Lisp_Object_dynarr current_specifiers; | 81 /* static Lisp_Object_dynarr current_specifiers; */ |
80 | 82 |
81 static void recompute_cached_specifier_everywhere (Lisp_Object specifier); | 83 static void recompute_cached_specifier_everywhere (Lisp_Object specifier); |
82 | 84 |
83 EXFUN (Fspecifier_specs, 4); | 85 EXFUN (Fspecifier_specs, 4); |
84 EXFUN (Fremove_specifier, 4); | 86 EXFUN (Fremove_specifier, 4); |
301 (s1->methods == s2->methods && | 303 (s1->methods == s2->methods && |
302 internal_equal (s1->global_specs, s2->global_specs, depth) && | 304 internal_equal (s1->global_specs, s2->global_specs, depth) && |
303 internal_equal (s1->device_specs, s2->device_specs, depth) && | 305 internal_equal (s1->device_specs, s2->device_specs, depth) && |
304 internal_equal (s1->frame_specs, s2->frame_specs, depth) && | 306 internal_equal (s1->frame_specs, s2->frame_specs, depth) && |
305 internal_equal (s1->window_specs, s2->window_specs, depth) && | 307 internal_equal (s1->window_specs, s2->window_specs, depth) && |
306 internal_equal (s1->buffer_specs, s2->buffer_specs, depth)); | 308 internal_equal (s1->buffer_specs, s2->buffer_specs, depth) && |
307 /* #### Why do not compare fallbacks here? */ | 309 internal_equal (s1->fallback, s2->fallback, depth)); |
308 | 310 |
309 if (retval && HAS_SPECMETH_P (s1, equal)) | 311 if (retval && HAS_SPECMETH_P (s1, equal)) |
310 retval = SPECMETH (s1, equal, (o1, o2, depth - 1)); | 312 retval = SPECMETH (s1, equal, (o1, o2, depth - 1)); |
311 | 313 |
312 Vinhibit_quit = old_inhibit_quit; | 314 Vinhibit_quit = old_inhibit_quit; |
582 !NILP (Fvalid_specifier_locale_type_p (locale))) | 584 !NILP (Fvalid_specifier_locale_type_p (locale))) |
583 return; | 585 return; |
584 signal_simple_error ("Invalid specifier locale or locale type", locale); | 586 signal_simple_error ("Invalid specifier locale or locale type", locale); |
585 } | 587 } |
586 | 588 |
587 DEFUN ("specifier-locale-type-from-locale", | 589 DEFUN ("specifier-locale-type-from-locale", Fspecifier_locale_type_from_locale, |
588 Fspecifier_locale_type_from_locale, 1, 1, 0, /* | 590 1, 1, 0, /* |
589 Given a specifier LOCALE, return its type. | 591 Given a specifier LOCALE, return its type. |
590 */ | 592 */ |
591 (locale)) | 593 (locale)) |
592 { | 594 { |
593 /* This cannot GC. */ | 595 /* This cannot GC. */ |
936 else | 938 else |
937 XCDR (XCAR (rest2)) = !NILP (call1 (predicate, device)) ? Qt : Qnil; | 939 XCDR (XCAR (rest2)) = !NILP (call1 (predicate, device)) ? Qt : Qnil; |
938 } | 940 } |
939 } | 941 } |
940 | 942 |
941 DEFUN ("device-matching-specifier-tag-list", | 943 DEFUN ("device-matching-specifier-tag-list", Fdevice_matching_specifier_tag_list, |
942 Fdevice_matching_specifier_tag_list, 0, 1, 0, /* | 944 0, 1, 0, /* |
943 Return a list of all specifier tags matching DEVICE. | 945 Return a list of all specifier tags matching DEVICE. |
944 DEVICE defaults to the selected device if omitted. | 946 DEVICE defaults to the selected device if omitted. |
945 */ | 947 */ |
946 (device)) | 948 (device)) |
947 { | 949 { |
1235 signal_simple_error ("Invalid `how-to-add' flag", how_to_add); | 1237 signal_simple_error ("Invalid `how-to-add' flag", how_to_add); |
1236 | 1238 |
1237 return SPEC_PREPEND; /* not reached */ | 1239 return SPEC_PREPEND; /* not reached */ |
1238 } | 1240 } |
1239 | 1241 |
1240 /* Given a specifier object SPEC, return its bodily specifier for a | 1242 /* Given a specifier object SPEC, return bodily specifier if SPEC is a |
1241 ghost specifier, otherwise return the object itself | 1243 ghost specifier, otherwise return the object itself |
1242 */ | 1244 */ |
1243 static Lisp_Object | 1245 static Lisp_Object |
1244 bodily_specifier (Lisp_Object spec) | 1246 bodily_specifier (Lisp_Object spec) |
1245 { | 1247 { |
1246 return (GHOST_SPECIFIER_P (XSPECIFIER (spec)) | 1248 return (GHOST_SPECIFIER_P (XSPECIFIER (spec)) |
1247 ? XSPECIFIER(spec)->magic_parent : spec); | 1249 ? XSPECIFIER(spec)->magic_parent : spec); |
1248 } | 1250 } |
1249 | 1251 |
1250 /* Given a specifier object SPEC, return a specifier to be operated on | 1252 /* Signal error if (specifier SPEC is read-only. |
1251 by external lisp function. This is a ghost specifier for a magic | 1253 Read only are ghost specifiers unless Vunlock_ghost_specifiers is |
1252 specifier when and only when Vreveal_ghoste_specifiers is non-nil, | 1254 non-nil. All other specifiers are read-write. |
1253 otherwise SPEC itself. | 1255 */ |
1254 */ | 1256 static void |
1257 check_modifiable_specifier (Lisp_Object spec) | |
1258 { | |
1259 if (NILP (Vunlock_ghost_specifiers) | |
1260 && GHOST_SPECIFIER_P (XSPECIFIER (spec))) | |
1261 signal_simple_error ("Attempt to modify read-only specifier", | |
1262 list1 (spec)); | |
1263 } | |
1264 | |
1265 /* Helper function which unwind protects the value of | |
1266 Vunlock_ghost_specifiers, then sets it to non-nil value */ | |
1255 static Lisp_Object | 1267 static Lisp_Object |
1256 maybe_ghost_specifier (Lisp_Object spec) | 1268 restore_unlock_value (Lisp_Object val) |
1257 { | 1269 { |
1258 return (!NILP (Vreveal_ghoste_specifiers) | 1270 Vunlock_ghost_specifiers = val; |
1259 && BODILY_SPECIFIER_P (XSPECIFIER (spec)) | |
1260 ? XSPECIFIER(spec)->fallback : spec); | |
1261 } | |
1262 | |
1263 /* Helper function which unwind protects the value of | |
1264 Vreveal_ghoste_specifiers, then sets it to non-nil value */ | |
1265 | |
1266 static Lisp_Object | |
1267 restore_reveal_value (Lisp_Object val) | |
1268 { | |
1269 Vreveal_ghoste_specifiers = val; | |
1270 return val; | 1271 return val; |
1271 } | 1272 } |
1272 | 1273 |
1273 int | 1274 int |
1274 reveal_ghost_specifiers_protected (void) | 1275 unlock_ghost_specifiers_protected (void) |
1275 { | 1276 { |
1276 int depth = specpdl_depth (); | 1277 int depth = specpdl_depth (); |
1277 record_unwind_protect (restore_reveal_value, | 1278 record_unwind_protect (restore_unlock_value, |
1278 Vreveal_ghoste_specifiers); | 1279 Vunlock_ghost_specifiers); |
1279 Vreveal_ghoste_specifiers = Qt; | 1280 Vunlock_ghost_specifiers = Qt; |
1280 return depth; | 1281 return depth; |
1281 } | 1282 } |
1282 | 1283 |
1283 /* This gets hit so much that the function call overhead had a | 1284 /* This gets hit so much that the function call overhead had a |
1284 measurable impact (according to Quantify). #### We should figure | 1285 measurable impact (according to Quantify). #### We should figure |
1842 enum spec_add_meth add_meth; | 1843 enum spec_add_meth add_meth; |
1843 Lisp_Object inst_list; | 1844 Lisp_Object inst_list; |
1844 struct gcpro gcpro1; | 1845 struct gcpro gcpro1; |
1845 | 1846 |
1846 CHECK_SPECIFIER (specifier); | 1847 CHECK_SPECIFIER (specifier); |
1848 check_modifiable_specifier (specifier); | |
1849 | |
1847 locale = decode_locale (locale); | 1850 locale = decode_locale (locale); |
1848 check_valid_instantiator (instantiator, | 1851 check_valid_instantiator (instantiator, |
1849 decode_specifier_type | 1852 decode_specifier_type |
1850 (Fspecifier_type (specifier), ERROR_ME), | 1853 (Fspecifier_type (specifier), ERROR_ME), |
1851 ERROR_ME); | 1854 ERROR_ME); |
1854 tag_set = decode_specifier_tag_set (tag_set); | 1857 tag_set = decode_specifier_tag_set (tag_set); |
1855 add_meth = decode_how_to_add_specification (how_to_add); | 1858 add_meth = decode_how_to_add_specification (how_to_add); |
1856 | 1859 |
1857 inst_list = list1 (Fcons (tag_set, instantiator)); | 1860 inst_list = list1 (Fcons (tag_set, instantiator)); |
1858 GCPRO1 (inst_list); | 1861 GCPRO1 (inst_list); |
1859 specifier_add_spec (maybe_ghost_specifier (specifier), | 1862 specifier_add_spec (specifier, locale, inst_list, add_meth); |
1860 locale, inst_list, add_meth); | |
1861 recompute_cached_specifier_everywhere (specifier); | 1863 recompute_cached_specifier_everywhere (specifier); |
1862 RETURN_UNGCPRO (Qnil); | 1864 RETURN_UNGCPRO (Qnil); |
1863 } | 1865 } |
1864 | 1866 |
1865 DEFUN ("add-spec-list-to-specifier", Fadd_spec_list_to_specifier, 2, 3, 0, /* | 1867 DEFUN ("add-spec-list-to-specifier", Fadd_spec_list_to_specifier, 2, 3, 0, /* |
1893 { | 1895 { |
1894 enum spec_add_meth add_meth; | 1896 enum spec_add_meth add_meth; |
1895 Lisp_Object rest; | 1897 Lisp_Object rest; |
1896 | 1898 |
1897 CHECK_SPECIFIER (specifier); | 1899 CHECK_SPECIFIER (specifier); |
1900 check_modifiable_specifier (specifier); | |
1901 | |
1898 check_valid_spec_list (spec_list, | 1902 check_valid_spec_list (spec_list, |
1899 decode_specifier_type | 1903 decode_specifier_type |
1900 (Fspecifier_type (specifier), ERROR_ME), | 1904 (Fspecifier_type (specifier), ERROR_ME), |
1901 ERROR_ME); | 1905 ERROR_ME); |
1902 add_meth = decode_how_to_add_specification (how_to_add); | 1906 add_meth = decode_how_to_add_specification (how_to_add); |
1906 /* Placating the GCC god. */ | 1910 /* Placating the GCC god. */ |
1907 Lisp_Object specification = XCAR (rest); | 1911 Lisp_Object specification = XCAR (rest); |
1908 Lisp_Object locale = XCAR (specification); | 1912 Lisp_Object locale = XCAR (specification); |
1909 Lisp_Object inst_list = XCDR (specification); | 1913 Lisp_Object inst_list = XCDR (specification); |
1910 | 1914 |
1911 specifier_add_spec (maybe_ghost_specifier (specifier), | 1915 specifier_add_spec (specifier, locale, inst_list, add_meth); |
1912 locale, inst_list, add_meth); | |
1913 } | 1916 } |
1914 recompute_cached_specifier_everywhere (specifier); | 1917 recompute_cached_specifier_everywhere (specifier); |
1915 return Qnil; | 1918 return Qnil; |
1916 } | 1919 } |
1917 | 1920 |
1918 void | 1921 void |
1919 add_spec_to_ghost_specifier (Lisp_Object specifier, Lisp_Object instantiator, | 1922 add_spec_to_ghost_specifier (Lisp_Object specifier, Lisp_Object instantiator, |
1920 Lisp_Object locale, Lisp_Object tag_set, | 1923 Lisp_Object locale, Lisp_Object tag_set, |
1921 Lisp_Object how_to_add) | 1924 Lisp_Object how_to_add) |
1922 { | 1925 { |
1923 int depth = reveal_ghost_specifiers_protected (); | 1926 int depth = unlock_ghost_specifiers_protected (); |
1924 Fadd_spec_to_specifier (specifier, instantiator, locale, | 1927 Fadd_spec_to_specifier (XSPECIFIER(specifier)->fallback, |
1925 tag_set, how_to_add); | 1928 instantiator, locale, tag_set, how_to_add); |
1926 unbind_to (depth, Qnil); | 1929 unbind_to (depth, Qnil); |
1927 } | 1930 } |
1928 | 1931 |
1929 struct specifier_spec_list_closure | 1932 struct specifier_spec_list_closure |
1930 { | 1933 { |
2011 struct gcpro gcpro1, gcpro2; | 2014 struct gcpro gcpro1, gcpro2; |
2012 | 2015 |
2013 CHECK_SPECIFIER (specifier); | 2016 CHECK_SPECIFIER (specifier); |
2014 cl.head = cl.tail = Qnil; | 2017 cl.head = cl.tail = Qnil; |
2015 GCPRO2 (cl.head, cl.tail); | 2018 GCPRO2 (cl.head, cl.tail); |
2016 map_specifier (maybe_ghost_specifier (specifier), | 2019 map_specifier (specifier, locale, specifier_spec_list_mapfun, |
2017 locale, specifier_spec_list_mapfun, | |
2018 tag_set, exact_p, &cl); | 2020 tag_set, exact_p, &cl); |
2019 UNGCPRO; | 2021 UNGCPRO; |
2020 return cl.head; | 2022 return cl.head; |
2021 } | 2023 } |
2022 | 2024 |
2056 locale = XCAR (locale); | 2058 locale = XCAR (locale); |
2057 GCPRO1 (tag_set); | 2059 GCPRO1 (tag_set); |
2058 tag_set = decode_specifier_tag_set (tag_set); | 2060 tag_set = decode_specifier_tag_set (tag_set); |
2059 tag_set = canonicalize_tag_set (tag_set); | 2061 tag_set = canonicalize_tag_set (tag_set); |
2060 RETURN_UNGCPRO | 2062 RETURN_UNGCPRO |
2061 (specifier_get_external_inst_list (maybe_ghost_specifier (specifier), | 2063 (specifier_get_external_inst_list (specifier, locale, |
2062 locale, | |
2063 locale_type_from_locale (locale), | 2064 locale_type_from_locale (locale), |
2064 tag_set, !NILP (exact_p), | 2065 tag_set, !NILP (exact_p), 1, 1)); |
2065 1, 1)); | |
2066 } | 2066 } |
2067 else | 2067 else |
2068 return Fspecifier_spec_list (specifier, locale, tag_set, exact_p); | 2068 return Fspecifier_spec_list (specifier, locale, tag_set, exact_p); |
2069 } | 2069 } |
2070 | 2070 |
2107 to be removed. | 2107 to be removed. |
2108 */ | 2108 */ |
2109 (specifier, locale, tag_set, exact_p)) | 2109 (specifier, locale, tag_set, exact_p)) |
2110 { | 2110 { |
2111 CHECK_SPECIFIER (specifier); | 2111 CHECK_SPECIFIER (specifier); |
2112 map_specifier (maybe_ghost_specifier (specifier), locale, | 2112 check_modifiable_specifier (specifier); |
2113 remove_specifier_mapfun, tag_set, exact_p, 0); | 2113 |
2114 map_specifier (specifier, locale, remove_specifier_mapfun, | |
2115 tag_set, exact_p, 0); | |
2114 recompute_cached_specifier_everywhere (specifier); | 2116 recompute_cached_specifier_everywhere (specifier); |
2115 return Qnil; | 2117 return Qnil; |
2116 } | 2118 } |
2117 | 2119 |
2118 void | 2120 void |
2119 remove_ghost_specifier (Lisp_Object specifier, Lisp_Object locale, | 2121 remove_ghost_specifier (Lisp_Object specifier, Lisp_Object locale, |
2120 Lisp_Object tag_set, Lisp_Object exact_p) | 2122 Lisp_Object tag_set, Lisp_Object exact_p) |
2121 { | 2123 { |
2122 int depth = reveal_ghost_specifiers_protected (); | 2124 int depth = unlock_ghost_specifiers_protected (); |
2123 Fremove_specifier (specifier, locale, tag_set, exact_p); | 2125 Fremove_specifier (XSPECIFIER(specifier)->fallback, |
2126 locale, tag_set, exact_p); | |
2124 unbind_to (depth, Qnil); | 2127 unbind_to (depth, Qnil); |
2125 } | 2128 } |
2126 | 2129 |
2127 struct copy_specifier_closure | 2130 struct copy_specifier_closure |
2128 { | 2131 { |
2200 dest = make_specifier (XSPECIFIER (specifier)->methods); | 2203 dest = make_specifier (XSPECIFIER (specifier)->methods); |
2201 } | 2204 } |
2202 else | 2205 else |
2203 { | 2206 { |
2204 CHECK_SPECIFIER (dest); | 2207 CHECK_SPECIFIER (dest); |
2208 check_modifiable_specifier (dest); | |
2205 if (XSPECIFIER (dest)->methods != XSPECIFIER (specifier)->methods) | 2209 if (XSPECIFIER (dest)->methods != XSPECIFIER (specifier)->methods) |
2206 error ("Specifiers not of same type"); | 2210 error ("Specifiers not of same type"); |
2207 } | 2211 } |
2208 | 2212 |
2209 cl.dest = dest; | 2213 cl.dest = dest; |
2210 GCPRO1 (dest); | 2214 GCPRO1 (dest); |
2211 map_specifier (maybe_ghost_specifier (specifier), locale, | 2215 map_specifier (specifier, locale, copy_specifier_mapfun, |
2212 copy_specifier_mapfun, tag_set, exact_p, &cl); | 2216 tag_set, exact_p, &cl); |
2213 UNGCPRO; | 2217 UNGCPRO; |
2214 recompute_cached_specifier_everywhere (dest); | 2218 recompute_cached_specifier_everywhere (dest); |
2215 return dest; | 2219 return dest; |
2216 } | 2220 } |
2217 | 2221 |
2445 frame = domain; | 2449 frame = domain; |
2446 else if (DEVICEP (domain)) | 2450 else if (DEVICEP (domain)) |
2447 device = domain; | 2451 device = domain; |
2448 else | 2452 else |
2449 /* #### dmoore - dammit, this should just signal an error or something | 2453 /* #### dmoore - dammit, this should just signal an error or something |
2450 shouldn't it? */ | 2454 shouldn't it? |
2455 #### No. Errors are handled in Lisp primitives implementation. | |
2456 Invalid domain is a design error here - kkm. */ | |
2451 abort (); | 2457 abort (); |
2452 | 2458 |
2453 if (NILP (buffer) && !NILP (window)) | 2459 if (NILP (buffer) && !NILP (window)) |
2454 buffer = XWINDOW (window)->buffer; | 2460 buffer = XWINDOW (window)->buffer; |
2455 if (NILP (frame) && !NILP (window)) | 2461 if (NILP (frame) && !NILP (window)) |
2579 Lisp_Object instance; | 2585 Lisp_Object instance; |
2580 | 2586 |
2581 CHECK_SPECIFIER (specifier); | 2587 CHECK_SPECIFIER (specifier); |
2582 domain = decode_domain (domain); | 2588 domain = decode_domain (domain); |
2583 | 2589 |
2584 instance = specifier_instance (maybe_ghost_specifier (specifier), | 2590 instance = specifier_instance (specifier, Qunbound, domain, ERROR_ME, 0, |
2585 Qunbound, domain, ERROR_ME, 0, | |
2586 !NILP (no_fallback), Qzero); | 2591 !NILP (no_fallback), Qzero); |
2587 return UNBOUNDP (instance) ? default_ : instance; | 2592 return UNBOUNDP (instance) ? default_ : instance; |
2588 } | 2593 } |
2589 | 2594 |
2590 DEFUN ("specifier-matching-instance", Fspecifier_matching_instance, 2, 5, 0, /* | 2595 DEFUN ("specifier-matching-instance", Fspecifier_matching_instance, 2, 5, 0, /* |
2617 CHECK_SPECIFIER (specifier); | 2622 CHECK_SPECIFIER (specifier); |
2618 check_valid_specifier_matchspec (matchspec, XSPECIFIER (specifier)->methods, | 2623 check_valid_specifier_matchspec (matchspec, XSPECIFIER (specifier)->methods, |
2619 ERROR_ME); | 2624 ERROR_ME); |
2620 domain = decode_domain (domain); | 2625 domain = decode_domain (domain); |
2621 | 2626 |
2622 instance = specifier_instance (maybe_ghost_specifier (specifier), | 2627 instance = specifier_instance (specifier, matchspec, domain, ERROR_ME, |
2623 matchspec, domain, ERROR_ME, | |
2624 0, !NILP (no_fallback), Qzero); | 2628 0, !NILP (no_fallback), Qzero); |
2625 return UNBOUNDP (instance) ? default_ : instance; | 2629 return UNBOUNDP (instance) ? default_ : instance; |
2626 } | 2630 } |
2627 | 2631 |
2628 DEFUN ("specifier-instance-from-inst-list", | 2632 DEFUN ("specifier-instance-from-inst-list", Fspecifier_instance_from_inst_list, |
2629 Fspecifier_instance_from_inst_list, 3, 4, 0, /* | 2633 3, 4, 0, /* |
2630 Attempt to convert a particular inst-list into an instance. | 2634 Attempt to convert a particular inst-list into an instance. |
2631 This attempts to instantiate INST-LIST in the given DOMAIN, | 2635 This attempts to instantiate INST-LIST in the given DOMAIN, |
2632 as if INST-LIST existed in a specification in SPECIFIER. If | 2636 as if INST-LIST existed in a specification in SPECIFIER. If |
2633 the instantiation fails, DEFAULT is returned. In most circumstances, | 2637 the instantiation fails, DEFAULT is returned. In most circumstances, |
2634 you should not use this function; use `specifier-instance' instead. | 2638 you should not use this function; use `specifier-instance' instead. |
2642 | 2646 |
2643 CHECK_SPECIFIER (specifier); | 2647 CHECK_SPECIFIER (specifier); |
2644 check_valid_domain (domain); | 2648 check_valid_domain (domain); |
2645 check_valid_inst_list (inst_list, sp->methods, ERROR_ME); | 2649 check_valid_inst_list (inst_list, sp->methods, ERROR_ME); |
2646 GCPRO1 (built_up_list); | 2650 GCPRO1 (built_up_list); |
2647 built_up_list = build_up_processed_list (maybe_ghost_specifier (specifier), | 2651 built_up_list = build_up_processed_list (specifier, domain, inst_list); |
2648 domain, inst_list); | |
2649 if (!NILP (built_up_list)) | 2652 if (!NILP (built_up_list)) |
2650 val = specifier_instance_from_inst_list (maybe_ghost_specifier (specifier), | 2653 val = specifier_instance_from_inst_list (specifier, Qunbound, domain, |
2651 Qunbound, domain, built_up_list, | 2654 built_up_list, ERROR_ME, |
2652 ERROR_ME, 0, Qzero); | 2655 0, Qzero); |
2653 UNGCPRO; | 2656 UNGCPRO; |
2654 return UNBOUNDP (val) ? default_ : val; | 2657 return UNBOUNDP (val) ? default_ : val; |
2655 } | 2658 } |
2656 | 2659 |
2657 DEFUN ("specifier-matching-instance-from-inst-list", | 2660 DEFUN ("specifier-matching-instance-from-inst-list", Fspecifier_matching_instance_from_inst_list, |
2658 Fspecifier_matching_instance_from_inst_list, 4, 5, 0, /* | 2661 4, 5, 0, /* |
2659 Attempt to convert a particular inst-list into an instance. | 2662 Attempt to convert a particular inst-list into an instance. |
2660 This attempts to instantiate INST-LIST in the given DOMAIN | 2663 This attempts to instantiate INST-LIST in the given DOMAIN |
2661 \(as if INST-LIST existed in a specification in SPECIFIER), | 2664 \(as if INST-LIST existed in a specification in SPECIFIER), |
2662 matching the specifications against MATCHSPEC. | 2665 matching the specifications against MATCHSPEC. |
2663 | 2666 |
2677 check_valid_specifier_matchspec (matchspec, XSPECIFIER (specifier)->methods, | 2680 check_valid_specifier_matchspec (matchspec, XSPECIFIER (specifier)->methods, |
2678 ERROR_ME); | 2681 ERROR_ME); |
2679 check_valid_domain (domain); | 2682 check_valid_domain (domain); |
2680 check_valid_inst_list (inst_list, sp->methods, ERROR_ME); | 2683 check_valid_inst_list (inst_list, sp->methods, ERROR_ME); |
2681 GCPRO1 (built_up_list); | 2684 GCPRO1 (built_up_list); |
2682 built_up_list = build_up_processed_list (maybe_ghost_specifier (specifier), | 2685 built_up_list = build_up_processed_list (specifier, domain, inst_list); |
2683 domain, inst_list); | |
2684 if (!NILP (built_up_list)) | 2686 if (!NILP (built_up_list)) |
2685 val = specifier_instance_from_inst_list (maybe_ghost_specifier (specifier), | 2687 val = specifier_instance_from_inst_list (specifier, matchspec, domain, |
2686 matchspec, domain, built_up_list, | 2688 built_up_list, ERROR_ME, |
2687 ERROR_ME, 0, Qzero); | 2689 0, Qzero); |
2688 UNGCPRO; | 2690 UNGCPRO; |
2689 return UNBOUNDP (val) ? default_ : val; | 2691 return UNBOUNDP (val) ? default_ : val; |
2690 } | 2692 } |
2691 | 2693 |
2692 | 2694 |
3128 Vall_specifiers = Qnil; | 3130 Vall_specifiers = Qnil; |
3129 | 3131 |
3130 Vuser_defined_tags = Qnil; | 3132 Vuser_defined_tags = Qnil; |
3131 staticpro (&Vuser_defined_tags); | 3133 staticpro (&Vuser_defined_tags); |
3132 | 3134 |
3133 Vreveal_ghoste_specifiers = Qnil; | 3135 Vunlock_ghost_specifiers = Qnil; |
3134 staticpro (&Vreveal_ghoste_specifiers); | 3136 staticpro (&Vunlock_ghost_specifiers); |
3135 } | 3137 } |