make cut_c default.

This commit is contained in:
Vítor Manuel de Morais Santos Costa 2010-01-15 15:09:18 +00:00
parent ffdf270a3d
commit af32dc1a9c
6 changed files with 24 additions and 21 deletions

View File

@ -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();

View File

@ -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

View File

@ -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

View File

@ -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