From ad7f5805bf65baea4e8ecebbfe40fcb7778d84d8 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sat, 2 Sep 2023 22:02:47 +0200 Subject: [PATCH] Remove wxInitData::argvOrig which is not needed, finally We never really used the "original" version of the command line, i.e. before it was (possibly) modified by gtk_init_check(), so don't bother keeping it and just free the pointers corresponding to the arguments consumed by GTK in wxGTK code. There should be no real changes, this is just a simplification. --- include/wx/private/init.h | 6 ------ src/common/init.cpp | 39 ++++++++++++++++++--------------------- src/gtk/app.cpp | 1 + 3 files changed, 19 insertions(+), 27 deletions(-) diff --git a/include/wx/private/init.h b/include/wx/private/init.h index df915e7f5d..41121c2d02 100644 --- a/include/wx/private/init.h +++ b/include/wx/private/init.h @@ -33,12 +33,6 @@ struct WXDLLIMPEXP_BASE wxInitData int argc = 0; wchar_t** argv = nullptr; - // We also need to keep their original copies as they can be modified - // during initialization (e.g. GTK removes GTK-specific parameters from - // it), but we must free the originally allocated array at the end. - int argcOrig = 0; - wchar_t** argvOrig = nullptr; - #ifdef __WINDOWS__ // Initialize from the implicitly available Unicode command line. void MSWInitialize(); diff --git a/src/common/init.cpp b/src/common/init.cpp index c617781bf4..cdd8dd1239 100644 --- a/src/common/init.cpp +++ b/src/common/init.cpp @@ -158,7 +158,6 @@ void wxInitData::Initialize(int argcIn, char **argvIn) argvA = argvIn; #endif - argvOrig = new wchar_t *[argcIn + 1]; argv = new wchar_t *[argcIn + 1]; int wargc = 0; @@ -176,13 +175,13 @@ void wxInitData::Initialize(int argcIn, char **argvIn) } else // converted ok { - argvOrig[wargc] = argv[wargc] = wxStrdup(buf); + argv[wargc] = wxStrdup(buf); wargc++; } } - argcOrig = argc = wargc; - argvOrig[wargc] = argv[wargc] = nullptr; + argc = wargc; + argv[wargc] = nullptr; } #ifdef __WINDOWS__ @@ -202,35 +201,33 @@ void wxInitData::MSWInitialize() // argvMSW because it could be allocated by Initialize() if a custom entry // point is used. argv = argvMSW; - - // However in this case we don't need to set argvOrig because argv itself - // is never modified under Windows. } #endif // __WINDOWS__ void wxInitData::Free() { - if ( argvOrig ) - { - for ( int i = 0; i < argcOrig; i++ ) - { - free(argvOrig[i]); - // argv[i] normally points to the same data - } - - wxDELETEA(argvOrig); - wxDELETEA(argv); - argcOrig = argc = 0; - } - #ifdef __WINDOWS__ if ( argvMSW ) { ::LocalFree(argvMSW); - argvMSW = nullptr; + + // If argvMSW is non-null, argv must be the same value, so reset it too. + argv = argvMSW = nullptr; + argc = 0; } #endif // __WINDOWS__ + + if ( argc ) + { + for ( int i = 0; i < argc; i++ ) + { + free(argv[i]); + } + + wxDELETEA(argv); + argc = 0; + } } // ---------------------------------------------------------------------------- diff --git a/src/gtk/app.cpp b/src/gtk/app.cpp index 20fee9a92b..f72d777867 100644 --- a/src/gtk/app.cpp +++ b/src/gtk/app.cpp @@ -502,6 +502,7 @@ bool wxApp::Initialize(int& argc_, wxChar **argv_) { while ( strcmp(wxConvUTF8.cWX2MB(argv_[i]), argvA[i]) != 0 ) { + free(argv_[i]); memmove(argv_ + i, argv_ + i + 1, (argc_ - i)*sizeof(*argv_)); } }