Example #1
0
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;
}
Example #2
0
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;
}
Example #3
0
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;
}
Example #4
0
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;
}
Example #5
0
char *
procedureName(Procedure proc)
{ return predicateName(proc->definition);
}