mirror of
https://github.com/1dot13/source.git
synced 2026-08-05 14:00:23 +02:00
take popup option names by const reference, not by pointer
POPUP_OPTION copies the name it is given -- `this->name = *newName` into a
std::wstring member -- but its constructor took a std::wstring*, so 64 call
sites spelled the argument `&std::wstring( pStr )`. Taking the address of a
temporary is ill-formed, and clang refuses it outright:
error: taking the address of a temporary object of type 'std::wstring'
It happens to work under MSVC because the temporary outlives the call, dying
at the end of the full expression rather than before the copy. Nothing was
corrupt; the code was just spelling "pass me a string" in a way the language
does not allow.
A const reference says what these functions actually want, so the call sites
lose the &, and the two places that allocated a string purely to have an
address to pass -- POPUP_SUB_POPUP_OPTION's default constructor, which carried
a "TODO: possible memmory leak!" saying as much, and a "Dummy generator"
option -- stop leaking one.
Converted: POPUP_OPTION's constructor and setName, POPUP::addOption and
addSubMenuOption, and both POPUP_SUB_POPUP_OPTION constructors. The popupDef
family in popup_definition.* keeps its std::wstring* because it owns what it
is handed and stores the pointer; that is a different design and a different
change. The three calls it makes into the converted API now dereference.
Verification:
grep -rn '&std::wstring' --include=*.cpp --include=*.h . # nothing
ninja -C build parse # no popup_* or SkillMenu sites remain
ninja -C build -k 0 # Release, four applications, green
ninja -C build-debug -k 0 # Debug, four applications, green
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
committed by
majcosta
co-authored by
Claude Opus 4.8
parent
83b637aa73
commit
5e2982c509
@@ -2103,7 +2103,7 @@ void addItemsToPocketPopup( SOLDIERTYPE *pSoldier, INT16 sPocket, POPUP* popup,
|
||||
|
||||
if( optsTotal > 0 && optsTotal%15 == 0 ){ // divide to subBoxes every 10 items
|
||||
|
||||
POPUP * currPopupTmp = currPopup->addSubMenuOption( new std::wstring( gszPocketPopupText[POCKET_POPUP_MOAR] ) ); // the new popup
|
||||
POPUP * currPopupTmp = currPopup->addSubMenuOption( std::wstring( gszPocketPopupText[POCKET_POPUP_MOAR] ) ); // the new popup
|
||||
POPUP_SUB_POPUP_OPTION * currSubPopupTmp = currPopup->getSubPopupOption( currPopup->subPopupOptionCount-1 ); // the sub-popup option in prev popup
|
||||
|
||||
|
||||
@@ -2139,13 +2139,13 @@ void addItemsToPocketPopup( SOLDIERTYPE *pSoldier, INT16 sPocket, POPUP* popup,
|
||||
swprintf( pStr, L"%s (%d)", Item[ itr->first ].szItemName, numObjectsToPlace );
|
||||
|
||||
currPopup->addOption(
|
||||
&std::wstring( pStr ),
|
||||
std::wstring( pStr ),
|
||||
new popupCallbackFunction3<void,OBJECTTYPE*,UINT16,SOLDIERTYPE*>(&popupCallbackPlaceLeastDamagedFromStack,itr->second,sPocket,pSoldier)
|
||||
);
|
||||
|
||||
} else {
|
||||
currPopup->addOption(
|
||||
&std::wstring( Item[ itr->first ].szItemName ),
|
||||
std::wstring( Item[ itr->first ].szItemName ),
|
||||
new popupCallbackFunction3<void,OBJECTTYPE*,UINT16,SOLDIERTYPE*>(&popupCallbackPlaceLeastDamagedFromStack,itr->second,sPocket,pSoldier)
|
||||
);
|
||||
}
|
||||
@@ -2178,7 +2178,7 @@ void addWeaponGroupsToPocketPopup( SOLDIERTYPE *pSoldier, INT16 sPocket, POPUP*
|
||||
|
||||
POPUP * subPopup = NULL;
|
||||
|
||||
subPopup = popup->addSubMenuOption( new std::wstring(BobbyRFilter[17]/*Guns*/) );
|
||||
subPopup = popup->addSubMenuOption( std::wstring(BobbyRFilter[17]/*Guns*/) );
|
||||
popup->getSubPopupOption( popup->subPopupOptionCount-1 )->setPopupPosition( 10,
|
||||
10,
|
||||
POPUP_POSITION_RELATIVE );
|
||||
@@ -2193,33 +2193,33 @@ void addWeaponGroupsToPocketPopup( SOLDIERTYPE *pSoldier, INT16 sPocket, POPUP*
|
||||
UINT8 weaponTypeCtr;
|
||||
for( weaponTypeCtr = 1; weaponTypeCtr <= 8; weaponTypeCtr++ ){
|
||||
|
||||
weaponTypePopup = subPopup->addSubMenuOption( new std::wstring( WeaponType[weaponTypeCtr] ) );
|
||||
weaponTypePopup = subPopup->addSubMenuOption( std::wstring( WeaponType[weaponTypeCtr] ) );
|
||||
|
||||
for(std::map<UINT32,OBJECTTYPE*>::iterator itr = bestItems.begin(); itr != bestItems.end(); ++itr){
|
||||
|
||||
if ( Weapon[ itr->first ].ubWeaponType == weaponTypeCtr )
|
||||
weaponTypePopup->addOption(
|
||||
&std::wstring( Item[ itr->first ].szItemName ),
|
||||
std::wstring( Item[ itr->first ].szItemName ),
|
||||
new popupCallbackFunction3<void,OBJECTTYPE*,UINT16,SOLDIERTYPE*>(&popupCallbackPlaceLeastDamagedFromStack,itr->second,sPocket,pSoldier)
|
||||
);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
subPopup = popup->addSubMenuOption( new std::wstring( gszPocketPopupText[POCKET_POPUP_GRENADE_LAUNCHERS] ) );
|
||||
subPopup = popup->addSubMenuOption( std::wstring( gszPocketPopupText[POCKET_POPUP_GRENADE_LAUNCHERS] ) );
|
||||
popup->getSubPopupOption( popup->subPopupOptionCount-1 )->setPopupPosition( 10,
|
||||
10,
|
||||
POPUP_POSITION_RELATIVE );
|
||||
addItemsToPocketPopup( pSoldier, sPocket, subPopup, IC_LAUNCHER, -1, -1, 0 );
|
||||
|
||||
subPopup = popup->addSubMenuOption( new std::wstring( gszPocketPopupText[POCKET_POPUP_ROCKET_LAUNCHERS] ) );
|
||||
subPopup = popup->addSubMenuOption( std::wstring( gszPocketPopupText[POCKET_POPUP_ROCKET_LAUNCHERS] ) );
|
||||
popup->getSubPopupOption( popup->subPopupOptionCount-1 )->setPopupPosition( 10,
|
||||
10,
|
||||
POPUP_POSITION_RELATIVE );
|
||||
addItemsToPocketPopup( pSoldier, sPocket, subPopup, IC_GUN, -1, 0, 0);
|
||||
|
||||
|
||||
subPopup = popup->addSubMenuOption( new std::wstring( gszPocketPopupText[POCKET_POPUP_MEELE_AND_THROWN] ) );
|
||||
subPopup = popup->addSubMenuOption( std::wstring( gszPocketPopupText[POCKET_POPUP_MEELE_AND_THROWN] ) );
|
||||
popup->getSubPopupOption( popup->subPopupOptionCount-1 )->setPopupPosition( 10,
|
||||
10,
|
||||
POPUP_POSITION_RELATIVE );
|
||||
@@ -2286,7 +2286,7 @@ void addAmmoToPocketPopup( SOLDIERTYPE *pSoldier, INT16 sPocket, POPUP* popup )
|
||||
{
|
||||
UINT8 ammoFound = 0;
|
||||
|
||||
POPUP_OPTION * o = popup->addOption( &std::wstring( Item[ (*gun)->usItem ].szItemName ), NULL );
|
||||
POPUP_OPTION * o = popup->addOption( std::wstring( Item[ (*gun)->usItem ].szItemName ), NULL );
|
||||
o->color_shade = COLOR_LTGREY;
|
||||
//o->color_background = COLOR_LTGREY;
|
||||
|
||||
@@ -2335,7 +2335,7 @@ void addAmmoToPocketPopup( SOLDIERTYPE *pSoldier, INT16 sPocket, POPUP* popup )
|
||||
static CHAR16 pStr[ 100 ];
|
||||
swprintf( pStr, L"%s (%d)", Item[loop].szItemName,capacity );
|
||||
|
||||
popup->addOption( &std::wstring( pStr ), new popupCallbackFunction3<void,UINT16,UINT16,SOLDIERTYPE*>(&popupCallbackAmmo,loop,sPocket,pSoldier) );
|
||||
popup->addOption( std::wstring( pStr ), new popupCallbackFunction3<void,UINT16,UINT16,SOLDIERTYPE*>(&popupCallbackAmmo,loop,sPocket,pSoldier) );
|
||||
|
||||
} // found ammo crate, crate matches mag
|
||||
} // inv loop
|
||||
@@ -2344,7 +2344,7 @@ void addAmmoToPocketPopup( SOLDIERTYPE *pSoldier, INT16 sPocket, POPUP* popup )
|
||||
} // mag loop
|
||||
|
||||
if (!ammoFound){
|
||||
POPUP_OPTION * o = popup->addOption( &std::wstring( gszPocketPopupText[POCKET_POPUP_NO_AMMO] ), NULL );
|
||||
POPUP_OPTION * o = popup->addOption( std::wstring( gszPocketPopupText[POCKET_POPUP_NO_AMMO] ), NULL );
|
||||
o->color_shade = COLOR_RED;
|
||||
}
|
||||
|
||||
@@ -2354,7 +2354,7 @@ void addAmmoToPocketPopup( SOLDIERTYPE *pSoldier, INT16 sPocket, POPUP* popup )
|
||||
} // found guns
|
||||
else
|
||||
{
|
||||
POPUP_OPTION * o = popup->addOption( &std::wstring( gszPocketPopupText[POCKET_POPUP_NO_GUNS] ), NULL );
|
||||
POPUP_OPTION * o = popup->addOption( std::wstring( gszPocketPopupText[POCKET_POPUP_NO_GUNS] ), NULL );
|
||||
o->color_shade = COLOR_RED;
|
||||
}
|
||||
}
|
||||
@@ -2427,31 +2427,31 @@ void PocketPopupFull( SOLDIERTYPE *pSoldier, INT16 sPocket ){
|
||||
|
||||
POPUP * subPopup = NULL;
|
||||
|
||||
subPopup = popup->addSubMenuOption( new std::wstring( iEditorItemsToolbarText[0]/*Weapons*/ ) );
|
||||
subPopup = popup->addSubMenuOption( std::wstring( iEditorItemsToolbarText[0]/*Weapons*/ ) );
|
||||
popup->getSubPopupOption( popup->subPopupOptionCount-1 )->setPopupPosition( 10,10,POPUP_POSITION_RELATIVE );
|
||||
addWeaponGroupsToPocketPopup( pSoldier, sPocket, subPopup );
|
||||
|
||||
subPopup = popup->addSubMenuOption( new std::wstring( BobbyRText[BOBBYR_GUNS_AMMO]/*Ammo*/ ) );
|
||||
subPopup = popup->addSubMenuOption( std::wstring( BobbyRText[BOBBYR_GUNS_AMMO]/*Ammo*/ ) );
|
||||
popup->getSubPopupOption( popup->subPopupOptionCount-1 )->setPopupPosition( 10,10,POPUP_POSITION_RELATIVE );
|
||||
addAmmoToPocketPopup( pSoldier, sPocket, subPopup );
|
||||
|
||||
subPopup = popup->addSubMenuOption( new std::wstring( BobbyRText[BOBBYR_GUNS_ARMOR]/*Amour*/ ) );
|
||||
subPopup = popup->addSubMenuOption( std::wstring( BobbyRText[BOBBYR_GUNS_ARMOR]/*Amour*/ ) );
|
||||
popup->getSubPopupOption( popup->subPopupOptionCount-1 )->setPopupPosition( 10,10,POPUP_POSITION_RELATIVE );
|
||||
addArmorToPocketPopup( pSoldier, sPocket, subPopup );
|
||||
|
||||
subPopup = popup->addSubMenuOption( new std::wstring( BobbyRFilter[BOBBYR_FILTER_USED_LBEGEAR] /*"LBE"*/) );
|
||||
subPopup = popup->addSubMenuOption( std::wstring( BobbyRFilter[BOBBYR_FILTER_USED_LBEGEAR] /*"LBE"*/) );
|
||||
popup->getSubPopupOption( popup->subPopupOptionCount-1 )->setPopupPosition( 10,10,POPUP_POSITION_RELATIVE );
|
||||
addLBEToPocketPopup( pSoldier, sPocket, subPopup );
|
||||
|
||||
subPopup = popup->addSubMenuOption( new std::wstring( BobbyRFilter[BOBBYR_FILTER_MISC_GRENADE]/*Grenades*/ ) );
|
||||
subPopup = popup->addSubMenuOption( std::wstring( BobbyRFilter[BOBBYR_FILTER_MISC_GRENADE]/*Grenades*/ ) );
|
||||
popup->getSubPopupOption( popup->subPopupOptionCount-1 )->setPopupPosition( 10,10,POPUP_POSITION_RELATIVE );
|
||||
addGrenadesToPocketPopup( pSoldier, sPocket, subPopup );
|
||||
|
||||
subPopup = popup->addSubMenuOption( new std::wstring( BobbyRFilter[BOBBYR_FILTER_MISC_BOMB] ) );
|
||||
subPopup = popup->addSubMenuOption( std::wstring( BobbyRFilter[BOBBYR_FILTER_MISC_BOMB] ) );
|
||||
popup->getSubPopupOption( popup->subPopupOptionCount-1 )->setPopupPosition( 10,10,POPUP_POSITION_RELATIVE );
|
||||
addBombsToPocketPopup( pSoldier, sPocket, subPopup );
|
||||
|
||||
subPopup = popup->addSubMenuOption( new std::wstring( BobbyRFilter[BOBBYR_FILTER_MISC_FACE] ) );
|
||||
subPopup = popup->addSubMenuOption( std::wstring( BobbyRFilter[BOBBYR_FILTER_MISC_FACE] ) );
|
||||
popup->getSubPopupOption( popup->subPopupOptionCount-1 )->setPopupPosition( 10,10,POPUP_POSITION_RELATIVE );
|
||||
addFaceGearToPocketPopup( pSoldier, sPocket, subPopup );
|
||||
|
||||
@@ -2529,7 +2529,7 @@ void PocketPopupDefault( SOLDIERTYPE *pSoldier, INT16 sPocket ){
|
||||
// default for LBE slots - grenades + ammo for merc's guns
|
||||
addAmmoToPocketPopup( pSoldier, sPocket, popup );
|
||||
|
||||
POPUP * subPopup = popup->addSubMenuOption( new std::wstring( BobbyRFilter[28]/*Grenades*/ ) );
|
||||
POPUP * subPopup = popup->addSubMenuOption( std::wstring( BobbyRFilter[28]/*Grenades*/ ) );
|
||||
popup->getSubPopupOption( popup->subPopupOptionCount-1 )->setPopupPosition( 10,10,POPUP_POSITION_RELATIVE );
|
||||
addGrenadesToPocketPopup( pSoldier, sPocket, subPopup );
|
||||
} else {
|
||||
@@ -5912,7 +5912,7 @@ void UpdateAttachmentTooltips(OBJECTTYPE *pObject, UINT8 ubStatusIndex)
|
||||
|
||||
if (showAttachmentPopups)
|
||||
{ // add the current attachment to the popup assigned to this attachment slot
|
||||
POPUP_OPTION * o = new POPUP_OPTION( &std::wstring( Item[ usAttachment ].szItemName ),
|
||||
POPUP_OPTION * o = new POPUP_OPTION( std::wstring( Item[ usAttachment ].szItemName ),
|
||||
new popupCallbackFunction<void,UINT16>(&popupCallbackItem,usAttachment));
|
||||
|
||||
gPopupAttachmentInfos.push_back(new PopupAttachmentInfo(usAttachment, pObject, ubStatusIndex, slotCount, o, gItemDescAttachmentPopups[slotCount]));
|
||||
@@ -5921,7 +5921,7 @@ void UpdateAttachmentTooltips(OBJECTTYPE *pObject, UINT8 ubStatusIndex)
|
||||
o->setAvail(new popupCallbackFunction<bool, PopupAttachmentInfo*>(&popupCallbackItemInSector, (gPopupAttachmentInfos.back())));
|
||||
|
||||
if (loop == 11 && attachList.size() > 11){ // if there's too much stuff to list, we create a subpopup for the rest
|
||||
gItemDescAttachmentPopups[slotCount]->addSubMenuOption( &std::wstring(L"More...") );
|
||||
gItemDescAttachmentPopups[slotCount]->addSubMenuOption( std::wstring(L"More...") );
|
||||
POPUP_SUB_POPUP_OPTION * tmp = gItemDescAttachmentPopups[slotCount]->getSubPopupOption(0);
|
||||
|
||||
// positioning sub popups is handled through the option that holds them
|
||||
@@ -13410,7 +13410,7 @@ void ItemDescTransformRegionCallback( MOUSE_REGION *pRegion, INT32 reason )
|
||||
if ((*gpItemDescObject)[0]->data.gun.bGunAmmoStatus < 0)
|
||||
{
|
||||
// Add option
|
||||
POPUP_OPTION *pOption = new POPUP_OPTION(&std::wstring( L"Unjam" ), new popupCallbackFunction<void,void>( &TransformationMenuPopup_Unjam ));
|
||||
POPUP_OPTION *pOption = new POPUP_OPTION(std::wstring( L"Unjam" ), new popupCallbackFunction<void,void>( &TransformationMenuPopup_Unjam ));
|
||||
gItemDescTransformPopup->addOption( *pOption );
|
||||
fFoundTransformations = true;
|
||||
}
|
||||
@@ -13463,7 +13463,7 @@ void ItemDescTransformRegionCallback( MOUSE_REGION *pRegion, INT32 reason )
|
||||
CHAR16 MenuRowText[300];
|
||||
swprintf( MenuRowText, gzTransformationMessage[ 7 ], usMagSize );
|
||||
// Generate a new option for the menu
|
||||
POPUP_OPTION *pOption = new POPUP_OPTION(&std::wstring( MenuRowText ), new popupCallbackFunction<void,UINT16>( TransformationMenuPopup_SplitCrate, x ) );
|
||||
POPUP_OPTION *pOption = new POPUP_OPTION(std::wstring( MenuRowText ), new popupCallbackFunction<void,UINT16>( TransformationMenuPopup_SplitCrate, x ) );
|
||||
// Add the option to the menu.
|
||||
gItemDescTransformPopup->addOption( *pOption );
|
||||
// Set this flag so we know we have at least one Transformation available.
|
||||
@@ -13474,7 +13474,7 @@ void ItemDescTransformRegionCallback( MOUSE_REGION *pRegion, INT32 reason )
|
||||
}
|
||||
else
|
||||
{
|
||||
POPUP_OPTION *pOption = new POPUP_OPTION(&std::wstring( gzTransformationMessage[ 6 ] ), new popupCallbackFunction<void,void>( TransformationMenuPopup_SplitCrateInInventory ) );
|
||||
POPUP_OPTION *pOption = new POPUP_OPTION(std::wstring( gzTransformationMessage[ 6 ] ), new popupCallbackFunction<void,void>( TransformationMenuPopup_SplitCrateInInventory ) );
|
||||
gItemDescTransformPopup->addOption( *pOption );
|
||||
fFoundTransformations = true;
|
||||
}
|
||||
@@ -13527,7 +13527,7 @@ void ItemDescTransformRegionCallback( MOUSE_REGION *pRegion, INT32 reason )
|
||||
}
|
||||
|
||||
// Generate a new option for the menu
|
||||
POPUP_OPTION *pOption = new POPUP_OPTION(&std::wstring( MenuRowText ), new popupCallbackFunction<void, OBJECTTYPE*>( &TransformationMenuPopup_Arm, gpItemDescObject ) );
|
||||
POPUP_OPTION *pOption = new POPUP_OPTION(std::wstring( MenuRowText ), new popupCallbackFunction<void, OBJECTTYPE*>( &TransformationMenuPopup_Arm, gpItemDescObject ) );
|
||||
// Set the function that tests whether it's valid at the moment.
|
||||
pOption->setAvail(new popupCallbackFunction<bool,OBJECTTYPE*>( &TransformationMenuPopup_Arm_TestValid, gpItemDescObject ));
|
||||
// Add the option to the menu.
|
||||
@@ -13553,7 +13553,7 @@ void ItemDescTransformRegionCallback( MOUSE_REGION *pRegion, INT32 reason )
|
||||
}
|
||||
|
||||
// Generate a new option for the menu
|
||||
POPUP_OPTION *pOption = new POPUP_OPTION(&std::wstring( MenuRowText ), new popupCallbackFunction<void, OBJECTTYPE*>( &TransformationMenuPopup_Arm, gpItemDescObject ) );
|
||||
POPUP_OPTION *pOption = new POPUP_OPTION(std::wstring( MenuRowText ), new popupCallbackFunction<void, OBJECTTYPE*>( &TransformationMenuPopup_Arm, gpItemDescObject ) );
|
||||
// Set the function that tests whether it's valid at the moment.
|
||||
pOption->setAvail(new popupCallbackFunction<bool,OBJECTTYPE*>( &TransformationMenuPopup_Arm_TestValid, gpItemDescObject ));
|
||||
// Add the option to the menu.
|
||||
@@ -13591,7 +13591,7 @@ void ItemDescTransformRegionCallback( MOUSE_REGION *pRegion, INT32 reason )
|
||||
}
|
||||
|
||||
// Add option
|
||||
POPUP_OPTION *pOption = new POPUP_OPTION(&std::wstring( MenuRowText ), new popupCallbackFunction<void,void>( &TransformationMenuPopup_DelayedGrenadeExplosion ));
|
||||
POPUP_OPTION *pOption = new POPUP_OPTION(std::wstring( MenuRowText ), new popupCallbackFunction<void,void>( &TransformationMenuPopup_DelayedGrenadeExplosion ));
|
||||
pOption->setAvail(new popupCallbackFunction<bool,OBJECTTYPE*>( &TransformationMenuPopup_DelayedGrenadeExplosion_TestValid, gpItemDescObject ));
|
||||
gItemDescTransformPopup->addOption( *pOption );
|
||||
fFoundTransformations = true;
|
||||
@@ -13618,7 +13618,7 @@ void ItemDescTransformRegionCallback( MOUSE_REGION *pRegion, INT32 reason )
|
||||
}
|
||||
|
||||
// Generate a new option for the menu
|
||||
POPUP_OPTION *pOption = new POPUP_OPTION(&std::wstring( MenuRowText ), new popupCallbackFunction<void,TransformInfoStruct*>( &TransformationMenuPopup_Transform, &Transform[x] ) );
|
||||
POPUP_OPTION *pOption = new POPUP_OPTION(std::wstring( MenuRowText ), new popupCallbackFunction<void,TransformInfoStruct*>( &TransformationMenuPopup_Transform, &Transform[x] ) );
|
||||
// Set the function that tests whether it's valid at the moment.
|
||||
pOption->setAvail(new popupCallbackFunction<bool,TransformInfoStruct*>( &TransformationMenuPopup_TestValid, &Transform[x] ));
|
||||
// Add the option to the menu.
|
||||
@@ -13632,7 +13632,7 @@ void ItemDescTransformRegionCallback( MOUSE_REGION *pRegion, INT32 reason )
|
||||
|
||||
if (!fFoundTransformations)
|
||||
{
|
||||
POPUP_OPTION * pOption = new POPUP_OPTION( &std::wstring( gzTransformationMessage[ 0 ] ), new popupCallbackFunction<void,TransformInfoStruct*>( &TransformationMenuPopup_Transform, NULL ) );
|
||||
POPUP_OPTION * pOption = new POPUP_OPTION( std::wstring( gzTransformationMessage[ 0 ] ), new popupCallbackFunction<void,TransformInfoStruct*>( &TransformationMenuPopup_Transform, NULL ) );
|
||||
pOption->setAvail(new popupCallbackFunction<bool,TransformInfoStruct*>( &TransformationMenuPopup_TestValid, NULL ));
|
||||
gItemDescTransformPopup->addOption( *pOption );
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user