blob: 5e33bdaeec8862ab4249a221f84c60703e9e3401 [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
Emily Bernierd0a1eb72015-03-24 16:35:39 -04005#include <cctype>
6#include <cstdlib>
7#include <sstream>
Steve Blocka7e24c12009-10-30 11:49:00 +00008
Ben Murdochb8a8cc12014-11-26 15:28:44 +00009#include "src/v8.h"
Steve Blocka7e24c12009-10-30 11:49:00 +000010
Ben Murdochb8a8cc12014-11-26 15:28:44 +000011#include "src/assembler.h"
Emily Bernierd0a1eb72015-03-24 16:35:39 -040012#include "src/base/functional.h"
Ben Murdochb8a8cc12014-11-26 15:28:44 +000013#include "src/base/platform/platform.h"
14#include "src/ostreams.h"
Steve Blocka7e24c12009-10-30 11:49:00 +000015
16namespace v8 {
17namespace internal {
18
19// Define all of our flags.
20#define FLAG_MODE_DEFINE
Ben Murdochb8a8cc12014-11-26 15:28:44 +000021#include "src/flag-definitions.h" // NOLINT
Steve Blocka7e24c12009-10-30 11:49:00 +000022
23// Define all of our flags default values.
24#define FLAG_MODE_DEFINE_DEFAULTS
Ben Murdochb8a8cc12014-11-26 15:28:44 +000025#include "src/flag-definitions.h" // NOLINT
Steve Blocka7e24c12009-10-30 11:49:00 +000026
27namespace {
28
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
31// initialized as to avoid requiring static constructors.
32struct Flag {
Ben Murdochb8a8cc12014-11-26 15:28:44 +000033 enum FlagType { TYPE_BOOL, TYPE_MAYBE_BOOL, TYPE_INT, TYPE_FLOAT,
34 TYPE_STRING, TYPE_ARGS };
Steve Blocka7e24c12009-10-30 11:49:00 +000035
36 FlagType type_; // What type of flag, bool, int, or string.
37 const char* name_; // Name of the flag, ex "my_flag".
38 void* valptr_; // Pointer to the global flag variable.
39 const void* defptr_; // Pointer to the default value.
40 const char* cmt_; // A comment about the flags purpose.
41 bool owns_ptr_; // Does the flag own its string value?
42
43 FlagType type() const { return type_; }
44
45 const char* name() const { return name_; }
46
47 const char* comment() const { return cmt_; }
48
49 bool* bool_variable() const {
Ben Murdochb8a8cc12014-11-26 15:28:44 +000050 DCHECK(type_ == TYPE_BOOL);
Steve Blocka7e24c12009-10-30 11:49:00 +000051 return reinterpret_cast<bool*>(valptr_);
52 }
53
Ben Murdochb8a8cc12014-11-26 15:28:44 +000054 MaybeBoolFlag* maybe_bool_variable() const {
55 DCHECK(type_ == TYPE_MAYBE_BOOL);
56 return reinterpret_cast<MaybeBoolFlag*>(valptr_);
57 }
58
Steve Blocka7e24c12009-10-30 11:49:00 +000059 int* int_variable() const {
Ben Murdochb8a8cc12014-11-26 15:28:44 +000060 DCHECK(type_ == TYPE_INT);
Steve Blocka7e24c12009-10-30 11:49:00 +000061 return reinterpret_cast<int*>(valptr_);
62 }
63
64 double* float_variable() const {
Ben Murdochb8a8cc12014-11-26 15:28:44 +000065 DCHECK(type_ == TYPE_FLOAT);
Steve Blocka7e24c12009-10-30 11:49:00 +000066 return reinterpret_cast<double*>(valptr_);
67 }
68
69 const char* string_value() const {
Ben Murdochb8a8cc12014-11-26 15:28:44 +000070 DCHECK(type_ == TYPE_STRING);
Steve Blocka7e24c12009-10-30 11:49:00 +000071 return *reinterpret_cast<const char**>(valptr_);
72 }
73
74 void set_string_value(const char* value, bool owns_ptr) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +000075 DCHECK(type_ == TYPE_STRING);
Steve Blocka7e24c12009-10-30 11:49:00 +000076 const char** ptr = reinterpret_cast<const char**>(valptr_);
77 if (owns_ptr_ && *ptr != NULL) DeleteArray(*ptr);
78 *ptr = value;
79 owns_ptr_ = owns_ptr;
80 }
81
82 JSArguments* args_variable() const {
Ben Murdochb8a8cc12014-11-26 15:28:44 +000083 DCHECK(type_ == TYPE_ARGS);
Steve Blocka7e24c12009-10-30 11:49:00 +000084 return reinterpret_cast<JSArguments*>(valptr_);
85 }
86
87 bool bool_default() const {
Ben Murdochb8a8cc12014-11-26 15:28:44 +000088 DCHECK(type_ == TYPE_BOOL);
Steve Blocka7e24c12009-10-30 11:49:00 +000089 return *reinterpret_cast<const bool*>(defptr_);
90 }
91
92 int int_default() const {
Ben Murdochb8a8cc12014-11-26 15:28:44 +000093 DCHECK(type_ == TYPE_INT);
Steve Blocka7e24c12009-10-30 11:49:00 +000094 return *reinterpret_cast<const int*>(defptr_);
95 }
96
97 double float_default() const {
Ben Murdochb8a8cc12014-11-26 15:28:44 +000098 DCHECK(type_ == TYPE_FLOAT);
Steve Blocka7e24c12009-10-30 11:49:00 +000099 return *reinterpret_cast<const double*>(defptr_);
100 }
101
102 const char* string_default() const {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000103 DCHECK(type_ == TYPE_STRING);
Steve Blocka7e24c12009-10-30 11:49:00 +0000104 return *reinterpret_cast<const char* const *>(defptr_);
105 }
106
107 JSArguments args_default() const {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000108 DCHECK(type_ == TYPE_ARGS);
Steve Blocka7e24c12009-10-30 11:49:00 +0000109 return *reinterpret_cast<const JSArguments*>(defptr_);
110 }
111
112 // Compare this flag's current value against the default.
113 bool IsDefault() const {
114 switch (type_) {
115 case TYPE_BOOL:
116 return *bool_variable() == bool_default();
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000117 case TYPE_MAYBE_BOOL:
118 return maybe_bool_variable()->has_value == false;
Steve Blocka7e24c12009-10-30 11:49:00 +0000119 case TYPE_INT:
120 return *int_variable() == int_default();
121 case TYPE_FLOAT:
122 return *float_variable() == float_default();
123 case TYPE_STRING: {
124 const char* str1 = string_value();
125 const char* str2 = string_default();
126 if (str2 == NULL) return str1 == NULL;
127 if (str1 == NULL) return str2 == NULL;
128 return strcmp(str1, str2) == 0;
129 }
130 case TYPE_ARGS:
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000131 return args_variable()->argc == 0;
Steve Blocka7e24c12009-10-30 11:49:00 +0000132 }
133 UNREACHABLE();
134 return true;
135 }
136
137 // Set a flag back to it's default value.
138 void Reset() {
139 switch (type_) {
140 case TYPE_BOOL:
141 *bool_variable() = bool_default();
142 break;
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000143 case TYPE_MAYBE_BOOL:
144 *maybe_bool_variable() = MaybeBoolFlag::Create(false, false);
145 break;
Steve Blocka7e24c12009-10-30 11:49:00 +0000146 case TYPE_INT:
147 *int_variable() = int_default();
148 break;
149 case TYPE_FLOAT:
150 *float_variable() = float_default();
151 break;
152 case TYPE_STRING:
153 set_string_value(string_default(), false);
154 break;
155 case TYPE_ARGS:
156 *args_variable() = args_default();
157 break;
158 }
159 }
160};
161
162Flag flags[] = {
163#define FLAG_MODE_META
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000164#include "src/flag-definitions.h"
Steve Blocka7e24c12009-10-30 11:49:00 +0000165};
166
167const size_t num_flags = sizeof(flags) / sizeof(*flags);
168
169} // namespace
170
171
172static const char* Type2String(Flag::FlagType type) {
173 switch (type) {
174 case Flag::TYPE_BOOL: return "bool";
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000175 case Flag::TYPE_MAYBE_BOOL: return "maybe_bool";
Steve Blocka7e24c12009-10-30 11:49:00 +0000176 case Flag::TYPE_INT: return "int";
177 case Flag::TYPE_FLOAT: return "float";
178 case Flag::TYPE_STRING: return "string";
179 case Flag::TYPE_ARGS: return "arguments";
180 }
181 UNREACHABLE();
182 return NULL;
183}
184
185
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400186std::ostream& operator<<(std::ostream& os, const Flag& flag) { // NOLINT
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000187 switch (flag.type()) {
Steve Blocka7e24c12009-10-30 11:49:00 +0000188 case Flag::TYPE_BOOL:
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000189 os << (*flag.bool_variable() ? "true" : "false");
190 break;
191 case Flag::TYPE_MAYBE_BOOL:
192 os << (flag.maybe_bool_variable()->has_value
193 ? (flag.maybe_bool_variable()->value ? "true" : "false")
194 : "unset");
Steve Blocka7e24c12009-10-30 11:49:00 +0000195 break;
196 case Flag::TYPE_INT:
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000197 os << *flag.int_variable();
Steve Blocka7e24c12009-10-30 11:49:00 +0000198 break;
199 case Flag::TYPE_FLOAT:
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000200 os << *flag.float_variable();
Steve Blocka7e24c12009-10-30 11:49:00 +0000201 break;
202 case Flag::TYPE_STRING: {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000203 const char* str = flag.string_value();
204 os << (str ? str : "NULL");
Steve Blocka7e24c12009-10-30 11:49:00 +0000205 break;
206 }
207 case Flag::TYPE_ARGS: {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000208 JSArguments args = *flag.args_variable();
209 if (args.argc > 0) {
210 os << args[0];
211 for (int i = 1; i < args.argc; i++) {
212 os << args[i];
Steve Blocka7e24c12009-10-30 11:49:00 +0000213 }
214 }
215 break;
216 }
217 }
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000218 return os;
Steve Blocka7e24c12009-10-30 11:49:00 +0000219}
220
221
222// static
223List<const char*>* FlagList::argv() {
224 List<const char*>* args = new List<const char*>(8);
225 Flag* args_flag = NULL;
226 for (size_t i = 0; i < num_flags; ++i) {
227 Flag* f = &flags[i];
228 if (!f->IsDefault()) {
229 if (f->type() == Flag::TYPE_ARGS) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000230 DCHECK(args_flag == NULL);
Steve Blocka7e24c12009-10-30 11:49:00 +0000231 args_flag = f; // Must be last in arguments.
232 continue;
233 }
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000234 {
235 bool disabled = f->type() == Flag::TYPE_BOOL && !*f->bool_variable();
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400236 std::ostringstream os;
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000237 os << (disabled ? "--no" : "--") << f->name();
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400238 args->Add(StrDup(os.str().c_str()));
Steve Blocka7e24c12009-10-30 11:49:00 +0000239 }
Steve Blocka7e24c12009-10-30 11:49:00 +0000240 if (f->type() != Flag::TYPE_BOOL) {
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400241 std::ostringstream os;
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000242 os << *f;
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400243 args->Add(StrDup(os.str().c_str()));
Steve Blocka7e24c12009-10-30 11:49:00 +0000244 }
245 }
246 }
247 if (args_flag != NULL) {
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400248 std::ostringstream os;
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000249 os << "--" << args_flag->name();
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400250 args->Add(StrDup(os.str().c_str()));
Steve Blocka7e24c12009-10-30 11:49:00 +0000251 JSArguments jsargs = *args_flag->args_variable();
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000252 for (int j = 0; j < jsargs.argc; j++) {
Steve Blocka7e24c12009-10-30 11:49:00 +0000253 args->Add(StrDup(jsargs[j]));
254 }
255 }
256 return args;
257}
258
259
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000260inline char NormalizeChar(char ch) {
261 return ch == '_' ? '-' : ch;
262}
263
264
Steve Blocka7e24c12009-10-30 11:49:00 +0000265// Helper function to parse flags: Takes an argument arg and splits it into
266// a flag name and flag value (or NULL if they are missing). is_bool is set
267// if the arg started with "-no" or "--no". The buffer may be used to NUL-
268// terminate the name, it must be large enough to hold any possible name.
269static void SplitArgument(const char* arg,
270 char* buffer,
271 int buffer_size,
272 const char** name,
273 const char** value,
274 bool* is_bool) {
275 *name = NULL;
276 *value = NULL;
277 *is_bool = false;
278
Ben Murdochb0fe1622011-05-05 13:52:32 +0100279 if (arg != NULL && *arg == '-') {
Steve Blocka7e24c12009-10-30 11:49:00 +0000280 // find the begin of the flag name
281 arg++; // remove 1st '-'
282 if (*arg == '-') {
283 arg++; // remove 2nd '-'
284 if (arg[0] == '\0') {
285 const char* kJSArgumentsFlagName = "js_arguments";
286 *name = kJSArgumentsFlagName;
287 return;
288 }
289 }
290 if (arg[0] == 'n' && arg[1] == 'o') {
291 arg += 2; // remove "no"
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000292 if (NormalizeChar(arg[0]) == '-') arg++; // remove dash after "no".
Steve Blocka7e24c12009-10-30 11:49:00 +0000293 *is_bool = true;
294 }
295 *name = arg;
296
297 // find the end of the flag name
298 while (*arg != '\0' && *arg != '=')
299 arg++;
300
301 // get the value if any
302 if (*arg == '=') {
303 // make a copy so we can NUL-terminate flag name
Steve Blockd0582a62009-12-15 09:54:21 +0000304 size_t n = arg - *name;
305 CHECK(n < static_cast<size_t>(buffer_size)); // buffer is too small
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000306 MemCopy(buffer, *name, n);
Steve Blocka7e24c12009-10-30 11:49:00 +0000307 buffer[n] = '\0';
308 *name = buffer;
309 // get the value
310 *value = arg + 1;
311 }
312 }
313}
314
315
Steve Blocka7e24c12009-10-30 11:49:00 +0000316static bool EqualNames(const char* a, const char* b) {
317 for (int i = 0; NormalizeChar(a[i]) == NormalizeChar(b[i]); i++) {
318 if (a[i] == '\0') {
319 return true;
320 }
321 }
322 return false;
323}
324
325
326static Flag* FindFlag(const char* name) {
327 for (size_t i = 0; i < num_flags; ++i) {
328 if (EqualNames(name, flags[i].name()))
329 return &flags[i];
330 }
331 return NULL;
332}
333
334
335// static
336int FlagList::SetFlagsFromCommandLine(int* argc,
337 char** argv,
338 bool remove_flags) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000339 int return_code = 0;
Steve Blocka7e24c12009-10-30 11:49:00 +0000340 // parse arguments
341 for (int i = 1; i < *argc;) {
342 int j = i; // j > 0
343 const char* arg = argv[i++];
344
345 // split arg into flag components
346 char buffer[1*KB];
347 const char* name;
348 const char* value;
349 bool is_bool;
350 SplitArgument(arg, buffer, sizeof buffer, &name, &value, &is_bool);
351
352 if (name != NULL) {
353 // lookup the flag
354 Flag* flag = FindFlag(name);
355 if (flag == NULL) {
356 if (remove_flags) {
357 // We don't recognize this flag but since we're removing
358 // the flags we recognize we assume that the remaining flags
359 // will be processed somewhere else so this flag might make
360 // sense there.
361 continue;
362 } else {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000363 PrintF(stderr, "Error: unrecognized flag %s\n"
364 "Try --help for options\n", arg);
365 return_code = j;
366 break;
Steve Blocka7e24c12009-10-30 11:49:00 +0000367 }
368 }
369
370 // if we still need a flag value, use the next argument if available
371 if (flag->type() != Flag::TYPE_BOOL &&
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000372 flag->type() != Flag::TYPE_MAYBE_BOOL &&
Steve Blocka7e24c12009-10-30 11:49:00 +0000373 flag->type() != Flag::TYPE_ARGS &&
374 value == NULL) {
375 if (i < *argc) {
376 value = argv[i++];
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000377 }
378 if (!value) {
379 PrintF(stderr, "Error: missing value for flag %s of type %s\n"
380 "Try --help for options\n",
381 arg, Type2String(flag->type()));
382 return_code = j;
383 break;
Steve Blocka7e24c12009-10-30 11:49:00 +0000384 }
385 }
386
387 // set the flag
388 char* endp = const_cast<char*>(""); // *endp is only read
389 switch (flag->type()) {
390 case Flag::TYPE_BOOL:
391 *flag->bool_variable() = !is_bool;
392 break;
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000393 case Flag::TYPE_MAYBE_BOOL:
394 *flag->maybe_bool_variable() = MaybeBoolFlag::Create(true, !is_bool);
395 break;
Steve Blocka7e24c12009-10-30 11:49:00 +0000396 case Flag::TYPE_INT:
397 *flag->int_variable() = strtol(value, &endp, 10); // NOLINT
398 break;
399 case Flag::TYPE_FLOAT:
400 *flag->float_variable() = strtod(value, &endp);
401 break;
402 case Flag::TYPE_STRING:
403 flag->set_string_value(value ? StrDup(value) : NULL, true);
404 break;
405 case Flag::TYPE_ARGS: {
406 int start_pos = (value == NULL) ? i : i - 1;
407 int js_argc = *argc - start_pos;
408 const char** js_argv = NewArray<const char*>(js_argc);
409 if (value != NULL) {
410 js_argv[0] = StrDup(value);
411 }
412 for (int k = i; k < *argc; k++) {
413 js_argv[k - start_pos] = StrDup(argv[k]);
414 }
Ben Murdoch3ef787d2012-04-12 10:51:47 +0100415 *flag->args_variable() = JSArguments::Create(js_argc, js_argv);
Steve Blocka7e24c12009-10-30 11:49:00 +0000416 i = *argc; // Consume all arguments
417 break;
418 }
419 }
420
421 // handle errors
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000422 bool is_bool_type = flag->type() == Flag::TYPE_BOOL ||
423 flag->type() == Flag::TYPE_MAYBE_BOOL;
424 if ((is_bool_type && value != NULL) || (!is_bool_type && is_bool) ||
Steve Blocka7e24c12009-10-30 11:49:00 +0000425 *endp != '\0') {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000426 PrintF(stderr, "Error: illegal value for flag %s of type %s\n"
427 "Try --help for options\n",
428 arg, Type2String(flag->type()));
429 return_code = j;
430 break;
Steve Blocka7e24c12009-10-30 11:49:00 +0000431 }
432
433 // remove the flag & value from the command
434 if (remove_flags) {
435 while (j < i) {
436 argv[j++] = NULL;
437 }
438 }
439 }
440 }
441
442 // shrink the argument list
443 if (remove_flags) {
444 int j = 1;
445 for (int i = 1; i < *argc; i++) {
446 if (argv[i] != NULL)
447 argv[j++] = argv[i];
448 }
449 *argc = j;
450 }
451
452 if (FLAG_help) {
453 PrintHelp();
454 exit(0);
455 }
456 // parsed all flags successfully
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000457 return return_code;
Steve Blocka7e24c12009-10-30 11:49:00 +0000458}
459
460
461static char* SkipWhiteSpace(char* p) {
462 while (*p != '\0' && isspace(*p) != 0) p++;
463 return p;
464}
465
466
467static char* SkipBlackSpace(char* p) {
468 while (*p != '\0' && isspace(*p) == 0) p++;
469 return p;
470}
471
472
473// static
474int FlagList::SetFlagsFromString(const char* str, int len) {
475 // make a 0-terminated copy of str
Kristian Monsen25f61362010-05-21 11:50:48 +0100476 ScopedVector<char> copy0(len + 1);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000477 MemCopy(copy0.start(), str, len);
Steve Blocka7e24c12009-10-30 11:49:00 +0000478 copy0[len] = '\0';
479
480 // strip leading white space
Kristian Monsen25f61362010-05-21 11:50:48 +0100481 char* copy = SkipWhiteSpace(copy0.start());
Steve Blocka7e24c12009-10-30 11:49:00 +0000482
483 // count the number of 'arguments'
484 int argc = 1; // be compatible with SetFlagsFromCommandLine()
485 for (char* p = copy; *p != '\0'; argc++) {
486 p = SkipBlackSpace(p);
487 p = SkipWhiteSpace(p);
488 }
489
490 // allocate argument array
Kristian Monsen25f61362010-05-21 11:50:48 +0100491 ScopedVector<char*> argv(argc);
Steve Blocka7e24c12009-10-30 11:49:00 +0000492
493 // split the flags string into arguments
494 argc = 1; // be compatible with SetFlagsFromCommandLine()
495 for (char* p = copy; *p != '\0'; argc++) {
496 argv[argc] = p;
497 p = SkipBlackSpace(p);
498 if (*p != '\0') *p++ = '\0'; // 0-terminate argument
499 p = SkipWhiteSpace(p);
500 }
501
502 // set the flags
Kristian Monsen25f61362010-05-21 11:50:48 +0100503 int result = SetFlagsFromCommandLine(&argc, argv.start(), false);
Steve Blocka7e24c12009-10-30 11:49:00 +0000504
505 return result;
506}
507
508
509// static
510void FlagList::ResetAllFlags() {
511 for (size_t i = 0; i < num_flags; ++i) {
512 flags[i].Reset();
513 }
514}
515
516
517// static
518void FlagList::PrintHelp() {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000519 CpuFeatures::Probe(false);
520 CpuFeatures::PrintTarget();
521 CpuFeatures::PrintFeatures();
522
523 OFStream os(stdout);
524 os << "Usage:\n"
525 << " shell [options] -e string\n"
526 << " execute string in V8\n"
527 << " shell [options] file1 file2 ... filek\n"
528 << " run JavaScript scripts in file1, file2, ..., filek\n"
529 << " shell [options]\n"
530 << " shell [options] --shell [file1 file2 ... filek]\n"
531 << " run an interactive JavaScript shell\n"
532 << " d8 [options] file1 file2 ... filek\n"
533 << " d8 [options]\n"
534 << " d8 [options] --shell [file1 file2 ... filek]\n"
535 << " run the new debugging shell\n\n"
536 << "Options:\n";
Steve Blocka7e24c12009-10-30 11:49:00 +0000537 for (size_t i = 0; i < num_flags; ++i) {
538 Flag* f = &flags[i];
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000539 os << " --" << f->name() << " (" << f->comment() << ")\n"
540 << " type: " << Type2String(f->type()) << " default: " << *f
541 << "\n";
Steve Blocka7e24c12009-10-30 11:49:00 +0000542 }
543}
544
Ben Murdochc7cc0282012-03-05 14:35:55 +0000545
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000546// static
Ben Murdoch3ef787d2012-04-12 10:51:47 +0100547void FlagList::EnforceFlagImplications() {
548#define FLAG_MODE_DEFINE_IMPLICATIONS
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000549#include "src/flag-definitions.h"
550#undef FLAG_MODE_DEFINE_IMPLICATIONS
Ben Murdoch3ef787d2012-04-12 10:51:47 +0100551}
Ben Murdoch85b71792012-04-11 18:30:58 +0100552
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400553
554uint32_t FlagList::Hash() {
555 std::ostringstream modified_args_as_string;
556 for (size_t i = 0; i < num_flags; ++i) {
557 Flag* current = &flags[i];
558 if (!current->IsDefault()) {
559 modified_args_as_string << i;
560 modified_args_as_string << *current;
561 }
562 }
563 std::string args(modified_args_as_string.str());
564 return static_cast<uint32_t>(
565 base::hash_range(args.c_str(), args.c_str() + args.length()));
566}
Steve Blocka7e24c12009-10-30 11:49:00 +0000567} } // namespace v8::internal