blob: 98f21ef2c4c9e9ba4c7cf1adcec58593ef234709 [file] [log] [blame]
Steve Blocka7e24c12009-10-30 11:49:00 +00001// Copyright 2006-2008 the V8 project authors. All rights reserved.
Ben Murdochb8a8cc12014-11-26 15:28:44 +00002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
Steve Blocka7e24c12009-10-30 11:49:00 +00004
5#include <ctype.h>
6#include <stdlib.h>
7
Ben Murdochb8a8cc12014-11-26 15:28:44 +00008#include "src/v8.h"
Steve Blocka7e24c12009-10-30 11:49:00 +00009
Ben Murdochb8a8cc12014-11-26 15:28:44 +000010#include "src/assembler.h"
11#include "src/base/platform/platform.h"
12#include "src/ostreams.h"
Steve Blocka7e24c12009-10-30 11:49:00 +000013
14namespace v8 {
15namespace internal {
16
17// Define all of our flags.
18#define FLAG_MODE_DEFINE
Ben Murdochb8a8cc12014-11-26 15:28:44 +000019#include "src/flag-definitions.h" // NOLINT
Steve Blocka7e24c12009-10-30 11:49:00 +000020
21// Define all of our flags default values.
22#define FLAG_MODE_DEFINE_DEFAULTS
Ben Murdochb8a8cc12014-11-26 15:28:44 +000023#include "src/flag-definitions.h" // NOLINT
Steve Blocka7e24c12009-10-30 11:49:00 +000024
25namespace {
26
27// This structure represents a single entry in the flag system, with a pointer
28// to the actual flag, default value, comment, etc. This is designed to be POD
29// initialized as to avoid requiring static constructors.
30struct Flag {
Ben Murdochb8a8cc12014-11-26 15:28:44 +000031 enum FlagType { TYPE_BOOL, TYPE_MAYBE_BOOL, TYPE_INT, TYPE_FLOAT,
32 TYPE_STRING, TYPE_ARGS };
Steve Blocka7e24c12009-10-30 11:49:00 +000033
34 FlagType type_; // What type of flag, bool, int, or string.
35 const char* name_; // Name of the flag, ex "my_flag".
36 void* valptr_; // Pointer to the global flag variable.
37 const void* defptr_; // Pointer to the default value.
38 const char* cmt_; // A comment about the flags purpose.
39 bool owns_ptr_; // Does the flag own its string value?
40
41 FlagType type() const { return type_; }
42
43 const char* name() const { return name_; }
44
45 const char* comment() const { return cmt_; }
46
47 bool* bool_variable() const {
Ben Murdochb8a8cc12014-11-26 15:28:44 +000048 DCHECK(type_ == TYPE_BOOL);
Steve Blocka7e24c12009-10-30 11:49:00 +000049 return reinterpret_cast<bool*>(valptr_);
50 }
51
Ben Murdochb8a8cc12014-11-26 15:28:44 +000052 MaybeBoolFlag* maybe_bool_variable() const {
53 DCHECK(type_ == TYPE_MAYBE_BOOL);
54 return reinterpret_cast<MaybeBoolFlag*>(valptr_);
55 }
56
Steve Blocka7e24c12009-10-30 11:49:00 +000057 int* int_variable() const {
Ben Murdochb8a8cc12014-11-26 15:28:44 +000058 DCHECK(type_ == TYPE_INT);
Steve Blocka7e24c12009-10-30 11:49:00 +000059 return reinterpret_cast<int*>(valptr_);
60 }
61
62 double* float_variable() const {
Ben Murdochb8a8cc12014-11-26 15:28:44 +000063 DCHECK(type_ == TYPE_FLOAT);
Steve Blocka7e24c12009-10-30 11:49:00 +000064 return reinterpret_cast<double*>(valptr_);
65 }
66
67 const char* string_value() const {
Ben Murdochb8a8cc12014-11-26 15:28:44 +000068 DCHECK(type_ == TYPE_STRING);
Steve Blocka7e24c12009-10-30 11:49:00 +000069 return *reinterpret_cast<const char**>(valptr_);
70 }
71
72 void set_string_value(const char* value, bool owns_ptr) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +000073 DCHECK(type_ == TYPE_STRING);
Steve Blocka7e24c12009-10-30 11:49:00 +000074 const char** ptr = reinterpret_cast<const char**>(valptr_);
75 if (owns_ptr_ && *ptr != NULL) DeleteArray(*ptr);
76 *ptr = value;
77 owns_ptr_ = owns_ptr;
78 }
79
80 JSArguments* args_variable() const {
Ben Murdochb8a8cc12014-11-26 15:28:44 +000081 DCHECK(type_ == TYPE_ARGS);
Steve Blocka7e24c12009-10-30 11:49:00 +000082 return reinterpret_cast<JSArguments*>(valptr_);
83 }
84
85 bool bool_default() const {
Ben Murdochb8a8cc12014-11-26 15:28:44 +000086 DCHECK(type_ == TYPE_BOOL);
Steve Blocka7e24c12009-10-30 11:49:00 +000087 return *reinterpret_cast<const bool*>(defptr_);
88 }
89
90 int int_default() const {
Ben Murdochb8a8cc12014-11-26 15:28:44 +000091 DCHECK(type_ == TYPE_INT);
Steve Blocka7e24c12009-10-30 11:49:00 +000092 return *reinterpret_cast<const int*>(defptr_);
93 }
94
95 double float_default() const {
Ben Murdochb8a8cc12014-11-26 15:28:44 +000096 DCHECK(type_ == TYPE_FLOAT);
Steve Blocka7e24c12009-10-30 11:49:00 +000097 return *reinterpret_cast<const double*>(defptr_);
98 }
99
100 const char* string_default() const {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000101 DCHECK(type_ == TYPE_STRING);
Steve Blocka7e24c12009-10-30 11:49:00 +0000102 return *reinterpret_cast<const char* const *>(defptr_);
103 }
104
105 JSArguments args_default() const {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000106 DCHECK(type_ == TYPE_ARGS);
Steve Blocka7e24c12009-10-30 11:49:00 +0000107 return *reinterpret_cast<const JSArguments*>(defptr_);
108 }
109
110 // Compare this flag's current value against the default.
111 bool IsDefault() const {
112 switch (type_) {
113 case TYPE_BOOL:
114 return *bool_variable() == bool_default();
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000115 case TYPE_MAYBE_BOOL:
116 return maybe_bool_variable()->has_value == false;
Steve Blocka7e24c12009-10-30 11:49:00 +0000117 case TYPE_INT:
118 return *int_variable() == int_default();
119 case TYPE_FLOAT:
120 return *float_variable() == float_default();
121 case TYPE_STRING: {
122 const char* str1 = string_value();
123 const char* str2 = string_default();
124 if (str2 == NULL) return str1 == NULL;
125 if (str1 == NULL) return str2 == NULL;
126 return strcmp(str1, str2) == 0;
127 }
128 case TYPE_ARGS:
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000129 return args_variable()->argc == 0;
Steve Blocka7e24c12009-10-30 11:49:00 +0000130 }
131 UNREACHABLE();
132 return true;
133 }
134
135 // Set a flag back to it's default value.
136 void Reset() {
137 switch (type_) {
138 case TYPE_BOOL:
139 *bool_variable() = bool_default();
140 break;
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000141 case TYPE_MAYBE_BOOL:
142 *maybe_bool_variable() = MaybeBoolFlag::Create(false, false);
143 break;
Steve Blocka7e24c12009-10-30 11:49:00 +0000144 case TYPE_INT:
145 *int_variable() = int_default();
146 break;
147 case TYPE_FLOAT:
148 *float_variable() = float_default();
149 break;
150 case TYPE_STRING:
151 set_string_value(string_default(), false);
152 break;
153 case TYPE_ARGS:
154 *args_variable() = args_default();
155 break;
156 }
157 }
158};
159
160Flag flags[] = {
161#define FLAG_MODE_META
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000162#include "src/flag-definitions.h"
Steve Blocka7e24c12009-10-30 11:49:00 +0000163};
164
165const size_t num_flags = sizeof(flags) / sizeof(*flags);
166
167} // namespace
168
169
170static const char* Type2String(Flag::FlagType type) {
171 switch (type) {
172 case Flag::TYPE_BOOL: return "bool";
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000173 case Flag::TYPE_MAYBE_BOOL: return "maybe_bool";
Steve Blocka7e24c12009-10-30 11:49:00 +0000174 case Flag::TYPE_INT: return "int";
175 case Flag::TYPE_FLOAT: return "float";
176 case Flag::TYPE_STRING: return "string";
177 case Flag::TYPE_ARGS: return "arguments";
178 }
179 UNREACHABLE();
180 return NULL;
181}
182
183
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000184OStream& operator<<(OStream& os, const Flag& flag) { // NOLINT
185 switch (flag.type()) {
Steve Blocka7e24c12009-10-30 11:49:00 +0000186 case Flag::TYPE_BOOL:
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000187 os << (*flag.bool_variable() ? "true" : "false");
188 break;
189 case Flag::TYPE_MAYBE_BOOL:
190 os << (flag.maybe_bool_variable()->has_value
191 ? (flag.maybe_bool_variable()->value ? "true" : "false")
192 : "unset");
Steve Blocka7e24c12009-10-30 11:49:00 +0000193 break;
194 case Flag::TYPE_INT:
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000195 os << *flag.int_variable();
Steve Blocka7e24c12009-10-30 11:49:00 +0000196 break;
197 case Flag::TYPE_FLOAT:
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000198 os << *flag.float_variable();
Steve Blocka7e24c12009-10-30 11:49:00 +0000199 break;
200 case Flag::TYPE_STRING: {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000201 const char* str = flag.string_value();
202 os << (str ? str : "NULL");
Steve Blocka7e24c12009-10-30 11:49:00 +0000203 break;
204 }
205 case Flag::TYPE_ARGS: {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000206 JSArguments args = *flag.args_variable();
207 if (args.argc > 0) {
208 os << args[0];
209 for (int i = 1; i < args.argc; i++) {
210 os << args[i];
Steve Blocka7e24c12009-10-30 11:49:00 +0000211 }
212 }
213 break;
214 }
215 }
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000216 return os;
Steve Blocka7e24c12009-10-30 11:49:00 +0000217}
218
219
220// static
221List<const char*>* FlagList::argv() {
222 List<const char*>* args = new List<const char*>(8);
223 Flag* args_flag = NULL;
224 for (size_t i = 0; i < num_flags; ++i) {
225 Flag* f = &flags[i];
226 if (!f->IsDefault()) {
227 if (f->type() == Flag::TYPE_ARGS) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000228 DCHECK(args_flag == NULL);
Steve Blocka7e24c12009-10-30 11:49:00 +0000229 args_flag = f; // Must be last in arguments.
230 continue;
231 }
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000232 {
233 bool disabled = f->type() == Flag::TYPE_BOOL && !*f->bool_variable();
234 OStringStream os;
235 os << (disabled ? "--no" : "--") << f->name();
236 args->Add(StrDup(os.c_str()));
Steve Blocka7e24c12009-10-30 11:49:00 +0000237 }
Steve Blocka7e24c12009-10-30 11:49:00 +0000238 if (f->type() != Flag::TYPE_BOOL) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000239 OStringStream os;
240 os << *f;
241 args->Add(StrDup(os.c_str()));
Steve Blocka7e24c12009-10-30 11:49:00 +0000242 }
243 }
244 }
245 if (args_flag != NULL) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000246 OStringStream os;
247 os << "--" << args_flag->name();
248 args->Add(StrDup(os.c_str()));
Steve Blocka7e24c12009-10-30 11:49:00 +0000249 JSArguments jsargs = *args_flag->args_variable();
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000250 for (int j = 0; j < jsargs.argc; j++) {
Steve Blocka7e24c12009-10-30 11:49:00 +0000251 args->Add(StrDup(jsargs[j]));
252 }
253 }
254 return args;
255}
256
257
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000258inline char NormalizeChar(char ch) {
259 return ch == '_' ? '-' : ch;
260}
261
262
Steve Blocka7e24c12009-10-30 11:49:00 +0000263// Helper function to parse flags: Takes an argument arg and splits it into
264// a flag name and flag value (or NULL if they are missing). is_bool is set
265// if the arg started with "-no" or "--no". The buffer may be used to NUL-
266// terminate the name, it must be large enough to hold any possible name.
267static void SplitArgument(const char* arg,
268 char* buffer,
269 int buffer_size,
270 const char** name,
271 const char** value,
272 bool* is_bool) {
273 *name = NULL;
274 *value = NULL;
275 *is_bool = false;
276
Ben Murdochb0fe1622011-05-05 13:52:32 +0100277 if (arg != NULL && *arg == '-') {
Steve Blocka7e24c12009-10-30 11:49:00 +0000278 // find the begin of the flag name
279 arg++; // remove 1st '-'
280 if (*arg == '-') {
281 arg++; // remove 2nd '-'
282 if (arg[0] == '\0') {
283 const char* kJSArgumentsFlagName = "js_arguments";
284 *name = kJSArgumentsFlagName;
285 return;
286 }
287 }
288 if (arg[0] == 'n' && arg[1] == 'o') {
289 arg += 2; // remove "no"
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000290 if (NormalizeChar(arg[0]) == '-') arg++; // remove dash after "no".
Steve Blocka7e24c12009-10-30 11:49:00 +0000291 *is_bool = true;
292 }
293 *name = arg;
294
295 // find the end of the flag name
296 while (*arg != '\0' && *arg != '=')
297 arg++;
298
299 // get the value if any
300 if (*arg == '=') {
301 // make a copy so we can NUL-terminate flag name
Steve Blockd0582a62009-12-15 09:54:21 +0000302 size_t n = arg - *name;
303 CHECK(n < static_cast<size_t>(buffer_size)); // buffer is too small
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000304 MemCopy(buffer, *name, n);
Steve Blocka7e24c12009-10-30 11:49:00 +0000305 buffer[n] = '\0';
306 *name = buffer;
307 // get the value
308 *value = arg + 1;
309 }
310 }
311}
312
313
Steve Blocka7e24c12009-10-30 11:49:00 +0000314static bool EqualNames(const char* a, const char* b) {
315 for (int i = 0; NormalizeChar(a[i]) == NormalizeChar(b[i]); i++) {
316 if (a[i] == '\0') {
317 return true;
318 }
319 }
320 return false;
321}
322
323
324static Flag* FindFlag(const char* name) {
325 for (size_t i = 0; i < num_flags; ++i) {
326 if (EqualNames(name, flags[i].name()))
327 return &flags[i];
328 }
329 return NULL;
330}
331
332
333// static
334int FlagList::SetFlagsFromCommandLine(int* argc,
335 char** argv,
336 bool remove_flags) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000337 int return_code = 0;
Steve Blocka7e24c12009-10-30 11:49:00 +0000338 // parse arguments
339 for (int i = 1; i < *argc;) {
340 int j = i; // j > 0
341 const char* arg = argv[i++];
342
343 // split arg into flag components
344 char buffer[1*KB];
345 const char* name;
346 const char* value;
347 bool is_bool;
348 SplitArgument(arg, buffer, sizeof buffer, &name, &value, &is_bool);
349
350 if (name != NULL) {
351 // lookup the flag
352 Flag* flag = FindFlag(name);
353 if (flag == NULL) {
354 if (remove_flags) {
355 // We don't recognize this flag but since we're removing
356 // the flags we recognize we assume that the remaining flags
357 // will be processed somewhere else so this flag might make
358 // sense there.
359 continue;
360 } else {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000361 PrintF(stderr, "Error: unrecognized flag %s\n"
362 "Try --help for options\n", arg);
363 return_code = j;
364 break;
Steve Blocka7e24c12009-10-30 11:49:00 +0000365 }
366 }
367
368 // if we still need a flag value, use the next argument if available
369 if (flag->type() != Flag::TYPE_BOOL &&
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000370 flag->type() != Flag::TYPE_MAYBE_BOOL &&
Steve Blocka7e24c12009-10-30 11:49:00 +0000371 flag->type() != Flag::TYPE_ARGS &&
372 value == NULL) {
373 if (i < *argc) {
374 value = argv[i++];
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000375 }
376 if (!value) {
377 PrintF(stderr, "Error: missing value for flag %s of type %s\n"
378 "Try --help for options\n",
379 arg, Type2String(flag->type()));
380 return_code = j;
381 break;
Steve Blocka7e24c12009-10-30 11:49:00 +0000382 }
383 }
384
385 // set the flag
386 char* endp = const_cast<char*>(""); // *endp is only read
387 switch (flag->type()) {
388 case Flag::TYPE_BOOL:
389 *flag->bool_variable() = !is_bool;
390 break;
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000391 case Flag::TYPE_MAYBE_BOOL:
392 *flag->maybe_bool_variable() = MaybeBoolFlag::Create(true, !is_bool);
393 break;
Steve Blocka7e24c12009-10-30 11:49:00 +0000394 case Flag::TYPE_INT:
395 *flag->int_variable() = strtol(value, &endp, 10); // NOLINT
396 break;
397 case Flag::TYPE_FLOAT:
398 *flag->float_variable() = strtod(value, &endp);
399 break;
400 case Flag::TYPE_STRING:
401 flag->set_string_value(value ? StrDup(value) : NULL, true);
402 break;
403 case Flag::TYPE_ARGS: {
404 int start_pos = (value == NULL) ? i : i - 1;
405 int js_argc = *argc - start_pos;
406 const char** js_argv = NewArray<const char*>(js_argc);
407 if (value != NULL) {
408 js_argv[0] = StrDup(value);
409 }
410 for (int k = i; k < *argc; k++) {
411 js_argv[k - start_pos] = StrDup(argv[k]);
412 }
Ben Murdoch3ef787d2012-04-12 10:51:47 +0100413 *flag->args_variable() = JSArguments::Create(js_argc, js_argv);
Steve Blocka7e24c12009-10-30 11:49:00 +0000414 i = *argc; // Consume all arguments
415 break;
416 }
417 }
418
419 // handle errors
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000420 bool is_bool_type = flag->type() == Flag::TYPE_BOOL ||
421 flag->type() == Flag::TYPE_MAYBE_BOOL;
422 if ((is_bool_type && value != NULL) || (!is_bool_type && is_bool) ||
Steve Blocka7e24c12009-10-30 11:49:00 +0000423 *endp != '\0') {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000424 PrintF(stderr, "Error: illegal value for flag %s of type %s\n"
425 "Try --help for options\n",
426 arg, Type2String(flag->type()));
427 return_code = j;
428 break;
Steve Blocka7e24c12009-10-30 11:49:00 +0000429 }
430
431 // remove the flag & value from the command
432 if (remove_flags) {
433 while (j < i) {
434 argv[j++] = NULL;
435 }
436 }
437 }
438 }
439
440 // shrink the argument list
441 if (remove_flags) {
442 int j = 1;
443 for (int i = 1; i < *argc; i++) {
444 if (argv[i] != NULL)
445 argv[j++] = argv[i];
446 }
447 *argc = j;
448 }
449
450 if (FLAG_help) {
451 PrintHelp();
452 exit(0);
453 }
454 // parsed all flags successfully
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000455 return return_code;
Steve Blocka7e24c12009-10-30 11:49:00 +0000456}
457
458
459static char* SkipWhiteSpace(char* p) {
460 while (*p != '\0' && isspace(*p) != 0) p++;
461 return p;
462}
463
464
465static char* SkipBlackSpace(char* p) {
466 while (*p != '\0' && isspace(*p) == 0) p++;
467 return p;
468}
469
470
471// static
472int FlagList::SetFlagsFromString(const char* str, int len) {
473 // make a 0-terminated copy of str
Kristian Monsen25f61362010-05-21 11:50:48 +0100474 ScopedVector<char> copy0(len + 1);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000475 MemCopy(copy0.start(), str, len);
Steve Blocka7e24c12009-10-30 11:49:00 +0000476 copy0[len] = '\0';
477
478 // strip leading white space
Kristian Monsen25f61362010-05-21 11:50:48 +0100479 char* copy = SkipWhiteSpace(copy0.start());
Steve Blocka7e24c12009-10-30 11:49:00 +0000480
481 // count the number of 'arguments'
482 int argc = 1; // be compatible with SetFlagsFromCommandLine()
483 for (char* p = copy; *p != '\0'; argc++) {
484 p = SkipBlackSpace(p);
485 p = SkipWhiteSpace(p);
486 }
487
488 // allocate argument array
Kristian Monsen25f61362010-05-21 11:50:48 +0100489 ScopedVector<char*> argv(argc);
Steve Blocka7e24c12009-10-30 11:49:00 +0000490
491 // split the flags string into arguments
492 argc = 1; // be compatible with SetFlagsFromCommandLine()
493 for (char* p = copy; *p != '\0'; argc++) {
494 argv[argc] = p;
495 p = SkipBlackSpace(p);
496 if (*p != '\0') *p++ = '\0'; // 0-terminate argument
497 p = SkipWhiteSpace(p);
498 }
499
500 // set the flags
Kristian Monsen25f61362010-05-21 11:50:48 +0100501 int result = SetFlagsFromCommandLine(&argc, argv.start(), false);
Steve Blocka7e24c12009-10-30 11:49:00 +0000502
503 return result;
504}
505
506
507// static
508void FlagList::ResetAllFlags() {
509 for (size_t i = 0; i < num_flags; ++i) {
510 flags[i].Reset();
511 }
512}
513
514
515// static
516void FlagList::PrintHelp() {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000517 CpuFeatures::Probe(false);
518 CpuFeatures::PrintTarget();
519 CpuFeatures::PrintFeatures();
520
521 OFStream os(stdout);
522 os << "Usage:\n"
523 << " shell [options] -e string\n"
524 << " execute string in V8\n"
525 << " shell [options] file1 file2 ... filek\n"
526 << " run JavaScript scripts in file1, file2, ..., filek\n"
527 << " shell [options]\n"
528 << " shell [options] --shell [file1 file2 ... filek]\n"
529 << " run an interactive JavaScript shell\n"
530 << " d8 [options] file1 file2 ... filek\n"
531 << " d8 [options]\n"
532 << " d8 [options] --shell [file1 file2 ... filek]\n"
533 << " run the new debugging shell\n\n"
534 << "Options:\n";
Steve Blocka7e24c12009-10-30 11:49:00 +0000535 for (size_t i = 0; i < num_flags; ++i) {
536 Flag* f = &flags[i];
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000537 os << " --" << f->name() << " (" << f->comment() << ")\n"
538 << " type: " << Type2String(f->type()) << " default: " << *f
539 << "\n";
Steve Blocka7e24c12009-10-30 11:49:00 +0000540 }
541}
542
Ben Murdochc7cc0282012-03-05 14:35:55 +0000543
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000544// static
Ben Murdoch3ef787d2012-04-12 10:51:47 +0100545void FlagList::EnforceFlagImplications() {
546#define FLAG_MODE_DEFINE_IMPLICATIONS
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000547#include "src/flag-definitions.h"
548#undef FLAG_MODE_DEFINE_IMPLICATIONS
Ben Murdoch3ef787d2012-04-12 10:51:47 +0100549}
Ben Murdoch85b71792012-04-11 18:30:58 +0100550
Steve Blocka7e24c12009-10-30 11:49:00 +0000551} } // namespace v8::internal