static Code chainMetaPredicateSupervisor(Definition def, Code post) { if ( true(def, P_META) && true(def, P_TRANSPARENT) ) { tmp_buffer buf; unsigned int i; int count = 0; Code codes; initBuffer(&buf); for(i=0; i < def->functor->arity; i++) { int ma = MA_INFO(def, i); if ( ma <= 9 || ma == MA_META || ma == MA_HAT || ma == MA_DCG ) /* 0..9, :, ^ or // */ { addBuffer(&buf, encode(S_MQUAL), code); addBuffer(&buf, VAROFFSET(i), code); count++; } } if ( count > 0 ) { baseBuffer(&buf, code)[(count-1)*2] = encode(S_LMQUAL); copySuperVisorCode((Buffer)&buf, post); freeCodes(post); codes = allocCodes(entriesBuffer(&buf, code)); copyCodes(codes, baseBuffer(&buf, code), entriesBuffer(&buf, code)); return codes; } else { discardBuffer(&buf); } } return post; }
static Code chainMetaPredicateSupervisor(Definition def, Code post) { if ( true(def, P_META) && true(def, P_TRANSPARENT) ) { tmp_buffer buf; unsigned int i; int count = 0; Code codes; initBuffer(&buf); for(i=0; i < def->functor->arity; i++) { int ma = def->impl.any.args[i].meta; if ( MA_NEEDS_TRANSPARENT(ma) ) { addBuffer(&buf, encode(S_MQUAL), code); addBuffer(&buf, VAROFFSET(i), code); count++; } } if ( count > 0 ) { baseBuffer(&buf, code)[(count-1)*2] = encode(S_LMQUAL); copySuperVisorCode((Buffer)&buf, post); freeCodes(post); codes = allocCodes(entriesBuffer(&buf, code)); copyCodes(codes, baseBuffer(&buf, code), entriesBuffer(&buf, code)); return codes; } else { discardBuffer(&buf); } } return post; }
static Code listSupervisor(Definition def) { if ( def->impl.clauses.number_of_clauses == 2 ) { ClauseRef cref[2]; word c[2]; int found = getClauses(def, cref, 2); if ( found == 2 && arg1Key(cref[0]->value.clause->codes, &c[0]) && arg1Key(cref[1]->value.clause->codes, &c[1]) && ( (c[0] == ATOM_nil && c[1] == FUNCTOR_dot2) || (c[1] == ATOM_nil && c[0] == FUNCTOR_dot2) ) ) { Code codes = allocCodes(3); DEBUG(1, Sdprintf("List supervisor for %s\n", predicateName(def))); codes[0] = encode(S_LIST); if ( c[0] == ATOM_nil ) { codes[1] = (code)cref[0]; codes[2] = (code)cref[1]; } else { codes[1] = (code)cref[1]; codes[2] = (code)cref[0]; } return codes; } } return NULL; }
int createForeignSupervisor(Definition def, Func f) { assert(true(def, P_FOREIGN)); if ( false(def, P_VARARG) ) { if ( def->functor->arity > MAX_FLI_ARGS ) sysError("Too many arguments to foreign function %s (>%d)", \ predicateName(def), MAX_FLI_ARGS); \ } if ( false(def, P_NONDET) ) { Code codes = allocCodes(4); codes[0] = encode(I_FOPEN); if ( true(def, P_VARARG) ) codes[1] = encode(I_FCALLDETVA); else codes[1] = encode(I_FCALLDET0+def->functor->arity); codes[2] = (code)f; codes[3] = encode(I_FEXITDET); def->codes = codes; } else { Code codes = allocCodes(5); codes[0] = encode(I_FOPENNDET); if ( true(def, P_VARARG) ) codes[1] = encode(I_FCALLNDETVA); else codes[1] = encode(I_FCALLNDET0+def->functor->arity); codes[2] = (code)f; codes[3] = encode(I_FEXITNDET); codes[4] = encode(I_FREDO); def->codes = codes; } #ifdef O_PROF_PENTIUM assert(prof_foreign_index < MAXPROF); def->prof_index = prof_foreign_index++; def->prof_name = strdup(predicateName(def)); #endif succeed; }
static Code singleClauseSupervisor(Definition def) { if ( def->number_of_clauses == 1 ) { ClauseRef cref; Code codes = allocCodes(2); getClauses(def, &cref); DEBUG(1, Sdprintf("Single clause supervisor for %s\n", predicateName(def))); codes[0] = encode(S_TRUSTME); codes[1] = (code)cref; return codes; } return NULL; }