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 }