Revision f230a1cf deps/v8/src/flags.cc

View differences:

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