Exemple #1
0
funcenum_t *funcenum_for_symbol(symbol *sym)
{
  functag_t ft;
  memset(&ft, 0, sizeof(ft));

  ft.ret_tag = sym->tag;
  ft.usage = uPUBLIC & (sym->usage & uRETVALUE);
  ft.argcount = 0;
  ft.ommittable = FALSE;
  for (arginfo *arg = sym->dim.arglist; arg->ident; arg++) {
    funcarg_t *dest = &ft.args[ft.argcount++];

    dest->tagcount = arg->numtags;
    memcpy(dest->tags, arg->tags, arg->numtags * sizeof(int));

    dest->dimcount = arg->numdim;
    memcpy(dest->dims, arg->dim, arg->numdim * sizeof(int));

    dest->ident = arg->ident;
    dest->fconst = !!(arg->usage & uCONST);
    dest->ommittable = FALSE;
  }

  char name[METHOD_NAMEMAX+1];
  UTIL_Format(name, sizeof(name), "::ft:%s:%d:%d", sym->name, sym->addr, sym->codeaddr);

  funcenum_t *fe = funcenums_add(name);
  functags_add(fe, &ft);

  return fe;
}
funcenum_t *funcenum_for_symbol(symbol *sym)
{
  auto ft = ke::MakeUnique<functag_t>();

  ft->ret_tag = sym->tag;
  ft->usage = uPUBLIC & (sym->usage & uRETVALUE);
  ft->argcount = 0;
  ft->ommittable = FALSE;
  for (arginfo& arg : sym->function()->args) {
    if (!arg.ident)
      break;

    funcarg_t *dest = &ft->args[ft->argcount++];

    dest->tagcount = 1;
    dest->tags[0] = arg.tag;

    dest->dimcount = arg.numdim;
    memcpy(dest->dims, arg.dim, arg.numdim * sizeof(int));

    dest->ident = arg.ident;
    dest->fconst = !!(arg.usage & uCONST);
    dest->ommittable = FALSE;
  }

  char name[METHOD_NAMEMAX+1];
  ke::SafeSprintf(name, sizeof(name), "::ft:%s:%d:%d", sym->name(), sym->addr(), sym->codeaddr);

  funcenum_t *fe = funcenums_add(name);
  functags_add(fe, ke::Move(ft));

  return fe;
}