Chromium Code Reviews| Index: vm/flags.cc |
| =================================================================== |
| --- vm/flags.cc (revision 5257) |
| +++ vm/flags.cc (working copy) |
| @@ -24,12 +24,16 @@ |
| kBoolean, |
| kInteger, |
| kString, |
| + kFunc, |
| kNumFlagTypes |
| }; |
| Flag(const char* name, const char* comment, void* addr, FlagType type) |
| : name_(name), comment_(comment), addr_(addr), type_(type) { |
| } |
| + Flag(const char* name, const char* comment, FlagHandler handler) |
| + : name_(name), comment_(comment), handler_(handler), type_(kFunc) { |
| + } |
| void Print() { |
| if (IsUnrecognized()) { |
| @@ -54,6 +58,10 @@ |
| } |
| break; |
| } |
| + case kFunc: { |
| + // 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.
|
| + break; |
| + } |
| default: |
| UNREACHABLE(); |
| break; |
| @@ -72,6 +80,7 @@ |
| bool* bool_ptr_; |
| int* int_ptr_; |
| charp* charp_ptr_; |
| + FlagHandler handler_; |
| }; |
| FlagType type_; |
| }; |
| @@ -129,6 +138,17 @@ |
| } |
| +bool Flags::Register_func(FlagHandler handler, |
| + const char* name, |
| + const char* comment) { |
| + ASSERT(Lookup(name) == NULL); |
| + Flag* flag = new Flag(name, comment, handler); |
| + flag->next_ = Flags::flags_; |
| + Flags::flags_ = flag; |
| + return false; |
| +} |
| + |
| + |
| static void Normalize(char* s) { |
| intptr_t len = strlen(s); |
| for (intptr_t i = 0; i < len; i++) { |
| @@ -206,6 +226,16 @@ |
| } |
| break; |
| } |
| + case Flag::kFunc: { |
| + if (strcmp(argument, "true") == 0) { |
| + (flag->handler_)(true); |
| + } else if (strcmp(argument, "false") == 0) { |
| + (flag->handler_)(false); |
| + } else { |
| + OS::Print("Ignoring flag: %s is a bool flag.\n", name); |
| + } |
| + break; |
| + } |
| default: { |
| UNREACHABLE(); |
| break; |