00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 static inline int prolog_call0(CTXTdeclc Cell term)
00030 {
00031 Psc psc;
00032 if (isconstr(term)) {
00033 int disp;
00034 char *addr;
00035 psc = get_str_psc(term);
00036 addr = (char *)(clref_val(term));
00037 for (disp = 1; disp <= (int)get_arity(psc); ++disp) {
00038 bld_copy(reg+disp, cell((CPtr)(addr)+disp));
00039 }
00040 } else if (isstring(term)) {
00041 int value;
00042 Pair sym;
00043 if (string_val(term) == true_string) return TRUE;
00044 sym = insert(string_val(term),0,(Psc)flags[CURRENT_MODULE],&value);
00045 psc = pair_psc(sym);
00046 } else {
00047 if (isnonvar(term))
00048 err_handle(CTXTc TYPE, 1, "call", 1, "callable term", term);
00049 else err(INSTANTIATION, 1, "call", 1);
00050 return FALSE;
00051 }
00052 #ifdef CP_DEBUG
00053 pscreg = psc;
00054 #endif
00055 pcreg = get_ep(psc);
00056 if (asynint_val) intercept(CTXTc psc);
00057 return TRUE;
00058 }
00059
00060
00061
00062 static inline int prolog_code_call(CTXTdeclc Cell term, int value)
00063 {
00064 Psc psc;
00065 if (isconstr(term)) {
00066 int disp;
00067 char *addr;
00068 psc = get_str_psc(term);
00069 addr = (char *)(clref_val(term));
00070 for (disp = 1; disp <= (int)get_arity(psc); ++disp) {
00071 bld_copy(reg+disp, cell((CPtr)(addr)+disp));
00072 }
00073 bld_int(reg+get_arity(psc)+1, value);
00074 } else bld_int(reg+1, value);
00075 return TRUE;
00076 }