make cut_c default.
This commit is contained in:
parent
ffdf270a3d
commit
af32dc1a9c
@ -18,11 +18,11 @@ struct cut_c_str{
|
|||||||
#define CUT_C_STR_SIZE ((sizeof(struct cut_c_str))/(sizeof(CELL)))
|
#define CUT_C_STR_SIZE ((sizeof(struct cut_c_str))/(sizeof(CELL)))
|
||||||
|
|
||||||
#define EXTRA_CBACK_CUT_ARG(Type,Offset) \
|
#define EXTRA_CBACK_CUT_ARG(Type,Offset) \
|
||||||
((Type) (*(Type *)(((CELL *)Yap_REGS.CUT_C_TOP) - (((yamop *)Yap_REGS.CUT_C_TOP->try_userc_cut_yamop)->u.lds.extra)) + (Offset-1)))
|
((Type) (*(Type *)(((CELL *)Yap_REGS.CUT_C_TOP) - (((yamop *)Yap_REGS.CUT_C_TOP->try_userc_cut_yamop)->u.OtapFs.extra)) + (Offset-1)))
|
||||||
|
|
||||||
#define CUT_C_PUSH(YAMOP,S_YREG) \
|
#define CUT_C_PUSH(YAMOP,S_YREG) \
|
||||||
{ \
|
{ \
|
||||||
if ((YAMOP)->u.lds.f){ \
|
if ((YAMOP)->u.OtapFs.f){ \
|
||||||
S_YREG = S_YREG - CUT_C_STR_SIZE; \
|
S_YREG = S_YREG - CUT_C_STR_SIZE; \
|
||||||
cut_c_str_ptr new_top = (cut_c_str_ptr) S_YREG; \
|
cut_c_str_ptr new_top = (cut_c_str_ptr) S_YREG; \
|
||||||
new_top->try_userc_cut_yamop = YAMOP; \
|
new_top->try_userc_cut_yamop = YAMOP; \
|
||||||
@ -38,8 +38,8 @@ struct cut_c_str{
|
|||||||
|
|
||||||
#define POP_EXECUTE() \
|
#define POP_EXECUTE() \
|
||||||
cut_c_str_ptr TOP = Yap_REGS.CUT_C_TOP; \
|
cut_c_str_ptr TOP = Yap_REGS.CUT_C_TOP; \
|
||||||
CPredicate func = (CPredicate)((yamop *)TOP->try_userc_cut_yamop)->u.lds.f; \
|
CPredicate func = (CPredicate)((yamop *)TOP->try_userc_cut_yamop)->u.OtapFs.f; \
|
||||||
PredEntry *pred = (PredEntry *)((yamop *)TOP->try_userc_cut_yamop)->u.lds.p; \
|
PredEntry *pred = (PredEntry *)((yamop *)TOP->try_userc_cut_yamop)->u.OtapFs.p; \
|
||||||
YAP_Execute(pred,func); \
|
YAP_Execute(pred,func); \
|
||||||
cut_c_pop();
|
cut_c_pop();
|
||||||
|
|
||||||
|
@ -49,7 +49,7 @@ DOCSDIR=$(SHAREDIR)/docs/yap
|
|||||||
#
|
#
|
||||||
# check also optimisation options in INSTALL file.
|
# check also optimisation options in INSTALL file.
|
||||||
#
|
#
|
||||||
YAP_EXTRAS=@YAP_EXTRAS@
|
YAP_EXTRAS=-DCUT_C=1 @YAP_EXTRAS@
|
||||||
|
|
||||||
YAPSTARTUP=startup.yss
|
YAPSTARTUP=startup.yss
|
||||||
|
|
||||||
|
29
docs/yap.tex
29
docs/yap.tex
@ -14921,14 +14921,16 @@ YAP, in the initialization routine, with a call to
|
|||||||
where @var{name} is the name of the predicate, @var{fn} is the C function
|
where @var{name} is the name of the predicate, @var{fn} is the C function
|
||||||
implementing the predicate and @var{arity} is its arity.
|
implementing the predicate and @var{arity} is its arity.
|
||||||
|
|
||||||
@findex YAP_UserBackCPredicate (C-Interface function)
|
@findex YAP_UserBackCPredicate (C-Interface function, deprecated)
|
||||||
|
@findex YAP_UserBackCutCPredicate (C-Interface function)
|
||||||
@findex YAP_PRESERVE_DATA (C-Interface function)
|
@findex YAP_PRESERVE_DATA (C-Interface function)
|
||||||
@findex YAP_PRESERVED_DATA (C-Interface function)
|
@findex YAP_PRESERVED_DATA (C-Interface function)
|
||||||
@findex YAP_cutsucceed (C-Interface function)
|
@findex YAP_cutsucceed (C-Interface function)
|
||||||
@findex YAP_cutfail (C-Interface function)
|
@findex YAP_cutfail (C-Interface function)
|
||||||
For the second kind of predicates we need two C functions. The first one
|
For the second kind of predicates we need three C functions. The first one
|
||||||
which is called when the predicate is first activated, and the second one
|
is called when the predicate is first activated; the second one
|
||||||
to be called on backtracking to provide (possibly) other solutions. Note
|
is called on backtracking to provide (possibly) other solutions; the
|
||||||
|
last one is called on pruning. Note
|
||||||
also that we normally also need to preserve some information to find out
|
also that we normally also need to preserve some information to find out
|
||||||
the next solution.
|
the next solution.
|
||||||
|
|
||||||
@ -15050,25 +15052,26 @@ Backtrackable predicates should be declared to YAP, in a way
|
|||||||
similar to what happened with deterministic ones, but using instead a
|
similar to what happened with deterministic ones, but using instead a
|
||||||
call to
|
call to
|
||||||
@example
|
@example
|
||||||
void YAP_UserBackCPredicate(char *@var{name},
|
void YAP_UserBackCutCPredicate(char *@var{name},
|
||||||
int *@var{init}(), int *@var{cont}(),
|
int *@var{init}(), int *@var{cont}(), int *@var{cut}(),
|
||||||
unsigned long int @var{arity}, unsigned int @var{sizeof});
|
unsigned long int @var{arity}, unsigned int @var{sizeof});
|
||||||
@end example
|
@end example
|
||||||
@noindent
|
@noindent
|
||||||
where @var{name} is a string with the name of the predicate, @var{init} and
|
where @var{name} is a string with the name of the predicate, @var{init},
|
||||||
@var{cont} are the C functions used to start and continue the execution of
|
@var{cont}, @var{cut} are the C functions used to start, continue and
|
||||||
the predicate, @var{arity} is the predicate arity, and @var{sizeof} is
|
when pruning the execution of the predicate, @var{arity} is the
|
||||||
the size of the data to be preserved in the stack. In this example, we
|
predicate arity, and @var{sizeof} is the size of the data to be
|
||||||
would have something like
|
preserved in the stack. In this example, we would have something like
|
||||||
|
|
||||||
@example
|
@example
|
||||||
void
|
void
|
||||||
init_n100(void)
|
init_n100(void)
|
||||||
@{
|
@{
|
||||||
YAP_UserBackCPredicate("n100", start_n100, continue_n100, 1, 1);
|
YAP_UserBackCutCPredicate("n100", start_n100, continue_n100, NULL, 1, 1);
|
||||||
@}
|
@}
|
||||||
@end example
|
@end example
|
||||||
|
Notice that we do not actually need to do anything on receiving a cut in
|
||||||
|
this case.
|
||||||
|
|
||||||
@node Loading Objects, Save&Rest, Writing C, C-Interface
|
@node Loading Objects, Save&Rest, Writing C, C-Interface
|
||||||
@section Loading Object Files
|
@section Loading Object Files
|
||||||
|
@ -2088,7 +2088,7 @@ X_API void PL_register_foreign_in_module(const char *module, const char *name, i
|
|||||||
nflags |= CArgsPredFlag;
|
nflags |= CArgsPredFlag;
|
||||||
}
|
}
|
||||||
if (flags & PL_FA_NONDETERMINISTIC) {
|
if (flags & PL_FA_NONDETERMINISTIC) {
|
||||||
Yap_InitCPredBack((char *)name, arity, sizeof(struct foreign_context)/sizeof(CELL), (CPredicate)function, (CPredicate)function, UserCPredFlag|nflags);
|
Yap_InitCutCPredBack((char *)name, arity, sizeof(struct foreign_context)/sizeof(CELL), (CPredicate)function, (CPredicate)function, (CPredicate)function, UserCPredFlag|nflags);
|
||||||
} else {
|
} else {
|
||||||
UserCPredicate((char *)name,(CPredicate)function,arity,tmod,nflags);
|
UserCPredicate((char *)name,(CPredicate)function,arity,tmod,nflags);
|
||||||
}
|
}
|
||||||
|
@ -1 +1 @@
|
|||||||
Subproject commit 5f7abe62fc770d680b78c3f3e8b65951c7004850
|
Subproject commit f6bb7821268b5c6df1ce83a9d60af1f90a9dd673
|
@ -1 +1 @@
|
|||||||
Subproject commit 25bfaa3370ca6f6a2b23d8dcc6dda84a2773d40a
|
Subproject commit d661852f76fe24441d983ef6f4e60ba90cfe17c4
|
Reference in New Issue
Block a user