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) :-
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).
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 = []
),
( 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
.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!("-")),
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]);
}