19258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org// Copyright 2006-2008 the V8 project authors. All rights reserved. 23484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// Use of this source code is governed by a BSD-style license that can be 33484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// found in the LICENSE file. 443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include <ctype.h> 643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include <stdlib.h> 743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 8196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/v8.h" 943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 10196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/assembler.h" 115de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org#include "src/base/platform/platform.h" 12f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org#include "src/ostreams.h" 133bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org 1471affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace v8 { 1571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace internal { 1643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 17b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org// Define all of our flags. 18b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org#define FLAG_MODE_DEFINE 194b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org#include "src/flag-definitions.h" // NOLINT 2043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 21b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org// Define all of our flags default values. 22b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org#define FLAG_MODE_DEFINE_DEFAULTS 234b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org#include "src/flag-definitions.h" // NOLINT 24b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org 25b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.orgnamespace { 26b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org 27b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org// This structure represents a single entry in the flag system, with a pointer 28b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org// to the actual flag, default value, comment, etc. This is designed to be POD 29b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org// initialized as to avoid requiring static constructors. 30b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.orgstruct Flag { 31528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org enum FlagType { TYPE_BOOL, TYPE_MAYBE_BOOL, TYPE_INT, TYPE_FLOAT, 32528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org TYPE_STRING, TYPE_ARGS }; 33b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org 34b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org FlagType type_; // What type of flag, bool, int, or string. 35b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org const char* name_; // Name of the flag, ex "my_flag". 36b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org void* valptr_; // Pointer to the global flag variable. 37b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org const void* defptr_; // Pointer to the default value. 38b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org const char* cmt_; // A comment about the flags purpose. 3941826e77311db718135ef6517b846933dfd275f3ager@chromium.org bool owns_ptr_; // Does the flag own its string value? 40b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org 41b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org FlagType type() const { return type_; } 4243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 43b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org const char* name() const { return name_; } 4443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 45b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org const char* comment() const { return cmt_; } 46b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org 47b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org bool* bool_variable() const { 48e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(type_ == TYPE_BOOL); 49b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org return reinterpret_cast<bool*>(valptr_); 5043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 5143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 52528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org MaybeBoolFlag* maybe_bool_variable() const { 53e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(type_ == TYPE_MAYBE_BOOL); 54528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org return reinterpret_cast<MaybeBoolFlag*>(valptr_); 55528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org } 56528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org 57b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org int* int_variable() const { 58e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(type_ == TYPE_INT); 59b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org return reinterpret_cast<int*>(valptr_); 60b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org } 6143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 62b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org double* float_variable() const { 63e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(type_ == TYPE_FLOAT); 64b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org return reinterpret_cast<double*>(valptr_); 6543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 6643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 6741826e77311db718135ef6517b846933dfd275f3ager@chromium.org const char* string_value() const { 68e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(type_ == TYPE_STRING); 6941826e77311db718135ef6517b846933dfd275f3ager@chromium.org return *reinterpret_cast<const char**>(valptr_); 7041826e77311db718135ef6517b846933dfd275f3ager@chromium.org } 7141826e77311db718135ef6517b846933dfd275f3ager@chromium.org 72b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org void set_string_value(const char* value, bool owns_ptr) { 73e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(type_ == TYPE_STRING); 74b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org const char** ptr = reinterpret_cast<const char**>(valptr_); 7541826e77311db718135ef6517b846933dfd275f3ager@chromium.org if (owns_ptr_ && *ptr != NULL) DeleteArray(*ptr); 7641826e77311db718135ef6517b846933dfd275f3ager@chromium.org *ptr = value; 7741826e77311db718135ef6517b846933dfd275f3ager@chromium.org owns_ptr_ = owns_ptr; 78b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org } 7943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 803bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org JSArguments* args_variable() const { 81e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(type_ == TYPE_ARGS); 823bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org return reinterpret_cast<JSArguments*>(valptr_); 833bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org } 843bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org 85b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org bool bool_default() const { 86e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(type_ == TYPE_BOOL); 87b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org return *reinterpret_cast<const bool*>(defptr_); 88b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org } 8943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 90b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org int int_default() const { 91e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(type_ == TYPE_INT); 92b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org return *reinterpret_cast<const int*>(defptr_); 93b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org } 9443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 95b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org double float_default() const { 96e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(type_ == TYPE_FLOAT); 97b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org return *reinterpret_cast<const double*>(defptr_); 98b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org } 9943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 100b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org const char* string_default() const { 101e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(type_ == TYPE_STRING); 102b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org return *reinterpret_cast<const char* const *>(defptr_); 10343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 10443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1053bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org JSArguments args_default() const { 106e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(type_ == TYPE_ARGS); 1073bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org return *reinterpret_cast<const JSArguments*>(defptr_); 1083bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org } 1093bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org 110b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org // Compare this flag's current value against the default. 111b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org bool IsDefault() const { 112b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org switch (type_) { 113b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org case TYPE_BOOL: 114b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org return *bool_variable() == bool_default(); 115528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org case TYPE_MAYBE_BOOL: 116528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org return maybe_bool_variable()->has_value == false; 117b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org case TYPE_INT: 118b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org return *int_variable() == int_default(); 119b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org case TYPE_FLOAT: 120b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org return *float_variable() == float_default(); 1213bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org case TYPE_STRING: { 12241826e77311db718135ef6517b846933dfd275f3ager@chromium.org const char* str1 = string_value(); 123b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org const char* str2 = string_default(); 124b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org if (str2 == NULL) return str1 == NULL; 125b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org if (str1 == NULL) return str2 == NULL; 126b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org return strcmp(str1, str2) == 0; 1273bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org } 1283bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org case TYPE_ARGS: 129528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org return args_variable()->argc == 0; 130b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org } 131b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org UNREACHABLE(); 132b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org return true; 133b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org } 13443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 135b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org // Set a flag back to it's default value. 136b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org void Reset() { 137b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org switch (type_) { 138b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org case TYPE_BOOL: 139b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org *bool_variable() = bool_default(); 140b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org break; 141528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org case TYPE_MAYBE_BOOL: 142528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org *maybe_bool_variable() = MaybeBoolFlag::Create(false, false); 143528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org break; 144b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org case TYPE_INT: 145b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org *int_variable() = int_default(); 146b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org break; 147b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org case TYPE_FLOAT: 148b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org *float_variable() = float_default(); 149b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org break; 150b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org case TYPE_STRING: 15141826e77311db718135ef6517b846933dfd275f3ager@chromium.org set_string_value(string_default(), false); 152b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org break; 1533bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org case TYPE_ARGS: 1543bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org *args_variable() = args_default(); 1553bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org break; 156b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org } 15743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 158b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org}; 15943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 160b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.orgFlag flags[] = { 161b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org#define FLAG_MODE_META 162196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/flag-definitions.h" 163b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org}; 16443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 165b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.orgconst size_t num_flags = sizeof(flags) / sizeof(*flags); 166b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org 167b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org} // namespace 168b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org 169b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org 170b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.orgstatic const char* Type2String(Flag::FlagType type) { 17143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen switch (type) { 172b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org case Flag::TYPE_BOOL: return "bool"; 173528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org case Flag::TYPE_MAYBE_BOOL: return "maybe_bool"; 174b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org case Flag::TYPE_INT: return "int"; 175b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org case Flag::TYPE_FLOAT: return "float"; 176b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org case Flag::TYPE_STRING: return "string"; 1773bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org case Flag::TYPE_ARGS: return "arguments"; 17843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 17943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen UNREACHABLE(); 18043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return NULL; 18143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 18243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 18343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 184f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.orgOStream& operator<<(OStream& os, const Flag& flag) { // NOLINT 185f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org switch (flag.type()) { 186b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org case Flag::TYPE_BOOL: 187f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org os << (*flag.bool_variable() ? "true" : "false"); 18843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen break; 189528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org case Flag::TYPE_MAYBE_BOOL: 190f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org os << (flag.maybe_bool_variable()->has_value 191f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org ? (flag.maybe_bool_variable()->value ? "true" : "false") 192f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org : "unset"); 193528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org break; 194b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org case Flag::TYPE_INT: 195f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org os << *flag.int_variable(); 19643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen break; 197b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org case Flag::TYPE_FLOAT: 198f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org os << *flag.float_variable(); 19943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen break; 2003bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org case Flag::TYPE_STRING: { 201f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org const char* str = flag.string_value(); 202f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org os << (str ? str : "NULL"); 2033bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org break; 2043bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org } 2053bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org case Flag::TYPE_ARGS: { 206f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org JSArguments args = *flag.args_variable(); 207528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org if (args.argc > 0) { 208f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org os << args[0]; 209528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org for (int i = 1; i < args.argc; i++) { 210f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org os << args[i]; 2113bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org } 21243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 21343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen break; 2143bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org } 21543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 216f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org return os; 21743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 21843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 21943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 220b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org// static 2213bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.orgList<const char*>* FlagList::argv() { 2223bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org List<const char*>* args = new List<const char*>(8); 2233bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org Flag* args_flag = NULL; 224b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org for (size_t i = 0; i < num_flags; ++i) { 225b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org Flag* f = &flags[i]; 22643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (!f->IsDefault()) { 2273bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org if (f->type() == Flag::TYPE_ARGS) { 228e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(args_flag == NULL); 2293bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org args_flag = f; // Must be last in arguments. 2303bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org continue; 2313bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org } 232f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org { 233f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org bool disabled = f->type() == Flag::TYPE_BOOL && !*f->bool_variable(); 234f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org OStringStream os; 235f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org os << (disabled ? "--no" : "--") << f->name(); 236f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org args->Add(StrDup(os.c_str())); 23743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 238b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org if (f->type() != Flag::TYPE_BOOL) { 239f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org OStringStream os; 240f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org os << *f; 241f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org args->Add(StrDup(os.c_str())); 24243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 24343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 24443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 2453bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org if (args_flag != NULL) { 246f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org OStringStream os; 247f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org os << "--" << args_flag->name(); 248f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org args->Add(StrDup(os.c_str())); 2493bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org JSArguments jsargs = *args_flag->args_variable(); 250528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org for (int j = 0; j < jsargs.argc; j++) { 251bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org args->Add(StrDup(jsargs[j])); 2523bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org } 2533bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org } 254b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org return args; 25543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 25643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 25743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 258ec6855e761a7474a580d750a45d748323dd3b7c7verwaest@chromium.orginline char NormalizeChar(char ch) { 259ec6855e761a7474a580d750a45d748323dd3b7c7verwaest@chromium.org return ch == '_' ? '-' : ch; 260ec6855e761a7474a580d750a45d748323dd3b7c7verwaest@chromium.org} 261ec6855e761a7474a580d750a45d748323dd3b7c7verwaest@chromium.org 262ec6855e761a7474a580d750a45d748323dd3b7c7verwaest@chromium.org 263b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org// Helper function to parse flags: Takes an argument arg and splits it into 264b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org// a flag name and flag value (or NULL if they are missing). is_bool is set 265b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org// if the arg started with "-no" or "--no". The buffer may be used to NUL- 266b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org// terminate the name, it must be large enough to hold any possible name. 267b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.orgstatic void SplitArgument(const char* arg, 268b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org char* buffer, 269b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org int buffer_size, 270b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org const char** name, 271b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org const char** value, 272b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org bool* is_bool) { 27343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *name = NULL; 27443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *value = NULL; 27543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *is_bool = false; 27643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 277a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org if (arg != NULL && *arg == '-') { 27843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // find the begin of the flag name 27943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen arg++; // remove 1st '-' 2803bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org if (*arg == '-') { 28143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen arg++; // remove 2nd '-' 2823bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org if (arg[0] == '\0') { 2833bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org const char* kJSArgumentsFlagName = "js_arguments"; 2843bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org *name = kJSArgumentsFlagName; 2853bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org return; 2863bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org } 2873bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org } 28843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (arg[0] == 'n' && arg[1] == 'o') { 28943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen arg += 2; // remove "no" 290ec6855e761a7474a580d750a45d748323dd3b7c7verwaest@chromium.org if (NormalizeChar(arg[0]) == '-') arg++; // remove dash after "no". 29143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *is_bool = true; 29243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 29343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *name = arg; 29443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 29543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // find the end of the flag name 29643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen while (*arg != '\0' && *arg != '=') 29743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen arg++; 29843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 29943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // get the value if any 30043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (*arg == '=') { 30143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // make a copy so we can NUL-terminate flag name 302c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org size_t n = arg - *name; 303c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org CHECK(n < static_cast<size_t>(buffer_size)); // buffer is too small 304d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org MemCopy(buffer, *name, n); 30543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen buffer[n] = '\0'; 30643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *name = buffer; 30743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // get the value 30843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *value = arg + 1; 30943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 31043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 31143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 31243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 31343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 314b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.orgstatic bool EqualNames(const char* a, const char* b) { 315b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org for (int i = 0; NormalizeChar(a[i]) == NormalizeChar(b[i]); i++) { 316b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org if (a[i] == '\0') { 317b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org return true; 318b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org } 319b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org } 320b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org return false; 321b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org} 322b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org 323b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org 324b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.orgstatic Flag* FindFlag(const char* name) { 325b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org for (size_t i = 0; i < num_flags; ++i) { 326b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org if (EqualNames(name, flags[i].name())) 327b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org return &flags[i]; 328b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org } 329b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org return NULL; 330b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org} 331b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org 332b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org 333b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org// static 33443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenint FlagList::SetFlagsFromCommandLine(int* argc, 33543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen char** argv, 336874aad37f2a832804012c6f56739f4fc6c9283cdmachenbach@chromium.org bool remove_flags) { 3375a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org int return_code = 0; 33843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // parse arguments 33943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen for (int i = 1; i < *argc;) { 34043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen int j = i; // j > 0 34143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen const char* arg = argv[i++]; 34243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 34343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // split arg into flag components 34443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen char buffer[1*KB]; 34543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen const char* name; 34643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen const char* value; 34743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen bool is_bool; 34843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen SplitArgument(arg, buffer, sizeof buffer, &name, &value, &is_bool); 34943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 35043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (name != NULL) { 35143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // lookup the flag 352b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org Flag* flag = FindFlag(name); 35343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (flag == NULL) { 3549a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com if (remove_flags) { 3559a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // We don't recognize this flag but since we're removing 3569a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // the flags we recognize we assume that the remaining flags 3579a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // will be processed somewhere else so this flag might make 3589a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // sense there. 3599a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com continue; 3609a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com } else { 361e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org PrintF(stderr, "Error: unrecognized flag %s\n" 362e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org "Try --help for options\n", arg); 3635a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org return_code = j; 3645a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org break; 3659a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com } 36643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 36743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 36843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // if we still need a flag value, use the next argument if available 3693bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org if (flag->type() != Flag::TYPE_BOOL && 370528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org flag->type() != Flag::TYPE_MAYBE_BOOL && 3713bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org flag->type() != Flag::TYPE_ARGS && 3723bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org value == NULL) { 37343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (i < *argc) { 37443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen value = argv[i++]; 375c991293cec054d5c30b1d34edcc32b521b905b2fmachenbach@chromium.org } 376c991293cec054d5c30b1d34edcc32b521b905b2fmachenbach@chromium.org if (!value) { 377e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org PrintF(stderr, "Error: missing value for flag %s of type %s\n" 378e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org "Try --help for options\n", 379e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org arg, Type2String(flag->type())); 3805a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org return_code = j; 3815a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org break; 38243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 38343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 38443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 38543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // set the flag 38643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen char* endp = const_cast<char*>(""); // *endp is only read 38743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen switch (flag->type()) { 388b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org case Flag::TYPE_BOOL: 38943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *flag->bool_variable() = !is_bool; 39043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen break; 391528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org case Flag::TYPE_MAYBE_BOOL: 392528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org *flag->maybe_bool_variable() = MaybeBoolFlag::Create(true, !is_bool); 393528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org break; 394b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org case Flag::TYPE_INT: 3959a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com *flag->int_variable() = strtol(value, &endp, 10); // NOLINT 39643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen break; 397b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org case Flag::TYPE_FLOAT: 39843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *flag->float_variable() = strtod(value, &endp); 39943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen break; 400b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org case Flag::TYPE_STRING: 40141826e77311db718135ef6517b846933dfd275f3ager@chromium.org flag->set_string_value(value ? StrDup(value) : NULL, true); 40243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen break; 4033bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org case Flag::TYPE_ARGS: { 4043bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org int start_pos = (value == NULL) ? i : i - 1; 4053bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org int js_argc = *argc - start_pos; 4063bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org const char** js_argv = NewArray<const char*>(js_argc); 4073bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org if (value != NULL) { 40841826e77311db718135ef6517b846933dfd275f3ager@chromium.org js_argv[0] = StrDup(value); 4093bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org } 4103bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org for (int k = i; k < *argc; k++) { 41141826e77311db718135ef6517b846933dfd275f3ager@chromium.org js_argv[k - start_pos] = StrDup(argv[k]); 4123bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org } 4131456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org *flag->args_variable() = JSArguments::Create(js_argc, js_argv); 4143bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org i = *argc; // Consume all arguments 4153bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org break; 4163bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org } 41743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 41843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 41943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // handle errors 420528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org bool is_bool_type = flag->type() == Flag::TYPE_BOOL || 421528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org flag->type() == Flag::TYPE_MAYBE_BOOL; 422528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org if ((is_bool_type && value != NULL) || (!is_bool_type && is_bool) || 42343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *endp != '\0') { 424e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org PrintF(stderr, "Error: illegal value for flag %s of type %s\n" 425e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org "Try --help for options\n", 426e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org arg, Type2String(flag->type())); 4275a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org return_code = j; 4285a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org break; 42943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 43043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 43143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // remove the flag & value from the command 4323bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org if (remove_flags) { 4333bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org while (j < i) { 43443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen argv[j++] = NULL; 4353bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org } 4363bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org } 43743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 43843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 43943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 44043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // shrink the argument list 44143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (remove_flags) { 44243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen int j = 1; 44343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen for (int i = 1; i < *argc; i++) { 44443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (argv[i] != NULL) 44543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen argv[j++] = argv[i]; 44643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 44743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *argc = j; 44843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 44943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 4503bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org if (FLAG_help) { 4513bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org PrintHelp(); 452245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org exit(0); 4533bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org } 45443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // parsed all flags successfully 4555a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org return return_code; 45643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 45743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 45843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 45943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenstatic char* SkipWhiteSpace(char* p) { 46043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen while (*p != '\0' && isspace(*p) != 0) p++; 46143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return p; 46243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 46343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 46443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 46543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenstatic char* SkipBlackSpace(char* p) { 46643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen while (*p != '\0' && isspace(*p) == 0) p++; 46743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return p; 46843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 46943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 47043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 471b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org// static 47243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenint FlagList::SetFlagsFromString(const char* str, int len) { 47343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // make a 0-terminated copy of str 474720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org ScopedVector<char> copy0(len + 1); 475d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org MemCopy(copy0.start(), str, len); 47643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen copy0[len] = '\0'; 47743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 47843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // strip leading white space 479720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org char* copy = SkipWhiteSpace(copy0.start()); 48043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 48143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // count the number of 'arguments' 48243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen int argc = 1; // be compatible with SetFlagsFromCommandLine() 48343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen for (char* p = copy; *p != '\0'; argc++) { 48443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen p = SkipBlackSpace(p); 48543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen p = SkipWhiteSpace(p); 48643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 48743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 48843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // allocate argument array 489720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org ScopedVector<char*> argv(argc); 49043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 49143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // split the flags string into arguments 49243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen argc = 1; // be compatible with SetFlagsFromCommandLine() 49343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen for (char* p = copy; *p != '\0'; argc++) { 49443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen argv[argc] = p; 49543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen p = SkipBlackSpace(p); 49643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (*p != '\0') *p++ = '\0'; // 0-terminate argument 49743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen p = SkipWhiteSpace(p); 49843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 49943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 50043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // set the flags 501720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org int result = SetFlagsFromCommandLine(&argc, argv.start(), false); 50243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 50343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return result; 50443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 50543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 50643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 507b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org// static 508b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.orgvoid FlagList::ResetAllFlags() { 509b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org for (size_t i = 0; i < num_flags; ++i) { 510b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org flags[i].Reset(); 511b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org } 512b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org} 513b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org 514b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org 515b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org// static 516b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.orgvoid FlagList::PrintHelp() { 517975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org CpuFeatures::Probe(false); 518e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org CpuFeatures::PrintTarget(); 519e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org CpuFeatures::PrintFeatures(); 520e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 521f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org OFStream os(stdout); 522f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org os << "Usage:\n" 523f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org << " shell [options] -e string\n" 524f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org << " execute string in V8\n" 525f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org << " shell [options] file1 file2 ... filek\n" 526f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org << " run JavaScript scripts in file1, file2, ..., filek\n" 527f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org << " shell [options]\n" 528f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org << " shell [options] --shell [file1 file2 ... filek]\n" 529f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org << " run an interactive JavaScript shell\n" 530f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org << " d8 [options] file1 file2 ... filek\n" 531f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org << " d8 [options]\n" 532f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org << " d8 [options] --shell [file1 file2 ... filek]\n" 533f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org << " run the new debugging shell\n\n" 534f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org << "Options:\n"; 535b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org for (size_t i = 0; i < num_flags; ++i) { 536b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org Flag* f = &flags[i]; 537f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org os << " --" << f->name() << " (" << f->comment() << ")\n" 538f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org << " type: " << Type2String(f->type()) << " default: " << *f 539f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org << "\n"; 540b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org } 54143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 54243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 5433bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org 544528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org// static 5457ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.orgvoid FlagList::EnforceFlagImplications() { 5467ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org#define FLAG_MODE_DEFINE_IMPLICATIONS 547196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/flag-definitions.h" 5482bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org#undef FLAG_MODE_DEFINE_IMPLICATIONS 5497ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org} 5507ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org 55143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} } // namespace v8::internal 552