Beispiel #1
0
/* Insert into mapAtom2Info */
void
insert_mapAtom2Info (FileOffset atom, char* var, unsigned char arity)
{
  Info *info;
  info = (Info*)malloc(sizeof(Info));
  info->node  = atom;
  info->var   = var;
  info->arity = arity;
  FM_insert(mapAtom2Info,(cast)atom,(cast)info);
}
Beispiel #2
0
/* Insert into either mapExp2Atom or mapContext2Atom */
void
insert_map2 (FiniteMap map2, FileOffset exp, FileOffset atom
            ,unsigned char arity)
{
  Info *info = (Info*)0;
  info = FM_lookup(mapAtom2Info,(cast)atom);
  if (info) {
    Atom *fun;
    fun = (Atom*)malloc(sizeof(Atom));
    fun->atom  = atom;
    fun->arity = info->arity - arity;
    FM_insert(map2,(cast)exp,(cast)fun);
  }
}
Beispiel #3
0
/* item_sort() doesn't do any sorting at all.  It folds one item of
 * information into one of three new finite maps (globals,locals,constrs).
 * The new maps are indexed by name rather than file position - if the
 * name is new, a new entry is created; if it exists already, the counts
 * are added together.
 */
int
item_sort (FileOffset node, item *it, void* dummy)
{
  item *already;
  switch (it->kind) {
    case TopId:
      already = FM_lookup(globals,(cast)it->name);
      if (already) {
        it->uses += already->uses;
        it->pending += already->pending;
        it->thunks  += already->thunks;
      } else
        FM_insert(globals,(cast)it->name,(cast)it);
      break;
    case LocalId:
      already = FM_lookup(locals,(cast)it->name);
      if (already) {
        it->uses += already->uses;
        it->pending += already->pending;
        it->thunks  += already->thunks;
      } else
        FM_insert(locals, (cast)it->name,(cast)it);
      break;
    case Construct:
      already = FM_lookup(constrs,(cast)it->name);
      if (already) {
        it->uses += already->uses;
        it->pending += already->pending;
        it->thunks  += already->thunks;
      } else
        FM_insert(constrs,(cast)it->name,(cast)it);
      break;
    default: break;
  }
  return False;
}
Beispiel #4
0
defn*
map2_insert (FileOffset usage, FileOffset def, unsigned char ap)
{
  item *it = (item*)NULL;
  it = FM_lookup(map1,(cast)(uintptr_t)def);
  if (it) {
    defn *fn;
    fn = (defn*)malloc(sizeof(defn));
    fn->atom  = def;
    fn->arity = it->arity - ap;
    fn->next  = (defn*)0;
  //if (strcmp(it->name,">=")==0)
  //  fprintf(stderr,"map2: %s at 0x%x (%d)\n",it->name,usage,it->uses);
    FM_insert(map2,(cast)(uintptr_t)usage,(cast)fn);
    return fn;
  } else return (defn*)0;
}
Beispiel #5
0
void
map1_insert (FileOffset node, char* id, idkind k, unsigned char arity)
{
  item *it = (item*)NULL;
  it = FM_lookup(map1,(cast)(uintptr_t)node);
  if (!it) {
    it = (item*)malloc(sizeof(item));
    it->name  = id;
    it->kind  = k;
    it->arity = arity;
    it->uses    = 0;
    it->pending = 0;
    it->thunks  = 0;
    it->thispos = node;
    FM_insert(map1,(cast)(uintptr_t)node,(cast)it);
  }
}