Revision f230a1cf deps/v8/src/flags.cc
deps/v8/src/flags.cc | ||
---|---|---|
55 | 55 |
// to the actual flag, default value, comment, etc. This is designed to be POD |
56 | 56 |
// initialized as to avoid requiring static constructors. |
57 | 57 |
struct Flag { |
58 |
enum FlagType { TYPE_BOOL, TYPE_INT, TYPE_FLOAT, TYPE_STRING, TYPE_ARGS }; |
|
58 |
enum FlagType { TYPE_BOOL, TYPE_MAYBE_BOOL, TYPE_INT, TYPE_FLOAT, |
|
59 |
TYPE_STRING, TYPE_ARGS }; |
|
59 | 60 |
|
60 | 61 |
FlagType type_; // What type of flag, bool, int, or string. |
61 | 62 |
const char* name_; // Name of the flag, ex "my_flag". |
... | ... | |
75 | 76 |
return reinterpret_cast<bool*>(valptr_); |
76 | 77 |
} |
77 | 78 |
|
79 |
MaybeBoolFlag* maybe_bool_variable() const { |
|
80 |
ASSERT(type_ == TYPE_MAYBE_BOOL); |
|
81 |
return reinterpret_cast<MaybeBoolFlag*>(valptr_); |
|
82 |
} |
|
83 |
|
|
78 | 84 |
int* int_variable() const { |
79 | 85 |
ASSERT(type_ == TYPE_INT); |
80 | 86 |
return reinterpret_cast<int*>(valptr_); |
... | ... | |
133 | 139 |
switch (type_) { |
134 | 140 |
case TYPE_BOOL: |
135 | 141 |
return *bool_variable() == bool_default(); |
142 |
case TYPE_MAYBE_BOOL: |
|
143 |
return maybe_bool_variable()->has_value == false; |
|
136 | 144 |
case TYPE_INT: |
137 | 145 |
return *int_variable() == int_default(); |
138 | 146 |
case TYPE_FLOAT: |
... | ... | |
145 | 153 |
return strcmp(str1, str2) == 0; |
146 | 154 |
} |
147 | 155 |
case TYPE_ARGS: |
148 |
return args_variable()->argc() == 0;
|
|
156 |
return args_variable()->argc == 0; |
|
149 | 157 |
} |
150 | 158 |
UNREACHABLE(); |
151 | 159 |
return true; |
... | ... | |
157 | 165 |
case TYPE_BOOL: |
158 | 166 |
*bool_variable() = bool_default(); |
159 | 167 |
break; |
168 |
case TYPE_MAYBE_BOOL: |
|
169 |
*maybe_bool_variable() = MaybeBoolFlag::Create(false, false); |
|
170 |
break; |
|
160 | 171 |
case TYPE_INT: |
161 | 172 |
*int_variable() = int_default(); |
162 | 173 |
break; |
... | ... | |
186 | 197 |
static const char* Type2String(Flag::FlagType type) { |
187 | 198 |
switch (type) { |
188 | 199 |
case Flag::TYPE_BOOL: return "bool"; |
200 |
case Flag::TYPE_MAYBE_BOOL: return "maybe_bool"; |
|
189 | 201 |
case Flag::TYPE_INT: return "int"; |
190 | 202 |
case Flag::TYPE_FLOAT: return "float"; |
191 | 203 |
case Flag::TYPE_STRING: return "string"; |
... | ... | |
203 | 215 |
case Flag::TYPE_BOOL: |
204 | 216 |
buffer.Add("%s", (*flag->bool_variable() ? "true" : "false")); |
205 | 217 |
break; |
218 |
case Flag::TYPE_MAYBE_BOOL: |
|
219 |
buffer.Add("%s", flag->maybe_bool_variable()->has_value |
|
220 |
? (flag->maybe_bool_variable()->value ? "true" : "false") |
|
221 |
: "unset"); |
|
222 |
break; |
|
206 | 223 |
case Flag::TYPE_INT: |
207 | 224 |
buffer.Add("%d", *flag->int_variable()); |
208 | 225 |
break; |
... | ... | |
216 | 233 |
} |
217 | 234 |
case Flag::TYPE_ARGS: { |
218 | 235 |
JSArguments args = *flag->args_variable(); |
219 |
if (args.argc() > 0) {
|
|
236 |
if (args.argc > 0) { |
|
220 | 237 |
buffer.Add("%s", args[0]); |
221 |
for (int i = 1; i < args.argc(); i++) {
|
|
238 |
for (int i = 1; i < args.argc; i++) { |
|
222 | 239 |
buffer.Add(" %s", args[i]); |
223 | 240 |
} |
224 | 241 |
} |
... | ... | |
260 | 277 |
buffer.Add("--%s", args_flag->name()); |
261 | 278 |
args->Add(buffer.ToCString().Detach()); |
262 | 279 |
JSArguments jsargs = *args_flag->args_variable(); |
263 |
for (int j = 0; j < jsargs.argc(); j++) {
|
|
280 |
for (int j = 0; j < jsargs.argc; j++) { |
|
264 | 281 |
args->Add(StrDup(jsargs[j])); |
265 | 282 |
} |
266 | 283 |
} |
... | ... | |
380 | 397 |
|
381 | 398 |
// if we still need a flag value, use the next argument if available |
382 | 399 |
if (flag->type() != Flag::TYPE_BOOL && |
400 |
flag->type() != Flag::TYPE_MAYBE_BOOL && |
|
383 | 401 |
flag->type() != Flag::TYPE_ARGS && |
384 | 402 |
value == NULL) { |
385 | 403 |
if (i < *argc) { |
... | ... | |
399 | 417 |
case Flag::TYPE_BOOL: |
400 | 418 |
*flag->bool_variable() = !is_bool; |
401 | 419 |
break; |
420 |
case Flag::TYPE_MAYBE_BOOL: |
|
421 |
*flag->maybe_bool_variable() = MaybeBoolFlag::Create(true, !is_bool); |
|
422 |
break; |
|
402 | 423 |
case Flag::TYPE_INT: |
403 | 424 |
*flag->int_variable() = strtol(value, &endp, 10); // NOLINT |
404 | 425 |
break; |
... | ... | |
425 | 446 |
} |
426 | 447 |
|
427 | 448 |
// handle errors |
428 |
if ((flag->type() == Flag::TYPE_BOOL && value != NULL) || |
|
429 |
(flag->type() != Flag::TYPE_BOOL && is_bool) || |
|
449 |
bool is_bool_type = flag->type() == Flag::TYPE_BOOL || |
|
450 |
flag->type() == Flag::TYPE_MAYBE_BOOL; |
|
451 |
if ((is_bool_type && value != NULL) || (!is_bool_type && is_bool) || |
|
430 | 452 |
*endp != '\0') { |
431 | 453 |
PrintF(stderr, "Error: illegal value for flag %s of type %s\n" |
432 | 454 |
"Try --help for options\n", |
... | ... | |
549 | 571 |
} |
550 | 572 |
|
551 | 573 |
|
574 |
// static |
|
552 | 575 |
void FlagList::EnforceFlagImplications() { |
553 | 576 |
#define FLAG_MODE_DEFINE_IMPLICATIONS |
554 | 577 |
#include "flag-definitions.h" |
Also available in: Unified diff