Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(156)

Side by Side Diff: src/flags.cc

Issue 53089: Fixed test memory leaks (Closed)
Patch Set: Created 11 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2006-2008 the V8 project authors. All rights reserved. 1 // Copyright 2006-2008 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
51 // to the actual flag, default value, comment, etc. This is designed to be POD 51 // to the actual flag, default value, comment, etc. This is designed to be POD
52 // initialized as to avoid requiring static constructors. 52 // initialized as to avoid requiring static constructors.
53 struct Flag { 53 struct Flag {
54 enum FlagType { TYPE_BOOL, TYPE_INT, TYPE_FLOAT, TYPE_STRING, TYPE_ARGS }; 54 enum FlagType { TYPE_BOOL, TYPE_INT, TYPE_FLOAT, TYPE_STRING, TYPE_ARGS };
55 55
56 FlagType type_; // What type of flag, bool, int, or string. 56 FlagType type_; // What type of flag, bool, int, or string.
57 const char* name_; // Name of the flag, ex "my_flag". 57 const char* name_; // Name of the flag, ex "my_flag".
58 void* valptr_; // Pointer to the global flag variable. 58 void* valptr_; // Pointer to the global flag variable.
59 const void* defptr_; // Pointer to the default value. 59 const void* defptr_; // Pointer to the default value.
60 const char* cmt_; // A comment about the flags purpose. 60 const char* cmt_; // A comment about the flags purpose.
61 bool owns_ptr_;
Søren Thygesen Gjesse 2009/03/26 10:50:09 Comment (or is it obvious)?
Christian Plesner Hansen 2009/03/27 00:24:26 Done; it wasn't obvious.
61 62
62 FlagType type() const { return type_; } 63 FlagType type() const { return type_; }
63 64
64 const char* name() const { return name_; } 65 const char* name() const { return name_; }
65 66
66 const char* comment() const { return cmt_; } 67 const char* comment() const { return cmt_; }
67 68
68 bool* bool_variable() const { 69 bool* bool_variable() const {
69 ASSERT(type_ == TYPE_BOOL); 70 ASSERT(type_ == TYPE_BOOL);
70 return reinterpret_cast<bool*>(valptr_); 71 return reinterpret_cast<bool*>(valptr_);
71 } 72 }
72 73
73 int* int_variable() const { 74 int* int_variable() const {
74 ASSERT(type_ == TYPE_INT); 75 ASSERT(type_ == TYPE_INT);
75 return reinterpret_cast<int*>(valptr_); 76 return reinterpret_cast<int*>(valptr_);
76 } 77 }
77 78
78 double* float_variable() const { 79 double* float_variable() const {
79 ASSERT(type_ == TYPE_FLOAT); 80 ASSERT(type_ == TYPE_FLOAT);
80 return reinterpret_cast<double*>(valptr_); 81 return reinterpret_cast<double*>(valptr_);
81 } 82 }
82 83
83 const char** string_variable() const { 84 const char* string_value() const {
84 ASSERT(type_ == TYPE_STRING); 85 ASSERT(type_ == TYPE_STRING);
85 return reinterpret_cast<const char**>(valptr_); 86 return *reinterpret_cast<const char**>(valptr_);
87 }
88
89 void set_string_value(const char *value, bool owns_ptr) {
90 ASSERT(type_ == TYPE_STRING);
91 const char **ptr = reinterpret_cast<const char **>(valptr_);
92 if (owns_ptr_ && *ptr != NULL) DeleteArray(*ptr);
93 *ptr = value;
94 owns_ptr_ = owns_ptr;
86 } 95 }
87 96
88 JSArguments* args_variable() const { 97 JSArguments* args_variable() const {
89 ASSERT(type_ == TYPE_ARGS); 98 ASSERT(type_ == TYPE_ARGS);
90 return reinterpret_cast<JSArguments*>(valptr_); 99 return reinterpret_cast<JSArguments*>(valptr_);
91 } 100 }
92 101
93 bool bool_default() const { 102 bool bool_default() const {
94 ASSERT(type_ == TYPE_BOOL); 103 ASSERT(type_ == TYPE_BOOL);
95 return *reinterpret_cast<const bool*>(defptr_); 104 return *reinterpret_cast<const bool*>(defptr_);
(...skipping 22 matching lines...) Expand all
118 // Compare this flag's current value against the default. 127 // Compare this flag's current value against the default.
119 bool IsDefault() const { 128 bool IsDefault() const {
120 switch (type_) { 129 switch (type_) {
121 case TYPE_BOOL: 130 case TYPE_BOOL:
122 return *bool_variable() == bool_default(); 131 return *bool_variable() == bool_default();
123 case TYPE_INT: 132 case TYPE_INT:
124 return *int_variable() == int_default(); 133 return *int_variable() == int_default();
125 case TYPE_FLOAT: 134 case TYPE_FLOAT:
126 return *float_variable() == float_default(); 135 return *float_variable() == float_default();
127 case TYPE_STRING: { 136 case TYPE_STRING: {
128 const char* str1 = *string_variable(); 137 const char* str1 = string_value();
129 const char* str2 = string_default(); 138 const char* str2 = string_default();
130 if (str2 == NULL) return str1 == NULL; 139 if (str2 == NULL) return str1 == NULL;
131 if (str1 == NULL) return str2 == NULL; 140 if (str1 == NULL) return str2 == NULL;
132 return strcmp(str1, str2) == 0; 141 return strcmp(str1, str2) == 0;
133 } 142 }
134 case TYPE_ARGS: 143 case TYPE_ARGS:
135 return args_variable()->argc() == 0; 144 return args_variable()->argc() == 0;
136 } 145 }
137 UNREACHABLE(); 146 UNREACHABLE();
138 return true; 147 return true;
139 } 148 }
140 149
141 // Set a flag back to it's default value. 150 // Set a flag back to it's default value.
142 void Reset() { 151 void Reset() {
143 switch (type_) { 152 switch (type_) {
144 case TYPE_BOOL: 153 case TYPE_BOOL:
145 *bool_variable() = bool_default(); 154 *bool_variable() = bool_default();
146 break; 155 break;
147 case TYPE_INT: 156 case TYPE_INT:
148 *int_variable() = int_default(); 157 *int_variable() = int_default();
149 break; 158 break;
150 case TYPE_FLOAT: 159 case TYPE_FLOAT:
151 *float_variable() = float_default(); 160 *float_variable() = float_default();
152 break; 161 break;
153 case TYPE_STRING: 162 case TYPE_STRING:
154 *string_variable() = string_default(); 163 set_string_value(string_default(), false);
155 break; 164 break;
156 case TYPE_ARGS: 165 case TYPE_ARGS:
157 *args_variable() = args_default(); 166 *args_variable() = args_default();
158 break; 167 break;
159 } 168 }
160 } 169 }
161 }; 170 };
162 171
163 Flag flags[] = { 172 Flag flags[] = {
164 #define FLAG_MODE_META 173 #define FLAG_MODE_META
(...skipping 25 matching lines...) Expand all
190 case Flag::TYPE_BOOL: 199 case Flag::TYPE_BOOL:
191 buffer.Add("%s", (*flag->bool_variable() ? "true" : "false")); 200 buffer.Add("%s", (*flag->bool_variable() ? "true" : "false"));
192 break; 201 break;
193 case Flag::TYPE_INT: 202 case Flag::TYPE_INT:
194 buffer.Add("%d", *flag->int_variable()); 203 buffer.Add("%d", *flag->int_variable());
195 break; 204 break;
196 case Flag::TYPE_FLOAT: 205 case Flag::TYPE_FLOAT:
197 buffer.Add("%f", FmtElm(*flag->float_variable())); 206 buffer.Add("%f", FmtElm(*flag->float_variable()));
198 break; 207 break;
199 case Flag::TYPE_STRING: { 208 case Flag::TYPE_STRING: {
200 const char* str = *flag->string_variable(); 209 const char* str = flag->string_value();
201 buffer.Add("%s", str ? str : "NULL"); 210 buffer.Add("%s", str ? str : "NULL");
202 break; 211 break;
203 } 212 }
204 case Flag::TYPE_ARGS: { 213 case Flag::TYPE_ARGS: {
205 JSArguments args = *flag->args_variable(); 214 JSArguments args = *flag->args_variable();
206 if (args.argc() > 0) { 215 if (args.argc() > 0) {
207 buffer.Add("%s", args[0]); 216 buffer.Add("%s", args[0]);
208 for (int i = 1; i < args.argc(); i++) { 217 for (int i = 1; i < args.argc(); i++) {
209 buffer.Add(" %s", args[i]); 218 buffer.Add(" %s", args[i]);
210 } 219 }
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after
382 case Flag::TYPE_BOOL: 391 case Flag::TYPE_BOOL:
383 *flag->bool_variable() = !is_bool; 392 *flag->bool_variable() = !is_bool;
384 break; 393 break;
385 case Flag::TYPE_INT: 394 case Flag::TYPE_INT:
386 *flag->int_variable() = strtol(value, &endp, 10); // NOLINT 395 *flag->int_variable() = strtol(value, &endp, 10); // NOLINT
387 break; 396 break;
388 case Flag::TYPE_FLOAT: 397 case Flag::TYPE_FLOAT:
389 *flag->float_variable() = strtod(value, &endp); 398 *flag->float_variable() = strtod(value, &endp);
390 break; 399 break;
391 case Flag::TYPE_STRING: 400 case Flag::TYPE_STRING:
392 *flag->string_variable() = value; 401 flag->set_string_value(value ? StrDup(value) : NULL, true);
393 break; 402 break;
394 case Flag::TYPE_ARGS: { 403 case Flag::TYPE_ARGS: {
395 int start_pos = (value == NULL) ? i : i - 1; 404 int start_pos = (value == NULL) ? i : i - 1;
396 int js_argc = *argc - start_pos; 405 int js_argc = *argc - start_pos;
397 const char** js_argv = NewArray<const char*>(js_argc); 406 const char** js_argv = NewArray<const char*>(js_argc);
398 if (value != NULL) { 407 if (value != NULL) {
399 js_argv[0] = value; 408 js_argv[0] = StrDup(value);
400 } 409 }
401 for (int k = i; k < *argc; k++) { 410 for (int k = i; k < *argc; k++) {
402 js_argv[k - start_pos] = argv[k]; 411 js_argv[k - start_pos] = StrDup(argv[k]);
403 } 412 }
404 *flag->args_variable() = JSArguments(js_argc, js_argv); 413 *flag->args_variable() = JSArguments(js_argc, js_argv);
405 i = *argc; // Consume all arguments 414 i = *argc; // Consume all arguments
406 break; 415 break;
407 } 416 }
408 } 417 }
409 418
410 // handle errors 419 // handle errors
411 if ((flag->type() == Flag::TYPE_BOOL && value != NULL) || 420 if ((flag->type() == Flag::TYPE_BOOL && value != NULL) ||
412 (flag->type() != Flag::TYPE_BOOL && is_bool) || 421 (flag->type() != Flag::TYPE_BOOL && is_bool) ||
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
484 p = SkipBlackSpace(p); 493 p = SkipBlackSpace(p);
485 if (*p != '\0') *p++ = '\0'; // 0-terminate argument 494 if (*p != '\0') *p++ = '\0'; // 0-terminate argument
486 p = SkipWhiteSpace(p); 495 p = SkipWhiteSpace(p);
487 } 496 }
488 497
489 // set the flags 498 // set the flags
490 int result = SetFlagsFromCommandLine(&argc, argv, false); 499 int result = SetFlagsFromCommandLine(&argc, argv, false);
491 500
492 // cleanup 501 // cleanup
493 DeleteArray(argv); 502 DeleteArray(argv);
494 // don't delete copy0 since the substrings 503 DeleteArray(copy0);
495 // may be pointed to by FLAG variables!
496 // (this is a memory leak, but it's minor since this
497 // code is only used for debugging, or perhaps once
498 // during initialization).
499 504
500 return result; 505 return result;
501 } 506 }
502 507
503 508
504 // static 509 // static
505 void FlagList::ResetAllFlags() { 510 void FlagList::ResetAllFlags() {
506 for (size_t i = 0; i < num_flags; ++i) { 511 for (size_t i = 0; i < num_flags; ++i) {
507 flags[i].Reset(); 512 flags[i].Reset();
508 } 513 }
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
540 const char** JSArguments::argv() { return argv_; } 545 const char** JSArguments::argv() { return argv_; }
541 const char*& JSArguments::operator[](int idx) { return argv_[idx]; } 546 const char*& JSArguments::operator[](int idx) { return argv_[idx]; }
542 JSArguments& JSArguments::operator=(JSArguments args) { 547 JSArguments& JSArguments::operator=(JSArguments args) {
543 argc_ = args.argc_; 548 argc_ = args.argc_;
544 argv_ = args.argv_; 549 argv_ = args.argv_;
545 return *this; 550 return *this;
546 } 551 }
547 552
548 553
549 } } // namespace v8::internal 554 } } // namespace v8::internal
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698