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; }
int createSupervisor(Definition def) { Code codes; if ( createUndefSupervisor(def)) succeed; if ( !((codes = multifileSupervisor(def)) || (codes = singleClauseSupervisor(def)) || (codes = listSupervisor(def)) || (codes = staticSupervisor(def))) ) { fatalError("Failed to create supervisor for %s\n", predicateName(def)); } def->codes = chainMetaPredicateSupervisor(def, codes); succeed; }
char * procedureName(Procedure proc) { return predicateName(proc->definition); }