]> Repositorios git - scryer-prolog.git/commitdiff
wrap meta-predicate specifications in functors (#1330)
authorMark Thom <[email protected]>
Tue, 8 Mar 2022 05:36:52 +0000 (22:36 -0700)
committerMark Thom <[email protected]>
Tue, 8 Mar 2022 05:36:52 +0000 (22:36 -0700)
src/loader.pl
src/machine/loader.rs

index 3d3e8bd200d13cf117409844a58c50610082bcc6..cb872035c3b7283c2354897be1183b85614b7fcd 100644 (file)
@@ -209,7 +209,8 @@ compile_term(Term, Evacuable) :-
 
 inner_meta_specs(0, HeadArg, InnerHeadArgs, InnerMetaSpecs) :-
     !,
-    predicate_property(HeadArg, meta_predicate(InnerMetaSpecs)),
+    predicate_property(HeadArg, meta_predicate(InnerMetaSpecs0)),
+    InnerMetaSpecs0 =.. [_ | InnerMetaSpecs],
     HeadArg =.. [_ | InnerHeadArgs].
 
 inner_meta_specs(N, HeadArg, InnerHeadArgs, InnerMetaSpecs) :-
@@ -219,7 +220,8 @@ inner_meta_specs(N, HeadArg, InnerHeadArgs, InnerMetaSpecs) :-
     length(InnerHeadArgs1, N),
     append(InnerHeadArgs, InnerHeadArgs1, InnerHeadArgs0),
     CompleteHeadArg =.. [Functor | InnerHeadArgs0],
-    predicate_property(CompleteHeadArg, meta_predicate(InnerMetaSpecs)).
+    predicate_property(CompleteHeadArg, meta_predicate(InnerMetaSpecs0)),
+    InnerMetaSpecs0 =.. [_ | InnerMetaSpecs].
 
 
 module_expanded_head_variables_([], _, HeadVars, HeadVars).
@@ -242,7 +244,8 @@ module_expanded_head_variables_([HeadArg | HeadArgs], [MetaSpec | MetaSpecs], He
 module_expanded_head_variables(Head, HeadVars) :-
     (  var(Head) ->
        instantiation_error(load/1)
-    ;  predicate_property(Head, meta_predicate(MetaSpecs)),
+    ;  predicate_property(Head, meta_predicate(MetaSpecs0)),
+       MetaSpecs0 =.. [_ | MetaSpecs],
        Head =.. [_ | HeadArgs] ->
        module_expanded_head_variables_(HeadArgs, MetaSpecs, HeadVars, [])
     ;  HeadVars = []
@@ -709,7 +712,8 @@ expand_goal(UnexpandedGoals, Module, ExpandedGoals, HeadVars) :-
        ),
        (  expand_goal_cases(Goals, Module, ExpandedGoals, HeadVars) ->
           true
-       ;  predicate_property(Module:Goals, meta_predicate(MetaSpecs)) ->
+       ;  predicate_property(Module:Goals, meta_predicate(MetaSpecs0)),
+          MetaSpecs0 =.. [_ | MetaSpecs] ->
           expand_module_names(Goals, MetaSpecs, Module, ExpandedGoals, HeadVars)
        ;  thread_goals(Goals, ExpandedGoals, (','))
        ;  Goals = ExpandedGoals
index 0b436f6f498b3618e7fb4a83e4950230a77e0d18..ce251e8461f19057cf93a76aeb27a1f3065fb356 100644 (file)
@@ -2192,8 +2192,10 @@ impl Machine {
             .get_meta_predicate_spec(predicate_name, arity, &compilation_target)
         {
             Some(meta_specs) => {
-                let list_loc = iter_to_heap_list(
-                    &mut self.machine_st.heap,
+                let term_loc = self.machine_st.heap.len();
+
+                self.machine_st.heap.push(atom_as_cell!(predicate_name, arity));
+                self.machine_st.heap.extend(
                     meta_specs.iter().map(|meta_spec| match meta_spec {
                         MetaSpec::Minus => atom_as_cell!(atom!("+")),
                         MetaSpec::Plus => atom_as_cell!(atom!("-")),
@@ -2201,12 +2203,13 @@ impl Machine {
                         MetaSpec::RequiresExpansionWithArgument(ref arg_num) => {
                             fixnum_as_cell!(Fixnum::build_with(*arg_num as i64))
                         }
-                    }));
+                    })
+                );
 
                 let heap_loc = self.machine_st.heap.len();
 
                 self.machine_st.heap.push(atom_as_cell!(atom!("meta_predicate"), 1));
-                self.machine_st.heap.push(heap_loc_as_cell!(list_loc));
+                self.machine_st.heap.push(str_loc_as_cell!(term_loc));
 
                 unify!(self.machine_st, str_loc_as_cell!(heap_loc), self.machine_st.registers[4]);
             }