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/json_stream.h" | 8 #include "vm/json_stream.h" |
9 #include "vm/os.h" | 9 #include "vm/os.h" |
10 | 10 |
11 namespace dart { | 11 namespace dart { |
12 | 12 |
13 DEFINE_FLAG(bool, print_flags, false, "Print flags as they are being parsed."); | 13 DEFINE_FLAG(bool, print_flags, false, "Print flags as they are being parsed."); |
14 DEFINE_FLAG(bool, ignore_unrecognized_flags, false, | 14 DEFINE_FLAG(bool, ignore_unrecognized_flags, false, |
15 "Ignore unrecognized flags."); | 15 "Ignore unrecognized flags."); |
16 | 16 |
17 bool Flags::initialized_ = false; | 17 bool Flags::initialized_ = false; |
18 | 18 |
19 // List of registered flags. | 19 // List of registered flags. |
20 Flag** Flags::flags_ = NULL; | 20 Flag** Flags::flags_ = NULL; |
21 intptr_t Flags::capacity_ = 0; | 21 intptr_t Flags::capacity_ = 0; |
22 intptr_t Flags::num_flags_ = 0; | 22 intptr_t Flags::num_flags_ = 0; |
23 | 23 |
24 class Flag { | 24 class Flag { |
25 public: | 25 public: |
26 enum FlagType { | 26 enum FlagType { |
27 kBoolean, | 27 kBoolean, |
28 kInteger, | 28 kInteger, |
| 29 kUint64, |
29 kString, | 30 kString, |
30 kFunc, | 31 kFunc, |
31 kNumFlagTypes | 32 kNumFlagTypes |
32 }; | 33 }; |
33 | 34 |
34 Flag(const char* name, const char* comment, void* addr, FlagType type) | 35 Flag(const char* name, const char* comment, void* addr, FlagType type) |
35 : name_(name), comment_(comment), addr_(addr), type_(type) { | 36 : name_(name), comment_(comment), addr_(addr), type_(type) { |
36 } | 37 } |
37 Flag(const char* name, const char* comment, FlagHandler handler) | 38 Flag(const char* name, const char* comment, FlagHandler handler) |
38 : name_(name), comment_(comment), handler_(handler), type_(kFunc) { | 39 : name_(name), comment_(comment), handler_(handler), type_(kFunc) { |
39 } | 40 } |
40 | 41 |
41 void Print() { | 42 void Print() { |
42 if (IsUnrecognized()) { | 43 if (IsUnrecognized()) { |
43 OS::Print("%s: unrecognized\n", name_); | 44 OS::Print("%s: unrecognized\n", name_); |
44 return; | 45 return; |
45 } | 46 } |
46 switch (type_) { | 47 switch (type_) { |
47 case kBoolean: { | 48 case kBoolean: { |
48 OS::Print("%s: %s (%s)\n", | 49 OS::Print("%s: %s (%s)\n", |
49 name_, *this->bool_ptr_ ? "true" : "false", comment_); | 50 name_, *this->bool_ptr_ ? "true" : "false", comment_); |
50 break; | 51 break; |
51 } | 52 } |
52 case kInteger: { | 53 case kInteger: { |
53 OS::Print("%s: %d (%s)\n", name_, *this->int_ptr_, comment_); | 54 OS::Print("%s: %d (%s)\n", name_, *this->int_ptr_, comment_); |
54 break; | 55 break; |
55 } | 56 } |
| 57 case kUint64: { |
| 58 OS::Print("%s: %"Pu64" (%s)\n", name_, *this->uint64_ptr_, comment_); |
| 59 break; |
| 60 } |
56 case kString: { | 61 case kString: { |
57 if (*this->charp_ptr_ != NULL) { | 62 if (*this->charp_ptr_ != NULL) { |
58 OS::Print("%s: '%s' (%s)\n", name_, *this->charp_ptr_, comment_); | 63 OS::Print("%s: '%s' (%s)\n", name_, *this->charp_ptr_, comment_); |
59 } else { | 64 } else { |
60 OS::Print("%s: (null) (%s)\n", name_, comment_); | 65 OS::Print("%s: (null) (%s)\n", name_, comment_); |
61 } | 66 } |
62 break; | 67 break; |
63 } | 68 } |
64 case kFunc: { | 69 case kFunc: { |
65 OS::Print("%s: (%s)\n", name_, comment_); | 70 OS::Print("%s: (%s)\n", name_, comment_); |
66 break; | 71 break; |
67 } | 72 } |
68 default: | 73 default: |
69 UNREACHABLE(); | 74 UNREACHABLE(); |
70 break; | 75 break; |
71 } | 76 } |
72 } | 77 } |
73 | 78 |
74 bool IsUnrecognized() const { | 79 bool IsUnrecognized() const { |
75 return (type_ == kBoolean) && (bool_ptr_ == NULL); | 80 return (type_ == kBoolean) && (bool_ptr_ == NULL); |
76 } | 81 } |
77 | 82 |
78 const char* name_; | 83 const char* name_; |
79 const char* comment_; | 84 const char* comment_; |
80 union { | 85 union { |
81 void* addr_; | 86 void* addr_; |
82 bool* bool_ptr_; | 87 bool* bool_ptr_; |
83 int* int_ptr_; | 88 int* int_ptr_; |
| 89 uint64_t* uint64_ptr_; |
84 charp* charp_ptr_; | 90 charp* charp_ptr_; |
85 FlagHandler handler_; | 91 FlagHandler handler_; |
86 }; | 92 }; |
87 FlagType type_; | 93 FlagType type_; |
88 bool changed_; | 94 bool changed_; |
89 }; | 95 }; |
90 | 96 |
91 | 97 |
92 Flag* Flags::Lookup(const char* name) { | 98 Flag* Flags::Lookup(const char* name) { |
93 for (intptr_t i = 0; i < num_flags_; i++) { | 99 for (intptr_t i = 0; i < num_flags_; i++) { |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
151 const char* comment) { | 157 const char* comment) { |
152 ASSERT(Lookup(name) == NULL); | 158 ASSERT(Lookup(name) == NULL); |
153 | 159 |
154 Flag* flag = new Flag(name, comment, addr, Flag::kInteger); | 160 Flag* flag = new Flag(name, comment, addr, Flag::kInteger); |
155 AddFlag(flag); | 161 AddFlag(flag); |
156 | 162 |
157 return default_value; | 163 return default_value; |
158 } | 164 } |
159 | 165 |
160 | 166 |
| 167 uint64_t Flags::Register_uint64_t(uint64_t* addr, |
| 168 const char* name, |
| 169 uint64_t default_value, |
| 170 const char* comment) { |
| 171 ASSERT(Lookup(name) == NULL); |
| 172 |
| 173 Flag* flag = new Flag(name, comment, addr, Flag::kUint64); |
| 174 AddFlag(flag); |
| 175 |
| 176 return default_value; |
| 177 } |
| 178 |
| 179 |
161 const char* Flags::Register_charp(charp* addr, | 180 const char* Flags::Register_charp(charp* addr, |
162 const char* name, | 181 const char* name, |
163 const char* default_value, | 182 const char* default_value, |
164 const char* comment) { | 183 const char* comment) { |
165 ASSERT(Lookup(name) == NULL); | 184 ASSERT(Lookup(name) == NULL); |
166 Flag* flag = new Flag(name, comment, addr, Flag::kString); | 185 Flag* flag = new Flag(name, comment, addr, Flag::kString); |
167 AddFlag(flag); | 186 AddFlag(flag); |
168 return default_value; | 187 return default_value; |
169 } | 188 } |
170 | 189 |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
214 base = 16; | 233 base = 16; |
215 } | 234 } |
216 int val = strtol(argument, &endptr, base); | 235 int val = strtol(argument, &endptr, base); |
217 if (endptr == argument + len) { | 236 if (endptr == argument + len) { |
218 *flag->int_ptr_ = val; | 237 *flag->int_ptr_ = val; |
219 } else { | 238 } else { |
220 return false; | 239 return false; |
221 } | 240 } |
222 break; | 241 break; |
223 } | 242 } |
| 243 case Flag::kUint64: { |
| 244 char* endptr = NULL; |
| 245 const intptr_t len = strlen(argument); |
| 246 int base = 10; |
| 247 if ((len > 2) && (argument[0] == '0') && (argument[1] == 'x')) { |
| 248 base = 16; |
| 249 } |
| 250 int64_t val = strtoll(argument, &endptr, base); |
| 251 if (endptr == argument + len) { |
| 252 *flag->uint64_ptr_ = static_cast<uint64_t>(val); |
| 253 } else { |
| 254 return false; |
| 255 } |
| 256 break; |
| 257 } |
224 case Flag::kFunc: { | 258 case Flag::kFunc: { |
225 if (strcmp(argument, "true") == 0) { | 259 if (strcmp(argument, "true") == 0) { |
226 (flag->handler_)(true); | 260 (flag->handler_)(true); |
227 } else if (strcmp(argument, "false") == 0) { | 261 } else if (strcmp(argument, "false") == 0) { |
228 (flag->handler_)(false); | 262 (flag->handler_)(false); |
229 } else { | 263 } else { |
230 return false; | 264 return false; |
231 } | 265 } |
232 break; | 266 break; |
233 } | 267 } |
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
398 jsflag.AddProperty("flagType", "bool"); | 432 jsflag.AddProperty("flagType", "bool"); |
399 jsflag.AddProperty("valueAsString", | 433 jsflag.AddProperty("valueAsString", |
400 (*flag->bool_ptr_ ? "true" : "false")); | 434 (*flag->bool_ptr_ ? "true" : "false")); |
401 break; | 435 break; |
402 } | 436 } |
403 case Flag::kInteger: { | 437 case Flag::kInteger: { |
404 jsflag.AddProperty("flagType", "int"); | 438 jsflag.AddProperty("flagType", "int"); |
405 jsflag.AddPropertyF("valueAsString", "%d", *flag->int_ptr_); | 439 jsflag.AddPropertyF("valueAsString", "%d", *flag->int_ptr_); |
406 break; | 440 break; |
407 } | 441 } |
| 442 case Flag::kUint64: { |
| 443 jsflag.AddProperty("flagType", "uint64_t"); |
| 444 jsflag.AddPropertyF("valueAsString", "%"Pu64, *flag->uint64_ptr_); |
| 445 break; |
| 446 } |
408 case Flag::kString: { | 447 case Flag::kString: { |
409 jsflag.AddProperty("flagType", "string"); | 448 jsflag.AddProperty("flagType", "string"); |
410 if (flag->charp_ptr_ != NULL) { | 449 if (flag->charp_ptr_ != NULL) { |
411 jsflag.AddPropertyF("valueAsString", "%s", *flag->charp_ptr_); | 450 jsflag.AddPropertyF("valueAsString", "%s", *flag->charp_ptr_); |
412 } else { | 451 } else { |
413 // valueAsString missing means NULL. | 452 // valueAsString missing means NULL. |
414 } | 453 } |
415 break; | 454 break; |
416 } | 455 } |
417 default: | 456 default: |
(...skipping 22 matching lines...) Expand all Loading... |
440 for (intptr_t i = 0; i < num_flags_; ++i) { | 479 for (intptr_t i = 0; i < num_flags_; ++i) { |
441 Flag* flag = flags_[i]; | 480 Flag* flag = flags_[i]; |
442 if (flag->changed_) { | 481 if (flag->changed_) { |
443 PrintFlagToJSONArray(&jsarr, flag); | 482 PrintFlagToJSONArray(&jsarr, flag); |
444 } | 483 } |
445 } | 484 } |
446 } | 485 } |
447 } | 486 } |
448 | 487 |
449 } // namespace dart | 488 } // namespace dart |
OLD | NEW |