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 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <cctype> | 5 #include <cctype> |
6 #include <cstdlib> | 6 #include <cstdlib> |
7 #include <sstream> | 7 #include <sstream> |
8 | 8 |
9 #include "src/v8.h" | 9 #include "src/v8.h" |
10 | 10 |
(...skipping 12 matching lines...) Expand all Loading... |
23 // Define all of our flags default values. | 23 // Define all of our flags default values. |
24 #define FLAG_MODE_DEFINE_DEFAULTS | 24 #define FLAG_MODE_DEFINE_DEFAULTS |
25 #include "src/flag-definitions.h" // NOLINT | 25 #include "src/flag-definitions.h" // NOLINT |
26 | 26 |
27 namespace { | 27 namespace { |
28 | 28 |
29 // This structure represents a single entry in the flag system, with a pointer | 29 // This structure represents a single entry in the flag system, with a pointer |
30 // to the actual flag, default value, comment, etc. This is designed to be POD | 30 // to the actual flag, default value, comment, etc. This is designed to be POD |
31 // initialized as to avoid requiring static constructors. | 31 // initialized as to avoid requiring static constructors. |
32 struct Flag { | 32 struct Flag { |
33 enum FlagType { TYPE_BOOL, TYPE_MAYBE_BOOL, TYPE_INT, TYPE_INTPTR, | 33 enum FlagType { TYPE_BOOL, TYPE_MAYBE_BOOL, TYPE_INT, TYPE_FLOAT, |
34 TYPE_FLOAT, TYPE_STRING, TYPE_ARGS }; | 34 TYPE_STRING, TYPE_ARGS }; |
35 | 35 |
36 FlagType type_; // What type of flag, bool, int, or string. | 36 FlagType type_; // What type of flag, bool, int, or string. |
37 const char* name_; // Name of the flag, ex "my_flag". | 37 const char* name_; // Name of the flag, ex "my_flag". |
38 void* valptr_; // Pointer to the global flag variable. | 38 void* valptr_; // Pointer to the global flag variable. |
39 const void* defptr_; // Pointer to the default value. | 39 const void* defptr_; // Pointer to the default value. |
40 const char* cmt_; // A comment about the flags purpose. | 40 const char* cmt_; // A comment about the flags purpose. |
41 bool owns_ptr_; // Does the flag own its string value? | 41 bool owns_ptr_; // Does the flag own its string value? |
42 | 42 |
43 FlagType type() const { return type_; } | 43 FlagType type() const { return type_; } |
44 | 44 |
45 const char* name() const { return name_; } | 45 const char* name() const { return name_; } |
46 | 46 |
47 const char* comment() const { return cmt_; } | 47 const char* comment() const { return cmt_; } |
48 | 48 |
49 bool* bool_variable() const { | 49 bool* bool_variable() const { |
50 DCHECK(type_ == TYPE_BOOL); | 50 DCHECK(type_ == TYPE_BOOL); |
51 return reinterpret_cast<bool*>(valptr_); | 51 return reinterpret_cast<bool*>(valptr_); |
52 } | 52 } |
53 | 53 |
54 MaybeBoolFlag* maybe_bool_variable() const { | 54 MaybeBoolFlag* maybe_bool_variable() const { |
55 DCHECK(type_ == TYPE_MAYBE_BOOL); | 55 DCHECK(type_ == TYPE_MAYBE_BOOL); |
56 return reinterpret_cast<MaybeBoolFlag*>(valptr_); | 56 return reinterpret_cast<MaybeBoolFlag*>(valptr_); |
57 } | 57 } |
58 | 58 |
59 int* int_variable() const { | 59 int* int_variable() const { |
60 DCHECK(type_ == TYPE_INT); | 60 DCHECK(type_ == TYPE_INT); |
61 return reinterpret_cast<int*>(valptr_); | 61 return reinterpret_cast<int*>(valptr_); |
62 } | 62 } |
63 | 63 |
64 intptr_t* intptr_variable() const { | |
65 DCHECK(type_ == TYPE_INTPTR); | |
66 return reinterpret_cast<intptr_t*>(valptr_); | |
67 } | |
68 | |
69 double* float_variable() const { | 64 double* float_variable() const { |
70 DCHECK(type_ == TYPE_FLOAT); | 65 DCHECK(type_ == TYPE_FLOAT); |
71 return reinterpret_cast<double*>(valptr_); | 66 return reinterpret_cast<double*>(valptr_); |
72 } | 67 } |
73 | 68 |
74 const char* string_value() const { | 69 const char* string_value() const { |
75 DCHECK(type_ == TYPE_STRING); | 70 DCHECK(type_ == TYPE_STRING); |
76 return *reinterpret_cast<const char**>(valptr_); | 71 return *reinterpret_cast<const char**>(valptr_); |
77 } | 72 } |
78 | 73 |
(...skipping 13 matching lines...) Expand all Loading... |
92 bool bool_default() const { | 87 bool bool_default() const { |
93 DCHECK(type_ == TYPE_BOOL); | 88 DCHECK(type_ == TYPE_BOOL); |
94 return *reinterpret_cast<const bool*>(defptr_); | 89 return *reinterpret_cast<const bool*>(defptr_); |
95 } | 90 } |
96 | 91 |
97 int int_default() const { | 92 int int_default() const { |
98 DCHECK(type_ == TYPE_INT); | 93 DCHECK(type_ == TYPE_INT); |
99 return *reinterpret_cast<const int*>(defptr_); | 94 return *reinterpret_cast<const int*>(defptr_); |
100 } | 95 } |
101 | 96 |
102 int intptr_default() const { | |
103 DCHECK(type_ == TYPE_INTPTR); | |
104 return *reinterpret_cast<const intptr_t*>(defptr_); | |
105 } | |
106 | |
107 double float_default() const { | 97 double float_default() const { |
108 DCHECK(type_ == TYPE_FLOAT); | 98 DCHECK(type_ == TYPE_FLOAT); |
109 return *reinterpret_cast<const double*>(defptr_); | 99 return *reinterpret_cast<const double*>(defptr_); |
110 } | 100 } |
111 | 101 |
112 const char* string_default() const { | 102 const char* string_default() const { |
113 DCHECK(type_ == TYPE_STRING); | 103 DCHECK(type_ == TYPE_STRING); |
114 return *reinterpret_cast<const char* const *>(defptr_); | 104 return *reinterpret_cast<const char* const *>(defptr_); |
115 } | 105 } |
116 | 106 |
117 JSArguments args_default() const { | 107 JSArguments args_default() const { |
118 DCHECK(type_ == TYPE_ARGS); | 108 DCHECK(type_ == TYPE_ARGS); |
119 return *reinterpret_cast<const JSArguments*>(defptr_); | 109 return *reinterpret_cast<const JSArguments*>(defptr_); |
120 } | 110 } |
121 | 111 |
122 // Compare this flag's current value against the default. | 112 // Compare this flag's current value against the default. |
123 bool IsDefault() const { | 113 bool IsDefault() const { |
124 switch (type_) { | 114 switch (type_) { |
125 case TYPE_BOOL: | 115 case TYPE_BOOL: |
126 return *bool_variable() == bool_default(); | 116 return *bool_variable() == bool_default(); |
127 case TYPE_MAYBE_BOOL: | 117 case TYPE_MAYBE_BOOL: |
128 return maybe_bool_variable()->has_value == false; | 118 return maybe_bool_variable()->has_value == false; |
129 case TYPE_INT: | 119 case TYPE_INT: |
130 return *int_variable() == int_default(); | 120 return *int_variable() == int_default(); |
131 case TYPE_INTPTR: | |
132 return *intptr_variable() == intptr_default(); | |
133 case TYPE_FLOAT: | 121 case TYPE_FLOAT: |
134 return *float_variable() == float_default(); | 122 return *float_variable() == float_default(); |
135 case TYPE_STRING: { | 123 case TYPE_STRING: { |
136 const char* str1 = string_value(); | 124 const char* str1 = string_value(); |
137 const char* str2 = string_default(); | 125 const char* str2 = string_default(); |
138 if (str2 == NULL) return str1 == NULL; | 126 if (str2 == NULL) return str1 == NULL; |
139 if (str1 == NULL) return str2 == NULL; | 127 if (str1 == NULL) return str2 == NULL; |
140 return strcmp(str1, str2) == 0; | 128 return strcmp(str1, str2) == 0; |
141 } | 129 } |
142 case TYPE_ARGS: | 130 case TYPE_ARGS: |
143 return args_variable()->argc == 0; | 131 return args_variable()->argc == 0; |
144 } | 132 } |
145 UNREACHABLE(); | 133 UNREACHABLE(); |
146 return true; | 134 return true; |
147 } | 135 } |
148 | 136 |
149 // Set a flag back to it's default value. | 137 // Set a flag back to it's default value. |
150 void Reset() { | 138 void Reset() { |
151 switch (type_) { | 139 switch (type_) { |
152 case TYPE_BOOL: | 140 case TYPE_BOOL: |
153 *bool_variable() = bool_default(); | 141 *bool_variable() = bool_default(); |
154 break; | 142 break; |
155 case TYPE_MAYBE_BOOL: | 143 case TYPE_MAYBE_BOOL: |
156 *maybe_bool_variable() = MaybeBoolFlag::Create(false, false); | 144 *maybe_bool_variable() = MaybeBoolFlag::Create(false, false); |
157 break; | 145 break; |
158 case TYPE_INT: | 146 case TYPE_INT: |
159 *int_variable() = int_default(); | 147 *int_variable() = int_default(); |
160 break; | 148 break; |
161 case TYPE_INTPTR: | |
162 *intptr_variable() = intptr_default(); | |
163 break; | |
164 case TYPE_FLOAT: | 149 case TYPE_FLOAT: |
165 *float_variable() = float_default(); | 150 *float_variable() = float_default(); |
166 break; | 151 break; |
167 case TYPE_STRING: | 152 case TYPE_STRING: |
168 set_string_value(string_default(), false); | 153 set_string_value(string_default(), false); |
169 break; | 154 break; |
170 case TYPE_ARGS: | 155 case TYPE_ARGS: |
171 *args_variable() = args_default(); | 156 *args_variable() = args_default(); |
172 break; | 157 break; |
173 } | 158 } |
174 } | 159 } |
175 }; | 160 }; |
176 | 161 |
177 Flag flags[] = { | 162 Flag flags[] = { |
178 #define FLAG_MODE_META | 163 #define FLAG_MODE_META |
179 #include "src/flag-definitions.h" | 164 #include "src/flag-definitions.h" |
180 }; | 165 }; |
181 | 166 |
182 const size_t num_flags = sizeof(flags) / sizeof(*flags); | 167 const size_t num_flags = sizeof(flags) / sizeof(*flags); |
183 | 168 |
184 } // namespace | 169 } // namespace |
185 | 170 |
186 | 171 |
187 static const char* Type2String(Flag::FlagType type) { | 172 static const char* Type2String(Flag::FlagType type) { |
188 switch (type) { | 173 switch (type) { |
189 case Flag::TYPE_BOOL: return "bool"; | 174 case Flag::TYPE_BOOL: return "bool"; |
190 case Flag::TYPE_MAYBE_BOOL: return "maybe_bool"; | 175 case Flag::TYPE_MAYBE_BOOL: return "maybe_bool"; |
191 case Flag::TYPE_INT: return "int"; | 176 case Flag::TYPE_INT: return "int"; |
192 case Flag::TYPE_INTPTR: return "intptr_t"; | |
193 case Flag::TYPE_FLOAT: return "float"; | 177 case Flag::TYPE_FLOAT: return "float"; |
194 case Flag::TYPE_STRING: return "string"; | 178 case Flag::TYPE_STRING: return "string"; |
195 case Flag::TYPE_ARGS: return "arguments"; | 179 case Flag::TYPE_ARGS: return "arguments"; |
196 } | 180 } |
197 UNREACHABLE(); | 181 UNREACHABLE(); |
198 return NULL; | 182 return NULL; |
199 } | 183 } |
200 | 184 |
201 | 185 |
202 std::ostream& operator<<(std::ostream& os, const Flag& flag) { // NOLINT | 186 std::ostream& operator<<(std::ostream& os, const Flag& flag) { // NOLINT |
203 switch (flag.type()) { | 187 switch (flag.type()) { |
204 case Flag::TYPE_BOOL: | 188 case Flag::TYPE_BOOL: |
205 os << (*flag.bool_variable() ? "true" : "false"); | 189 os << (*flag.bool_variable() ? "true" : "false"); |
206 break; | 190 break; |
207 case Flag::TYPE_MAYBE_BOOL: | 191 case Flag::TYPE_MAYBE_BOOL: |
208 os << (flag.maybe_bool_variable()->has_value | 192 os << (flag.maybe_bool_variable()->has_value |
209 ? (flag.maybe_bool_variable()->value ? "true" : "false") | 193 ? (flag.maybe_bool_variable()->value ? "true" : "false") |
210 : "unset"); | 194 : "unset"); |
211 break; | 195 break; |
212 case Flag::TYPE_INT: | 196 case Flag::TYPE_INT: |
213 os << *flag.int_variable(); | 197 os << *flag.int_variable(); |
214 break; | 198 break; |
215 case Flag::TYPE_INTPTR: | |
216 os << *flag.intptr_variable(); | |
217 break; | |
218 case Flag::TYPE_FLOAT: | 199 case Flag::TYPE_FLOAT: |
219 os << *flag.float_variable(); | 200 os << *flag.float_variable(); |
220 break; | 201 break; |
221 case Flag::TYPE_STRING: { | 202 case Flag::TYPE_STRING: { |
222 const char* str = flag.string_value(); | 203 const char* str = flag.string_value(); |
223 os << (str ? str : "NULL"); | 204 os << (str ? str : "NULL"); |
224 break; | 205 break; |
225 } | 206 } |
226 case Flag::TYPE_ARGS: { | 207 case Flag::TYPE_ARGS: { |
227 JSArguments args = *flag.args_variable(); | 208 JSArguments args = *flag.args_variable(); |
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
408 switch (flag->type()) { | 389 switch (flag->type()) { |
409 case Flag::TYPE_BOOL: | 390 case Flag::TYPE_BOOL: |
410 *flag->bool_variable() = !is_bool; | 391 *flag->bool_variable() = !is_bool; |
411 break; | 392 break; |
412 case Flag::TYPE_MAYBE_BOOL: | 393 case Flag::TYPE_MAYBE_BOOL: |
413 *flag->maybe_bool_variable() = MaybeBoolFlag::Create(true, !is_bool); | 394 *flag->maybe_bool_variable() = MaybeBoolFlag::Create(true, !is_bool); |
414 break; | 395 break; |
415 case Flag::TYPE_INT: | 396 case Flag::TYPE_INT: |
416 *flag->int_variable() = strtol(value, &endp, 10); // NOLINT | 397 *flag->int_variable() = strtol(value, &endp, 10); // NOLINT |
417 break; | 398 break; |
418 case Flag::TYPE_INTPTR: | |
419 // TODO(bnoordhuis) Use strtoll()? C++11 library feature | |
420 // that may not be available everywhere yet. | |
421 *flag->intptr_variable() = strtol(value, &endp, 10); // NOLINT | |
422 break; | |
423 case Flag::TYPE_FLOAT: | 399 case Flag::TYPE_FLOAT: |
424 *flag->float_variable() = strtod(value, &endp); | 400 *flag->float_variable() = strtod(value, &endp); |
425 break; | 401 break; |
426 case Flag::TYPE_STRING: | 402 case Flag::TYPE_STRING: |
427 flag->set_string_value(value ? StrDup(value) : NULL, true); | 403 flag->set_string_value(value ? StrDup(value) : NULL, true); |
428 break; | 404 break; |
429 case Flag::TYPE_ARGS: { | 405 case Flag::TYPE_ARGS: { |
430 int start_pos = (value == NULL) ? i : i - 1; | 406 int start_pos = (value == NULL) ? i : i - 1; |
431 int js_argc = *argc - start_pos; | 407 int js_argc = *argc - start_pos; |
432 const char** js_argv = NewArray<const char*>(js_argc); | 408 const char** js_argv = NewArray<const char*>(js_argc); |
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
581 Flag* current = &flags[i]; | 557 Flag* current = &flags[i]; |
582 if (!current->IsDefault()) { | 558 if (!current->IsDefault()) { |
583 modified_args_as_string << *current; | 559 modified_args_as_string << *current; |
584 } | 560 } |
585 } | 561 } |
586 std::string args(modified_args_as_string.str()); | 562 std::string args(modified_args_as_string.str()); |
587 return static_cast<uint32_t>( | 563 return static_cast<uint32_t>( |
588 base::hash_range(args.c_str(), args.c_str() + args.length())); | 564 base::hash_range(args.c_str(), args.c_str() + args.length())); |
589 } | 565 } |
590 } } // namespace v8::internal | 566 } } // namespace v8::internal |
OLD | NEW |