@@ -155,32 +155,83 @@ string16 QuoteForCommandLineToArgvW(const string16& arg,
155155
156156CommandLine::CommandLine (NoProgram no_program)
157157 : argv_(1 ),
158- begin_args_ (1 ) {
158+ begin_args_ (1 ),
159+ argc0_(0 ), argv0_(NULL ) {
159160}
160161
161162CommandLine::CommandLine (const FilePath& program)
162163 : argv_(1 ),
163- begin_args_(1 ) {
164+ begin_args_(1 ),
165+ argc0_(0 ), argv0_(NULL ) {
164166 SetProgram (program);
165167}
166168
167169CommandLine::CommandLine (int argc, const CommandLine::CharType* const * argv)
168170 : argv_(1 ),
169- begin_args_(1 ) {
171+ begin_args_(1 ),
172+ argc0_(0 ), argv0_(NULL ) {
170173 InitFromArgv (argc, argv);
171174}
172175
173176CommandLine::CommandLine (const StringVector& argv)
174177 : argv_(1 ),
175- begin_args_(1 ) {
178+ begin_args_(1 ),
179+ argc0_(0 ), argv0_(NULL ) {
176180 InitFromArgv (argv);
177181}
178182
179- CommandLine::CommandLine (const CommandLine& other) = default;
183+ CommandLine::CommandLine (const CommandLine& other)
184+ : argv_(other.argv_),
185+ original_argv_(other.original_argv_),
186+ switches_(other.switches_),
187+ begin_args_(other.begin_args_),
188+ argc0_(other.argc0_), argv0_(nullptr ) {
180189
181- CommandLine& CommandLine::operator =(const CommandLine& other) = default ;
190+ #if defined(OS_WIN)
191+ if (other.argv0_ ) {
192+ argv0_ = new char *[argc0_ + 1 ];
193+ for (int i = 0 ; i < argc0_; ++i) {
194+ argv0_[i] = new char [strlen (other.argv0_ [i]) + 1 ];
195+ strcpy (argv0_[i], other.argv0_ [i]);
196+ }
197+ argv0_[argc0_] = NULL ;
198+ }
199+ #else
200+ argv0_ = other.argv0_ ;
201+ #endif
202+ }
203+
204+ CommandLine& CommandLine::operator =(const CommandLine& other) {
205+ argv_ = other.argv_ ;
206+ original_argv_ = other.original_argv_ ;
207+ switches_ = other.switches_ ;
208+ begin_args_ = other.begin_args_ ;
209+ #if defined(OS_WIN)
210+ if (other.argv0_ ) {
211+ argc0_ = other.argc0_ ;
212+ argv0_ = new char *[argc0_ + 1 ];
213+ for (int i = 0 ; i < argc0_; ++i) {
214+ argv0_[i] = new char [strlen (other.argv0_ [i]) + 1 ];
215+ strcpy (argv0_[i], other.argv0_ [i]);
216+ }
217+ argv0_[argc0_] = NULL ;
218+ }
219+ #else
220+ argv0_ = other.argv0_ ;
221+ #endif
222+ return *this ;
223+ }
182224
183- CommandLine::~CommandLine () = default ;
225+ CommandLine::~CommandLine () {
226+ #if defined(OS_WIN)
227+ if (!argv0_)
228+ return ;
229+ for (int i = 0 ; i < argc0_; i++) {
230+ delete[] argv0_[i];
231+ }
232+ delete[] argv0_;
233+ #endif
234+ }
184235
185236#if defined(OS_WIN)
186237// static
@@ -253,12 +304,34 @@ CommandLine CommandLine::FromString(const string16& command_line) {
253304void CommandLine::InitFromArgv (int argc,
254305 const CommandLine::CharType* const * argv) {
255306 StringVector new_argv;
307+ argc0_ = argc;
308+ #if !defined(OS_WIN)
309+ argv0_ = (char **)argv;
310+ #else
311+ argv0_ = new char *[argc + 1 ];
312+ for (int i = 0 ; i < argc; ++i) {
313+ std::string str (base::WideToUTF8 (argv[i]));
314+ argv0_[i] = new char [str.length () + 1 ];
315+ strcpy (argv0_[i], str.c_str ());
316+ }
317+ argv0_[argc] = NULL ;
318+ #endif
256319 for (int i = 0 ; i < argc; ++i)
257320 new_argv.push_back (argv[i]);
258321 InitFromArgv (new_argv);
259322}
260323
261324void CommandLine::InitFromArgv (const StringVector& argv) {
325+ #if !defined(OS_MACOSX)
326+ original_argv_ = argv;
327+ #else
328+ for (size_t index = 0 ; index < argv.size (); ++index) {
329+ if (argv[index].compare (0 , strlen (" --psn_" ), " --psn_" ) != 0 &&
330+ argv[index].compare (0 , strlen (" -psn_" ), " -psn_" ) != 0 ) {
331+ original_argv_.push_back (argv[index]);
332+ }
333+ }
334+ #endif
262335 argv_ = StringVector (1 );
263336 switches_.clear ();
264337 begin_args_ = 1 ;
@@ -397,6 +470,12 @@ void CommandLine::AppendArgNative(const CommandLine::StringType& value) {
397470 argv_.push_back (value);
398471}
399472
473+ #if defined(OS_MACOSX)
474+ void CommandLine::FixOrigArgv4Finder (const CommandLine::StringType& value) {
475+ original_argv_.push_back (value);
476+ }
477+ #endif
478+
400479void CommandLine::AppendArguments (const CommandLine& other,
401480 bool include_program) {
402481 if (include_program)
0 commit comments