Symbol *Dsymbol::toSymbolX(const char *prefix, int sclass, type *t, const char *suffix) { Symbol *s; char *id; const char *n; size_t nlen; //printf("Dsymbol::toSymbolX('%s')\n", prefix); n = mangle(); assert(n); nlen = strlen(n); #if 0 if (nlen > 2 && n[0] == '_' && n[1] == 'D') { nlen -= 2; n += 2; } #endif id = (char *) alloca(2 + nlen + sizeof(size_t) * 3 + strlen(prefix) + strlen(suffix) + 1); sprintf(id,"_D%s%zu%s%s", n, strlen(prefix), prefix, suffix); #if 0 if (global.params.isWindows && (type_mangle(t) == mTYman_c || type_mangle(t) == mTYman_std)) id++; // Windows C mangling will put the '_' back in #endif s = symbol_name(id, sclass, t); //printf("-Dsymbol::toSymbolX() %s\n", id); return s; }
char *cpp_mangle(symbol *s) { symbol_debug(s); //printf("cpp_mangle(s = %p, '%s')\n", s, s->Sident); //type_print(s->Stype); #if SCPP if (!CPP) return symbol_ident(s); #endif if (type_mangle(s->Stype) != mTYman_cpp) return symbol_ident(s); else { MangleInuse m; mangle.znamei = 0; mangle.argi = 0; mangle.np = mangle.buf; mangle.buf[BUFIDMAX + 1] = 0x55; cpp_decorated_name(s); *mangle.np = 0; // 0-terminate cpp_name[] //dbg_printf("cpp_mangle() = '%s'\n", mangle.buf); assert(strlen(mangle.buf) <= BUFIDMAX); assert(mangle.buf[BUFIDMAX + 1] == 0x55); return mangle.buf; } }
type *type_setmangle(type **pt,mangle_t mangle) { type *t; t = *pt; type_debug(t); if (mangle != type_mangle(t)) { if (t->Tcount > 1) // if other people pointing at t { type *tn; tn = type_copy(t); tn->Tcount++; type_free(t); t = tn; *pt = t; } t->Tmangle = mangle; } return t; }