Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2006-2008 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2008 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 51 // to the actual flag, default value, comment, etc. This is designed to be POD | 51 // to the actual flag, default value, comment, etc. This is designed to be POD |
| 52 // initialized as to avoid requiring static constructors. | 52 // initialized as to avoid requiring static constructors. |
| 53 struct Flag { | 53 struct Flag { |
| 54 enum FlagType { TYPE_BOOL, TYPE_INT, TYPE_FLOAT, TYPE_STRING, TYPE_ARGS }; | 54 enum FlagType { TYPE_BOOL, TYPE_INT, TYPE_FLOAT, TYPE_STRING, TYPE_ARGS }; |
| 55 | 55 |
| 56 FlagType type_; // What type of flag, bool, int, or string. | 56 FlagType type_; // What type of flag, bool, int, or string. |
| 57 const char* name_; // Name of the flag, ex "my_flag". | 57 const char* name_; // Name of the flag, ex "my_flag". |
| 58 void* valptr_; // Pointer to the global flag variable. | 58 void* valptr_; // Pointer to the global flag variable. |
| 59 const void* defptr_; // Pointer to the default value. | 59 const void* defptr_; // Pointer to the default value. |
| 60 const char* cmt_; // A comment about the flags purpose. | 60 const char* cmt_; // A comment about the flags purpose. |
| 61 bool owns_ptr_; | |
|
Søren Thygesen Gjesse
2009/03/26 10:50:09
Comment (or is it obvious)?
Christian Plesner Hansen
2009/03/27 00:24:26
Done; it wasn't obvious.
| |
| 61 | 62 |
| 62 FlagType type() const { return type_; } | 63 FlagType type() const { return type_; } |
| 63 | 64 |
| 64 const char* name() const { return name_; } | 65 const char* name() const { return name_; } |
| 65 | 66 |
| 66 const char* comment() const { return cmt_; } | 67 const char* comment() const { return cmt_; } |
| 67 | 68 |
| 68 bool* bool_variable() const { | 69 bool* bool_variable() const { |
| 69 ASSERT(type_ == TYPE_BOOL); | 70 ASSERT(type_ == TYPE_BOOL); |
| 70 return reinterpret_cast<bool*>(valptr_); | 71 return reinterpret_cast<bool*>(valptr_); |
| 71 } | 72 } |
| 72 | 73 |
| 73 int* int_variable() const { | 74 int* int_variable() const { |
| 74 ASSERT(type_ == TYPE_INT); | 75 ASSERT(type_ == TYPE_INT); |
| 75 return reinterpret_cast<int*>(valptr_); | 76 return reinterpret_cast<int*>(valptr_); |
| 76 } | 77 } |
| 77 | 78 |
| 78 double* float_variable() const { | 79 double* float_variable() const { |
| 79 ASSERT(type_ == TYPE_FLOAT); | 80 ASSERT(type_ == TYPE_FLOAT); |
| 80 return reinterpret_cast<double*>(valptr_); | 81 return reinterpret_cast<double*>(valptr_); |
| 81 } | 82 } |
| 82 | 83 |
| 83 const char** string_variable() const { | 84 const char* string_value() const { |
| 84 ASSERT(type_ == TYPE_STRING); | 85 ASSERT(type_ == TYPE_STRING); |
| 85 return reinterpret_cast<const char**>(valptr_); | 86 return *reinterpret_cast<const char**>(valptr_); |
| 87 } | |
| 88 | |
| 89 void set_string_value(const char *value, bool owns_ptr) { | |
| 90 ASSERT(type_ == TYPE_STRING); | |
| 91 const char **ptr = reinterpret_cast<const char **>(valptr_); | |
| 92 if (owns_ptr_ && *ptr != NULL) DeleteArray(*ptr); | |
| 93 *ptr = value; | |
| 94 owns_ptr_ = owns_ptr; | |
| 86 } | 95 } |
| 87 | 96 |
| 88 JSArguments* args_variable() const { | 97 JSArguments* args_variable() const { |
| 89 ASSERT(type_ == TYPE_ARGS); | 98 ASSERT(type_ == TYPE_ARGS); |
| 90 return reinterpret_cast<JSArguments*>(valptr_); | 99 return reinterpret_cast<JSArguments*>(valptr_); |
| 91 } | 100 } |
| 92 | 101 |
| 93 bool bool_default() const { | 102 bool bool_default() const { |
| 94 ASSERT(type_ == TYPE_BOOL); | 103 ASSERT(type_ == TYPE_BOOL); |
| 95 return *reinterpret_cast<const bool*>(defptr_); | 104 return *reinterpret_cast<const bool*>(defptr_); |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 118 // Compare this flag's current value against the default. | 127 // Compare this flag's current value against the default. |
| 119 bool IsDefault() const { | 128 bool IsDefault() const { |
| 120 switch (type_) { | 129 switch (type_) { |
| 121 case TYPE_BOOL: | 130 case TYPE_BOOL: |
| 122 return *bool_variable() == bool_default(); | 131 return *bool_variable() == bool_default(); |
| 123 case TYPE_INT: | 132 case TYPE_INT: |
| 124 return *int_variable() == int_default(); | 133 return *int_variable() == int_default(); |
| 125 case TYPE_FLOAT: | 134 case TYPE_FLOAT: |
| 126 return *float_variable() == float_default(); | 135 return *float_variable() == float_default(); |
| 127 case TYPE_STRING: { | 136 case TYPE_STRING: { |
| 128 const char* str1 = *string_variable(); | 137 const char* str1 = string_value(); |
| 129 const char* str2 = string_default(); | 138 const char* str2 = string_default(); |
| 130 if (str2 == NULL) return str1 == NULL; | 139 if (str2 == NULL) return str1 == NULL; |
| 131 if (str1 == NULL) return str2 == NULL; | 140 if (str1 == NULL) return str2 == NULL; |
| 132 return strcmp(str1, str2) == 0; | 141 return strcmp(str1, str2) == 0; |
| 133 } | 142 } |
| 134 case TYPE_ARGS: | 143 case TYPE_ARGS: |
| 135 return args_variable()->argc() == 0; | 144 return args_variable()->argc() == 0; |
| 136 } | 145 } |
| 137 UNREACHABLE(); | 146 UNREACHABLE(); |
| 138 return true; | 147 return true; |
| 139 } | 148 } |
| 140 | 149 |
| 141 // Set a flag back to it's default value. | 150 // Set a flag back to it's default value. |
| 142 void Reset() { | 151 void Reset() { |
| 143 switch (type_) { | 152 switch (type_) { |
| 144 case TYPE_BOOL: | 153 case TYPE_BOOL: |
| 145 *bool_variable() = bool_default(); | 154 *bool_variable() = bool_default(); |
| 146 break; | 155 break; |
| 147 case TYPE_INT: | 156 case TYPE_INT: |
| 148 *int_variable() = int_default(); | 157 *int_variable() = int_default(); |
| 149 break; | 158 break; |
| 150 case TYPE_FLOAT: | 159 case TYPE_FLOAT: |
| 151 *float_variable() = float_default(); | 160 *float_variable() = float_default(); |
| 152 break; | 161 break; |
| 153 case TYPE_STRING: | 162 case TYPE_STRING: |
| 154 *string_variable() = string_default(); | 163 set_string_value(string_default(), false); |
| 155 break; | 164 break; |
| 156 case TYPE_ARGS: | 165 case TYPE_ARGS: |
| 157 *args_variable() = args_default(); | 166 *args_variable() = args_default(); |
| 158 break; | 167 break; |
| 159 } | 168 } |
| 160 } | 169 } |
| 161 }; | 170 }; |
| 162 | 171 |
| 163 Flag flags[] = { | 172 Flag flags[] = { |
| 164 #define FLAG_MODE_META | 173 #define FLAG_MODE_META |
| (...skipping 25 matching lines...) Expand all Loading... | |
| 190 case Flag::TYPE_BOOL: | 199 case Flag::TYPE_BOOL: |
| 191 buffer.Add("%s", (*flag->bool_variable() ? "true" : "false")); | 200 buffer.Add("%s", (*flag->bool_variable() ? "true" : "false")); |
| 192 break; | 201 break; |
| 193 case Flag::TYPE_INT: | 202 case Flag::TYPE_INT: |
| 194 buffer.Add("%d", *flag->int_variable()); | 203 buffer.Add("%d", *flag->int_variable()); |
| 195 break; | 204 break; |
| 196 case Flag::TYPE_FLOAT: | 205 case Flag::TYPE_FLOAT: |
| 197 buffer.Add("%f", FmtElm(*flag->float_variable())); | 206 buffer.Add("%f", FmtElm(*flag->float_variable())); |
| 198 break; | 207 break; |
| 199 case Flag::TYPE_STRING: { | 208 case Flag::TYPE_STRING: { |
| 200 const char* str = *flag->string_variable(); | 209 const char* str = flag->string_value(); |
| 201 buffer.Add("%s", str ? str : "NULL"); | 210 buffer.Add("%s", str ? str : "NULL"); |
| 202 break; | 211 break; |
| 203 } | 212 } |
| 204 case Flag::TYPE_ARGS: { | 213 case Flag::TYPE_ARGS: { |
| 205 JSArguments args = *flag->args_variable(); | 214 JSArguments args = *flag->args_variable(); |
| 206 if (args.argc() > 0) { | 215 if (args.argc() > 0) { |
| 207 buffer.Add("%s", args[0]); | 216 buffer.Add("%s", args[0]); |
| 208 for (int i = 1; i < args.argc(); i++) { | 217 for (int i = 1; i < args.argc(); i++) { |
| 209 buffer.Add(" %s", args[i]); | 218 buffer.Add(" %s", args[i]); |
| 210 } | 219 } |
| (...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 382 case Flag::TYPE_BOOL: | 391 case Flag::TYPE_BOOL: |
| 383 *flag->bool_variable() = !is_bool; | 392 *flag->bool_variable() = !is_bool; |
| 384 break; | 393 break; |
| 385 case Flag::TYPE_INT: | 394 case Flag::TYPE_INT: |
| 386 *flag->int_variable() = strtol(value, &endp, 10); // NOLINT | 395 *flag->int_variable() = strtol(value, &endp, 10); // NOLINT |
| 387 break; | 396 break; |
| 388 case Flag::TYPE_FLOAT: | 397 case Flag::TYPE_FLOAT: |
| 389 *flag->float_variable() = strtod(value, &endp); | 398 *flag->float_variable() = strtod(value, &endp); |
| 390 break; | 399 break; |
| 391 case Flag::TYPE_STRING: | 400 case Flag::TYPE_STRING: |
| 392 *flag->string_variable() = value; | 401 flag->set_string_value(value ? StrDup(value) : NULL, true); |
| 393 break; | 402 break; |
| 394 case Flag::TYPE_ARGS: { | 403 case Flag::TYPE_ARGS: { |
| 395 int start_pos = (value == NULL) ? i : i - 1; | 404 int start_pos = (value == NULL) ? i : i - 1; |
| 396 int js_argc = *argc - start_pos; | 405 int js_argc = *argc - start_pos; |
| 397 const char** js_argv = NewArray<const char*>(js_argc); | 406 const char** js_argv = NewArray<const char*>(js_argc); |
| 398 if (value != NULL) { | 407 if (value != NULL) { |
| 399 js_argv[0] = value; | 408 js_argv[0] = StrDup(value); |
| 400 } | 409 } |
| 401 for (int k = i; k < *argc; k++) { | 410 for (int k = i; k < *argc; k++) { |
| 402 js_argv[k - start_pos] = argv[k]; | 411 js_argv[k - start_pos] = StrDup(argv[k]); |
| 403 } | 412 } |
| 404 *flag->args_variable() = JSArguments(js_argc, js_argv); | 413 *flag->args_variable() = JSArguments(js_argc, js_argv); |
| 405 i = *argc; // Consume all arguments | 414 i = *argc; // Consume all arguments |
| 406 break; | 415 break; |
| 407 } | 416 } |
| 408 } | 417 } |
| 409 | 418 |
| 410 // handle errors | 419 // handle errors |
| 411 if ((flag->type() == Flag::TYPE_BOOL && value != NULL) || | 420 if ((flag->type() == Flag::TYPE_BOOL && value != NULL) || |
| 412 (flag->type() != Flag::TYPE_BOOL && is_bool) || | 421 (flag->type() != Flag::TYPE_BOOL && is_bool) || |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 484 p = SkipBlackSpace(p); | 493 p = SkipBlackSpace(p); |
| 485 if (*p != '\0') *p++ = '\0'; // 0-terminate argument | 494 if (*p != '\0') *p++ = '\0'; // 0-terminate argument |
| 486 p = SkipWhiteSpace(p); | 495 p = SkipWhiteSpace(p); |
| 487 } | 496 } |
| 488 | 497 |
| 489 // set the flags | 498 // set the flags |
| 490 int result = SetFlagsFromCommandLine(&argc, argv, false); | 499 int result = SetFlagsFromCommandLine(&argc, argv, false); |
| 491 | 500 |
| 492 // cleanup | 501 // cleanup |
| 493 DeleteArray(argv); | 502 DeleteArray(argv); |
| 494 // don't delete copy0 since the substrings | 503 DeleteArray(copy0); |
| 495 // may be pointed to by FLAG variables! | |
| 496 // (this is a memory leak, but it's minor since this | |
| 497 // code is only used for debugging, or perhaps once | |
| 498 // during initialization). | |
| 499 | 504 |
| 500 return result; | 505 return result; |
| 501 } | 506 } |
| 502 | 507 |
| 503 | 508 |
| 504 // static | 509 // static |
| 505 void FlagList::ResetAllFlags() { | 510 void FlagList::ResetAllFlags() { |
| 506 for (size_t i = 0; i < num_flags; ++i) { | 511 for (size_t i = 0; i < num_flags; ++i) { |
| 507 flags[i].Reset(); | 512 flags[i].Reset(); |
| 508 } | 513 } |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 540 const char** JSArguments::argv() { return argv_; } | 545 const char** JSArguments::argv() { return argv_; } |
| 541 const char*& JSArguments::operator[](int idx) { return argv_[idx]; } | 546 const char*& JSArguments::operator[](int idx) { return argv_[idx]; } |
| 542 JSArguments& JSArguments::operator=(JSArguments args) { | 547 JSArguments& JSArguments::operator=(JSArguments args) { |
| 543 argc_ = args.argc_; | 548 argc_ = args.argc_; |
| 544 argv_ = args.argv_; | 549 argv_ = args.argv_; |
| 545 return *this; | 550 return *this; |
| 546 } | 551 } |
| 547 | 552 |
| 548 | 553 |
| 549 } } // namespace v8::internal | 554 } } // namespace v8::internal |
| OLD | NEW |