STATIC void cpp_ecsu_data_indirect_type(type *t) { int i; tym_t ty; i = 0; if (t->Tnext) { ty = t->Tnext->Tty & (mTYconst | mTYvolatile); switch (tybasic(t->Tty)) { case TYfptr: case TYvptr: case TYfref: ty |= mTYfar; break; case TYref: case TYarray: if (LARGEDATA && !(ty & mTYLINK)) ty |= mTYfar; break; case TYhptr: i += 8; break; } } else ty = t->Tty & (mTYLINK | mTYconst | mTYvolatile); i |= cpp_cvidx(ty); if (ty & (mTYcs | mTYfar)) i += 4; CHAR('A' + i); }
STATIC void cpp_argument_list(type *t, int flag) { int i; tym_t ty; //printf("cpp_argument_list(flag = %d)\n", flag); // If a data type that encodes only into one character ty = tybasic(t->Tty); if (ty <= TYldouble && ty != TYenum && ty != TYbool // added for versions >= 8.1b9 #if OVERLOAD_CV_PARAM && !(t->Tty & (mTYconst | mTYvolatile)) #endif ) { cpp_primary_data_type(t); } else { // See if a match with a previously used type for (i = 0; 1; i++) { if (i == mangle.argi) // no match { #if OVERLOAD_CV_PARAM if (ty <= TYcldouble || ty == TYstruct) { int cvidx = cpp_cvidx(t->Tty); if (cvidx) { // Digital Mars extensions CHAR('_'); CHAR('N' + cvidx); // _O, _P, _Q prefix } } #endif if (flag && tybasic(t->Tty) == TYarray) { cpp_reference_data_type(t, flag); } else cpp_primary_data_type(t); if (mangle.argi < 10) mangle.arg[mangle.argi++] = t; break; } if (typematch(t,mangle.arg[i],0)) { CHAR('0' + i); // argument_replicator break; } } } }
STATIC void cpp_data_indirect_type(type *t) { int i; if (tybasic(t->Tty) == TYmemptr) // if pointer to member { i = cpp_cvidx(t->Tty); if (t->Tty & mTYfar) i += 4; CHAR('Q' + i); cpp_scope(t->Ttag); CHAR('@'); } else cpp_ecsu_data_indirect_type(t); }
STATIC void cpp_reference_data_type(type *t, int flag) { if (tybasic(t->Tty) == TYarray) { int ndim; type *tn; int i; CHAR('Y'); // Compute number of dimensions (we have at least one) ndim = 0; tn = t; do { ndim++; tn = tn->Tnext; } while (tybasic(tn->Tty) == TYarray); cpp_dimension(ndim); for (; tybasic(t->Tty) == TYarray; t = t->Tnext) { if (t->Tflags & TFvla) CHAR('X'); // DMC++ extension else cpp_dimension(t->Tdim); } // DMC++ extension if (flag) // if template type argument { i = cpp_cvidx(t->Tty); if (i) { CHAR('_'); //CHAR('X' + i - 1); // _X, _Y, _Z CHAR('O' + i - 1); // _O, _P, _Q } } cpp_basic_data_type(t); } else cpp_basic_data_type(t); }
STATIC void cpp_basic_data_type(type *t) { char c; int i; //printf("cpp_basic_data_type(t)\n"); //type_print(t); switch (tybasic(t->Tty)) { case TYschar: c = 'C'; goto dochar; case TYchar: c = 'D'; goto dochar; case TYuchar: c = 'E'; goto dochar; case TYshort: c = 'F'; goto dochar; case TYushort: c = 'G'; goto dochar; case TYint: c = 'H'; goto dochar; case TYuint: c = 'I'; goto dochar; case TYlong: c = 'J'; goto dochar; case TYulong: c = 'K'; goto dochar; case TYfloat: c = 'M'; goto dochar; case TYdouble: c = 'N'; goto dochar; case TYdouble_alias: if (intsize == 4) { c = 'O'; goto dochar; } c = 'Z'; goto dochar2; case TYldouble: if (intsize == 2) { c = 'O'; goto dochar; } c = 'Z'; goto dochar2; dochar: CHAR(c); break; case TYllong: c = 'J'; goto dochar2; case TYullong: c = 'K'; goto dochar2; case TYbool: c = 'N'; goto dochar2; // was 'X' prior to 8.1b8 case TYwchar_t: if (config.flags4 & CFG4nowchar_t) { c = 'G'; goto dochar; // same as TYushort } else { pstate.STflags |= PFLmfc; c = 'Y'; goto dochar2; } // Digital Mars extensions case TYifloat: c = 'R'; goto dochar2; case TYidouble: c = 'S'; goto dochar2; case TYildouble: c = 'T'; goto dochar2; case TYcfloat: c = 'U'; goto dochar2; case TYcdouble: c = 'V'; goto dochar2; case TYcldouble: c = 'W'; goto dochar2; case TYchar16: c = 'X'; goto dochar2; case TYdchar: c = 'Y'; goto dochar2; case TYnullptr: c = 'Z'; goto dochar2; dochar2: CHAR('_'); goto dochar; #if TARGET_SEGMENTED case TYsptr: case TYcptr: case TYf16ptr: case TYfptr: case TYhptr: case TYvptr: #endif #if !MARS case TYmemptr: #endif case TYnptr: c = 'P' + cpp_cvidx(t->Tty); CHAR(c); if(I64) CHAR('E'); // __ptr64 modifier cpp_pointer_type(t); break; case TYstruct: case TYenum: cpp_ecsu_data_type(t); break; case TYarray: i = cpp_cvidx(t->Tty); i |= 1; // always const CHAR('P' + i); cpp_pointer_type(t); break; case TYvoid: c = 'X'; goto dochar; #if !MARS case TYident: if (pstate.STintemplate) { CHAR('V'); // pretend to be a class name cpp_zname(t->Tident); } else { #if SCPP cpperr(EM_no_type,t->Tident); // no type for argument #endif c = 'X'; goto dochar; } break; case TYtemplate: if (pstate.STintemplate) { CHAR('V'); // pretend to be a class name cpp_zname(((typetemp_t *)t)->Tsym->Sident); } else goto Ldefault; break; #endif default: Ldefault: if (tyfunc(t->Tty)) cpp_function_type(t); else { #if SCPP #ifdef DEBUG if (!errcnt) type_print(t); #endif assert(errcnt); #endif } } }