Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #include "vm/flags.h" | 5 #include "vm/flags.h" |
| 6 | 6 |
| 7 #include "platform/assert.h" | 7 #include "platform/assert.h" |
| 8 #include "vm/os.h" | 8 #include "vm/os.h" |
| 9 | 9 |
| 10 namespace dart { | 10 namespace dart { |
| 11 | 11 |
| 12 DEFINE_FLAG(bool, print_flags, false, "Print flags as they are being parsed."); | 12 DEFINE_FLAG(bool, print_flags, false, "Print flags as they are being parsed."); |
| 13 DEFINE_FLAG(bool, ignore_unrecognized_flags, false, | 13 DEFINE_FLAG(bool, ignore_unrecognized_flags, false, |
| 14 "Ignore unrecognized flags."); | 14 "Ignore unrecognized flags."); |
| 15 | 15 |
| 16 // List of registered flags. | 16 // List of registered flags. |
| 17 Flag* Flags::flags_ = NULL; | 17 Flag* Flags::flags_ = NULL; |
| 18 | 18 |
| 19 bool Flags::initialized_ = false; | 19 bool Flags::initialized_ = false; |
| 20 | 20 |
| 21 class Flag { | 21 class Flag { |
| 22 public: | 22 public: |
| 23 enum FlagType { | 23 enum FlagType { |
| 24 kBoolean, | 24 kBoolean, |
| 25 kInteger, | 25 kInteger, |
| 26 kString, | 26 kString, |
| 27 kFunc, | |
| 27 kNumFlagTypes | 28 kNumFlagTypes |
| 28 }; | 29 }; |
| 29 | 30 |
| 30 Flag(const char* name, const char* comment, void* addr, FlagType type) | 31 Flag(const char* name, const char* comment, void* addr, FlagType type) |
| 31 : name_(name), comment_(comment), addr_(addr), type_(type) { | 32 : name_(name), comment_(comment), addr_(addr), type_(type) { |
| 32 } | 33 } |
| 34 Flag(const char* name, const char* comment, FlagHandler handler) | |
| 35 : name_(name), comment_(comment), handler_(handler), type_(kFunc) { | |
| 36 } | |
| 33 | 37 |
| 34 void Print() { | 38 void Print() { |
| 35 if (IsUnrecognized()) { | 39 if (IsUnrecognized()) { |
| 36 OS::Print("%s: unrecognized\n", name_); | 40 OS::Print("%s: unrecognized\n", name_); |
| 37 return; | 41 return; |
| 38 } | 42 } |
| 39 switch (type_) { | 43 switch (type_) { |
| 40 case kBoolean: { | 44 case kBoolean: { |
| 41 OS::Print("%s: %s (%s)\n", | 45 OS::Print("%s: %s (%s)\n", |
| 42 name_, *this->bool_ptr_ ? "true" : "false", comment_); | 46 name_, *this->bool_ptr_ ? "true" : "false", comment_); |
| 43 break; | 47 break; |
| 44 } | 48 } |
| 45 case kInteger: { | 49 case kInteger: { |
| 46 OS::Print("%s: %d (%s)\n", name_, *this->int_ptr_, comment_); | 50 OS::Print("%s: %d (%s)\n", name_, *this->int_ptr_, comment_); |
| 47 break; | 51 break; |
| 48 } | 52 } |
| 49 case kString: { | 53 case kString: { |
| 50 if (*this->charp_ptr_ != NULL) { | 54 if (*this->charp_ptr_ != NULL) { |
| 51 OS::Print("%s: '%s' (%s)\n", name_, *this->charp_ptr_, comment_); | 55 OS::Print("%s: '%s' (%s)\n", name_, *this->charp_ptr_, comment_); |
| 52 } else { | 56 } else { |
| 53 OS::Print("%s: (null) (%s)\n", name_, comment_); | 57 OS::Print("%s: (null) (%s)\n", name_, comment_); |
| 54 } | 58 } |
| 55 break; | 59 break; |
| 56 } | 60 } |
| 61 case kFunc: { | |
| 62 // No value to print here. | |
|
regis
2012/03/09 23:16:03
You could maybe print the name of the flag.
Ivan Posva
2012/03/09 23:20:37
Done.
| |
| 63 break; | |
| 64 } | |
| 57 default: | 65 default: |
| 58 UNREACHABLE(); | 66 UNREACHABLE(); |
| 59 break; | 67 break; |
| 60 } | 68 } |
| 61 } | 69 } |
| 62 | 70 |
| 63 bool IsUnrecognized() const { | 71 bool IsUnrecognized() const { |
| 64 return (type_ == kBoolean) && (bool_ptr_ == NULL); | 72 return (type_ == kBoolean) && (bool_ptr_ == NULL); |
| 65 } | 73 } |
| 66 | 74 |
| 67 Flag* next_; | 75 Flag* next_; |
| 68 const char* name_; | 76 const char* name_; |
| 69 const char* comment_; | 77 const char* comment_; |
| 70 union { | 78 union { |
| 71 void* addr_; | 79 void* addr_; |
| 72 bool* bool_ptr_; | 80 bool* bool_ptr_; |
| 73 int* int_ptr_; | 81 int* int_ptr_; |
| 74 charp* charp_ptr_; | 82 charp* charp_ptr_; |
| 83 FlagHandler handler_; | |
| 75 }; | 84 }; |
| 76 FlagType type_; | 85 FlagType type_; |
| 77 }; | 86 }; |
| 78 | 87 |
| 79 | 88 |
| 80 Flag* Flags::Lookup(const char* name) { | 89 Flag* Flags::Lookup(const char* name) { |
| 81 Flag* cur = Flags::flags_; | 90 Flag* cur = Flags::flags_; |
| 82 while (cur != NULL) { | 91 while (cur != NULL) { |
| 83 if (strcmp(cur->name_, name) == 0) { | 92 if (strcmp(cur->name_, name) == 0) { |
| 84 return cur; | 93 return cur; |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 122 const char* default_value, | 131 const char* default_value, |
| 123 const char* comment) { | 132 const char* comment) { |
| 124 ASSERT(Lookup(name) == NULL); | 133 ASSERT(Lookup(name) == NULL); |
| 125 Flag* flag = new Flag(name, comment, addr, Flag::kString); | 134 Flag* flag = new Flag(name, comment, addr, Flag::kString); |
| 126 flag->next_ = Flags::flags_; | 135 flag->next_ = Flags::flags_; |
| 127 Flags::flags_ = flag; | 136 Flags::flags_ = flag; |
| 128 return default_value; | 137 return default_value; |
| 129 } | 138 } |
| 130 | 139 |
| 131 | 140 |
| 141 bool Flags::Register_func(FlagHandler handler, | |
| 142 const char* name, | |
| 143 const char* comment) { | |
| 144 ASSERT(Lookup(name) == NULL); | |
| 145 Flag* flag = new Flag(name, comment, handler); | |
| 146 flag->next_ = Flags::flags_; | |
| 147 Flags::flags_ = flag; | |
| 148 return false; | |
| 149 } | |
| 150 | |
| 151 | |
| 132 static void Normalize(char* s) { | 152 static void Normalize(char* s) { |
| 133 intptr_t len = strlen(s); | 153 intptr_t len = strlen(s); |
| 134 for (intptr_t i = 0; i < len; i++) { | 154 for (intptr_t i = 0; i < len; i++) { |
| 135 if (s[i] == '-') { | 155 if (s[i] == '-') { |
| 136 s[i] = '_'; | 156 s[i] = '_'; |
| 137 } | 157 } |
| 138 } | 158 } |
| 139 } | 159 } |
| 140 | 160 |
| 141 | 161 |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 199 break; | 219 break; |
| 200 } | 220 } |
| 201 case Flag::kInteger: { | 221 case Flag::kInteger: { |
| 202 char* endptr = NULL; | 222 char* endptr = NULL; |
| 203 int val = strtol(argument, &endptr, 10); | 223 int val = strtol(argument, &endptr, 10); |
| 204 if (endptr != argument) { | 224 if (endptr != argument) { |
| 205 *flag->int_ptr_ = val; | 225 *flag->int_ptr_ = val; |
| 206 } | 226 } |
| 207 break; | 227 break; |
| 208 } | 228 } |
| 229 case Flag::kFunc: { | |
| 230 if (strcmp(argument, "true") == 0) { | |
| 231 (flag->handler_)(true); | |
| 232 } else if (strcmp(argument, "false") == 0) { | |
| 233 (flag->handler_)(false); | |
| 234 } else { | |
| 235 OS::Print("Ignoring flag: %s is a bool flag.\n", name); | |
| 236 } | |
| 237 break; | |
| 238 } | |
| 209 default: { | 239 default: { |
| 210 UNREACHABLE(); | 240 UNREACHABLE(); |
| 211 break; | 241 break; |
| 212 } | 242 } |
| 213 } | 243 } |
| 214 } | 244 } |
| 215 } | 245 } |
| 216 | 246 |
| 217 delete[] name; | 247 delete[] name; |
| 218 } | 248 } |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 271 while (flag != NULL) { | 301 while (flag != NULL) { |
| 272 flag->Print(); | 302 flag->Print(); |
| 273 flag = flag->next_; | 303 flag = flag->next_; |
| 274 } | 304 } |
| 275 } | 305 } |
| 276 | 306 |
| 277 return true; | 307 return true; |
| 278 } | 308 } |
| 279 | 309 |
| 280 } // namespace dart | 310 } // namespace dart |
| OLD | NEW |