📄 undname.cpp
字号:
declaration += '(' + getArgumentTypes () + ')';
// If this is a non-static member function, append the 'this' modifiers
if ( TE_ismember ( typeCode ) && !TE_isstatic ( typeCode ))
declaration += thisType;
// Add the 'throw' signature
if ( doThrowTypes ())
declaration += getThrowTypes ();
else
declaration |= getThrowTypes (); // Just lose the 'throw-types'
// If it has a declarator, then insert it into the declaration,
// sensitive to the return type composition
if ( doFunctionReturns () && pDeclarator )
{
*pDeclarator = declaration;
declaration = returnType;
} // End of IF
} // End of IF else
} // End of IF then
else
{
declaration += symbol;
// Catch the special handling cases
#if ( !NO_COMPILER_NAMES )
if ( TE_isvftable ( typeCode ))
return getVfTableType ( declaration );
elif ( TE_isvbtable ( typeCode ))
return getVbTableType ( declaration );
elif ( TE_isguard ( typeCode ))
return ( declaration + '{' + getGuardNumber () + "}'" );
elif ( TE_isthunk ( typeCode ) && TE_islocaldtor ( typeCode ))
declaration += "`local static destructor helper'";
elif ( TE_isthunk ( typeCode ) && TE_istemplatector ( typeCode ))
declaration += "`template static data member constructor helper'";
elif ( TE_isthunk ( typeCode ) && TE_istemplatedtor ( typeCode ))
declaration += "`template static data member destructor helper'";
elif ( TE_ismetaclass ( typeCode ))
//
// Meta-class information has its information in its operator id
//
return declaration;
#else // } elif NO_COMPILER_NAMES {
if ( TE_isvftable ( typeCode )
|| TE_isvbtable ( typeCode )
|| TE_isguard ( typeCode )
|| TE_ismetaclass ( typeCode ))
return DN_invalid;
#endif // NO_COMPILER_NAMES
if ( TE_isthunk( typeCode ) && ( TE_istemplatector( typeCode ) || TE_istemplatedtor( typeCode ))) {
//
// Insert a space before the declaration
//
declaration = " " + declaration;
}
else {
// All others are decorated as data symbols
declaration = getExternalDataType ( declaration );
}
} // End of IF else
// Prepend the 'virtual' and 'static' attributes for members
if ( TE_ismember ( typeCode ))
{
if ( doMemberTypes ())
{
if ( TE_isstatic ( typeCode ))
declaration = "static " + declaration;
if ( TE_isvirtual ( typeCode ) || ( TE_isthunk ( typeCode ) && ( TE_isvtoradj ( typeCode ) || TE_isadjustor ( typeCode ))))
declaration = "virtual " + declaration;
} // End of IF
// Prepend the access specifiers
if ( doAccessSpecifiers ())
if ( TE_isprivate ( typeCode ))
declaration = "private: " + declaration;
elif ( TE_isprotected ( typeCode ))
declaration = "protected: " + declaration;
elif ( TE_ispublic ( typeCode ))
declaration = "public: " + declaration;
} // End of IF
#if ( !NO_COMPILER_NAMES )
// If it is a thunk, mark it appropriately
if ( TE_isthunk ( typeCode ))
declaration = "[thunk]:" + declaration;
#endif // !NO_COMPILER_NAMES
// Return the composed declaration
return declaration;
} // End of "UnDecorator" FUNCTION "composeDeclaration"
inline int __near UnDecorator::getTypeEncoding ( void )
{
unsigned int typeCode = 0u;
// Strip any leading '_' which indicates that it is based
if ( *gName == '_' )
{
TE_setisbased ( typeCode );
gName++;
} // End of IF
// Now handle the code proper :-
if (( *gName >= 'A' ) && ( *gName <= 'Z' )) // Is it some sort of function ?
{
int code = *gName++ - 'A';
// Now determine the function type
TE_setisfunction ( typeCode ); // All of them are functions ?
// Determine the calling model
if ( code & TE_far )
TE_setisfar ( typeCode );
else
TE_setisnear ( typeCode );
// Is it a member function or not ?
if ( code < TE_external )
{
// Record the fact that it is a member
TE_setismember ( typeCode );
// What access permissions does it have
switch ( code & TE_access )
{
case TE_private:
TE_setisprivate ( typeCode );
break;
case TE_protect:
TE_setisprotected ( typeCode );
break;
case TE_public:
TE_setispublic ( typeCode );
break;
default:
TE_setisbadtype ( typeCode );
return typeCode;
} // End of SWITCH
// What type of a member function is it ?
switch ( code & TE_adjustor )
{
case TE_adjustor:
TE_setisadjustor ( typeCode );
break;
case TE_virtual:
TE_setisvirtual ( typeCode );
break;
case TE_static:
TE_setisstatic ( typeCode );
break;
case TE_member:
break;
default:
TE_setisbadtype ( typeCode );
return typeCode;
} // End of SWITCH
} // End of IF
} // End of IF then
elif ( *gName == '$' ) // Extended set ? Special handling
{
// What type of symbol is it ?
switch ( *( ++gName ))
{
case SHF_localdtor: // A destructor helper for a local static ?
TE_setislocaldtor ( typeCode );
break;
case SHF_vcall: // A VCall-thunk ?
TE_setisvcall ( typeCode );
break;
case SHF_templateStaticDataMemberCtor: // A constructor helper for template static data members
TE_setistemplatector ( typeCode );
break;
case SHF_templateStaticDataMemberDtor: // A destructor helper for template static data members
TE_setistemplatedtor ( typeCode );
break;
case 0:
TE_setistruncated ( typeCode );
break;
case '0':
case '1':
case '2':
case '3':
case '4':
case '5': // Construction displacement adjustor thunks
{
int code = *gName - '0';
// Set up the principal type information
TE_setisfunction ( typeCode );
TE_setismember ( typeCode );
TE_setisvtoradj ( typeCode );
// Is it 'near' or 'far' ?
if ( code & TE_far )
TE_setisfar ( typeCode );
else
TE_setisnear ( typeCode );
// What type of access protection ?
switch ( code & TE_access_vadj )
{
case TE_private_vadj:
TE_setisprivate ( typeCode );
break;
case TE_protect_vadj:
TE_setisprotected ( typeCode );
break;
case TE_public_vadj:
TE_setispublic ( typeCode );
break;
default:
TE_setisbadtype ( typeCode );
return typeCode;
} // End of SWITCH
} // End of CASE '0,1,2,3,4,5'
break;
default:
TE_setisbadtype ( typeCode );
return typeCode;
} // End of SWITCH
// Advance past the code character
gName++;
} // End of ELIF then
elif (( *gName >= TE_static_d ) && ( *gName <= TE_metatype )) // Non function decorations ?
{
int code = *gName++;
TE_setisdata ( typeCode );
// What type of symbol is it ?
switch ( code )
{
case ( TE_static_d | TE_private_d ):
TE_setisstatic ( typeCode );
TE_setisprivate ( typeCode );
break;
case ( TE_static_d | TE_protect_d ):
TE_setisstatic ( typeCode );
TE_setisprotected ( typeCode );
break;
case ( TE_static_d | TE_public_d ):
TE_setisstatic ( typeCode );
TE_setispublic ( typeCode );
break;
case TE_global:
TE_setisglobal ( typeCode );
break;
case TE_guard:
TE_setisguard ( typeCode );
break;
case TE_local:
TE_setislocal ( typeCode );
break;
case TE_vftable:
TE_setisvftable ( typeCode );
break;
case TE_vbtable:
TE_setisvbtable ( typeCode );
break;
case TE_metatype:
TE_setismetaclass ( typeCode );
break;
default:
TE_setisbadtype ( typeCode );
return typeCode;
} // End of SWITCH
} // End of ELIF then
elif ( *gName )
TE_setisbadtype ( typeCode );
else
TE_setistruncated ( typeCode );
// Return the composed type code
return typeCode;
} // End of "UnDecorator" FUNCTION "getTypeEncoding"
DName __near UnDecorator::getBasedType ( void )
{
DName basedDecl ( UScore ( TOK_basedLp ));
// What type of 'based' is it ?
if ( *gName )
{
switch ( *gName++ )
{
#if !VERS_32BIT
case BT_segname:
basedDecl += UScore ( TOK_segnameLpQ ) + getSegmentName () + "\")";
break;
case BT_segment:
basedDecl += DName ( "NYI:" ) + UScore ( TOK_segment );
break;
#endif
case BT_void:
basedDecl += "void";
break;
#if !VERS_32BIT
case BT_self:
basedDecl += UScore ( TOK_self );
break;
case BT_nearptr:
basedDecl += DName ( "NYI:" ) + UScore ( TOK_nearP );
break;
case BT_farptr:
basedDecl += DName ( "NYI:" ) + UScore ( TOK_farP );
break;
case BT_hugeptr:
basedDecl += DName ( "NYI:" ) + UScore ( TOK_hugeP );
break;
case BT_segaddr:
basedDecl += "NYI:<segment-address-of-variable>";
break;
#else
case BT_nearptr:
basedDecl += getScopedName();
break;
#endif
case BT_basedptr:
//
// Note: based pointer on based pointer is reserved
//
return DN_invalid;
} // End of SWITCH
} // End of IF else
else
basedDecl += DN_truncated;
// Close the based syntax
basedDecl += ") ";
// Return completed based declaration
return basedDecl;
} // End of "UnDecorator" FUNCTION "getBasedType"
DName __near UnDecorator::getScopedName ( void )
{
DName name;
// Get the beginning of the name
name = getZName ();
// Now the scope (if any)
if (( name.status () == DN_valid ) && *gName && ( *gName != '@' ))
name = getScope () + "::" + name;
// Skip the trailing '@'
if ( *gName == '@' )
gName++;
elif ( *gName )
name = DN_invalid;
elif ( name.isEmpty ())
name = DN_truncated;
else
name = DName ( DN_truncated ) + "::" + name;
// And return the complete name
return name;
} // End of "UnDecorator" FUNCTION "getECSUName"
inline DName UnDecorator::getECSUName ( void ) { return getScopedName(); }
inline DName __near UnDecorator::getEnumType ( void )
{
DName ecsuName;
if ( *gName )
{
// What type of an 'enum' is it ?
switch ( *gName )
{
case ET_schar:
case ET_uchar:
ecsuName = "char ";
break;
case ET_sshort:
case ET_ushort:
ecsuName = "short ";
break;
case ET_sint:
break;
case ET_uint:
ecsuName = "int ";
break;
case ET_slong:
case ET_ulong:
ecsuName = "long ";
break;
default:
return DN_invalid;
} // End of SWITCH
// Add the 'unsigned'ness if appropriate
switch ( *gName++ )
{
case ET_uchar:
case ET_ushort:
case ET_uint:
case ET_ulong:
ecsuName = "unsigned " + ecsuName;
break;
} // End of SWITCH
// Now return the composed name
return ecsuName;
} // End of IF then
else
return DN_truncated;
} // End of "UnDecorator" FUNCTION "getEnumType"
DName __near UnDecorator::getCallingConvention ( void )
{
if ( *gName )
{
unsigned int callCode = ((unsigned int)*gName++ ) - 'A';
// What is the primary calling convention
#if CC_COR
if (( callCode >= CC_cdecl ) && ( callCode <= CC_cocall ))
#else // CC_COR
if (( callCode >= CC_cdecl ) && ( callCode <= CC_interrupt ))
#endif // CC_COR
{
DName callType;
// Now, what type of 'calling-convention' is it, 'interrupt' is special ?
if ( doMSKeywords ())
#if !VERS_32BIT
if ( callCode == CC_interrupt )
callType = UScore ( TOK_interrupt );
else
#endif
{
switch ( callCode & ~CC_saveregs )
{
case CC_cdecl:
callType = UScore ( TOK_cdecl );
break;
case CC_pascal:
callType = UScore ( TOK_pascal );
break;
case CC_thiscall:
callType = UScore ( TOK_thiscall );
break;
case CC_stdcall:
callType = UScore ( TOK_stdcall );
break;
case CC_fastcall:
callType = UScore ( TOK_fastcall );
break;
case CC_cocall:
callType = UScore ( TOK_cocall );
break;
} // End of SWITCH
// Has it also got 'saveregs' marked ?
#if !VERS_32BIT
if ( callCode & CC_saveregs )
callType += ' ' + UScore ( TOK_saveregs );
#endif
} // End of IF else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -