| // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file | 
 | // for details. All rights reserved. Use of this source code is governed by a | 
 | // BSD-style license that can be found in the LICENSE file. | 
 |  | 
 | #ifndef RUNTIME_VM_FLAGS_H_ | 
 | #define RUNTIME_VM_FLAGS_H_ | 
 |  | 
 | #include "platform/assert.h" | 
 | #include "vm/flag_list.h" | 
 | #include "vm/globals.h" | 
 |  | 
 | typedef const char* charp; | 
 |  | 
 | #define DECLARE_FLAG(type, name) extern type FLAG_##name | 
 |  | 
 | #define DEFINE_FLAG(type, name, default_value, comment)                        \ | 
 |   type FLAG_##name =                                                           \ | 
 |       Flags::Register_##type(&FLAG_##name, #name, default_value, comment); | 
 |  | 
 | #define DEFINE_FLAG_HANDLER(handler, name, comment)                            \ | 
 |   bool DUMMY_##name = Flags::RegisterFlagHandler(handler, #name, comment); | 
 |  | 
 | #define DEFINE_OPTION_HANDLER(handler, name, comment)                          \ | 
 |   bool DUMMY_##name = Flags::RegisterOptionHandler(handler, #name, comment); | 
 |  | 
 | namespace dart { | 
 |  | 
 | typedef void (*FlagHandler)(bool value); | 
 | typedef void (*OptionHandler)(const char* value); | 
 |  | 
 | // Forward declarations. | 
 | class Flag; | 
 | class JSONArray; | 
 | class JSONStream; | 
 |  | 
 | class Flags { | 
 |  public: | 
 |   static bool Register_bool(bool* addr, | 
 |                             const char* name, | 
 |                             bool default_value, | 
 |                             const char* comment); | 
 |  | 
 |   static int Register_int(int* addr, | 
 |                           const char* name, | 
 |                           int default_value, | 
 |                           const char* comment); | 
 |  | 
 |   static uint64_t Register_uint64_t(uint64_t* addr, | 
 |                                     const char* name, | 
 |                                     uint64_t default_value, | 
 |                                     const char* comment); | 
 |  | 
 |   static const char* Register_charp(charp* addr, | 
 |                                     const char* name, | 
 |                                     const char* default_value, | 
 |                                     const char* comment); | 
 |  | 
 |   static bool RegisterFlagHandler(FlagHandler handler, | 
 |                                   const char* name, | 
 |                                   const char* comment); | 
 |  | 
 |   static bool RegisterOptionHandler(OptionHandler handler, | 
 |                                     const char* name, | 
 |                                     const char* comment); | 
 |  | 
 |   static char* ProcessCommandLineFlags(int argc, const char** argv); | 
 |  | 
 |   static Flag* Lookup(const char* name); | 
 |  | 
 |   static bool IsSet(const char* name); | 
 |  | 
 |   static bool Initialized() { return initialized_; } | 
 |  | 
 |   static void Cleanup(); | 
 |  | 
 | #ifndef PRODUCT | 
 |   static void PrintJSON(JSONStream* js); | 
 | #endif  // !PRODUCT | 
 |  | 
 |   static bool SetFlag(const char* name, const char* value, const char** error); | 
 |  | 
 |  private: | 
 |   static Flag** flags_; | 
 |   static intptr_t capacity_; | 
 |   static intptr_t num_flags_; | 
 |  | 
 |   static bool initialized_; | 
 |  | 
 |   static void AddFlag(Flag* flag); | 
 |  | 
 |   static bool SetFlagFromString(Flag* flag, const char* argument); | 
 |  | 
 |   static void Parse(const char* option); | 
 |  | 
 |   static int CompareFlagNames(const void* left, const void* right); | 
 |  | 
 |   static void PrintFlags(); | 
 |  | 
 | #ifndef PRODUCT | 
 |   static void PrintFlagToJSONArray(JSONArray* jsarr, const Flag* flag); | 
 | #endif  // !PRODUCT | 
 |  | 
 |   // Testing needs direct access to private methods. | 
 |   friend void Dart_TestParseFlags(); | 
 |  | 
 |   DISALLOW_ALLOCATION(); | 
 |   DISALLOW_IMPLICIT_CONSTRUCTORS(Flags); | 
 | }; | 
 |  | 
 | #define PRODUCT_FLAG_MACRO(name, type, default_value, comment)                 \ | 
 |   extern type FLAG_##name; | 
 |  | 
 | #if defined(DEBUG) | 
 | #define DEBUG_FLAG_MACRO(name, type, default_value, comment)                   \ | 
 |   extern type FLAG_##name; | 
 | #else  // defined(DEBUG) | 
 | #define DEBUG_FLAG_MACRO(name, type, default_value, comment)                   \ | 
 |   const type FLAG_##name = default_value; | 
 | #endif  // defined(DEBUG) | 
 |  | 
 | #if defined(PRODUCT) && defined(DART_PRECOMPILED_RUNTIME) | 
 | #define RELEASE_FLAG_MACRO(name, product_value, type, default_value, comment)  \ | 
 |   const type FLAG_##name = product_value; | 
 | #define PRECOMPILE_FLAG_MACRO(name, precompiled_value, product_value, type,    \ | 
 |                               default_value, comment)                          \ | 
 |   const type FLAG_##name = precompiled_value; | 
 |  | 
 | #elif defined(PRODUCT)  // !PRECOMPILED | 
 | #define RELEASE_FLAG_MACRO(name, product_value, type, default_value, comment)  \ | 
 |   const type FLAG_##name = product_value; | 
 | #define PRECOMPILE_FLAG_MACRO(name, precompiled_value, product_value, type,    \ | 
 |                               default_value, comment)                          \ | 
 |   const type FLAG_##name = product_value; | 
 |  | 
 | #elif defined(DART_PRECOMPILED_RUNTIME)  // !PRODUCT | 
 | #define RELEASE_FLAG_MACRO(name, product_value, type, default_value, comment)  \ | 
 |   extern type FLAG_##name; | 
 | #define PRECOMPILE_FLAG_MACRO(name, precompiled_value, product_value, type,    \ | 
 |                               default_value, comment)                          \ | 
 |   const type FLAG_##name = precompiled_value; | 
 |  | 
 | #else  // !PRODUCT && !PRECOMPILED | 
 | #define RELEASE_FLAG_MACRO(name, product_value, type, default_value, comment)  \ | 
 |   extern type FLAG_##name; | 
 | #define PRECOMPILE_FLAG_MACRO(name, precompiled_value, product_value, type,    \ | 
 |                               default_value, comment)                          \ | 
 |   extern type FLAG_##name; | 
 |  | 
 | #endif | 
 |  | 
 | // Now declare all flags here. | 
 | FLAG_LIST(PRODUCT_FLAG_MACRO, | 
 |           RELEASE_FLAG_MACRO, | 
 |           PRECOMPILE_FLAG_MACRO, | 
 |           DEBUG_FLAG_MACRO) | 
 |  | 
 | #undef RELEASE_FLAG_MACRO | 
 | #undef DEBUG_FLAG_MACRO | 
 | #undef PRODUCT_FLAG_MACRO | 
 | #undef PRECOMPILE_FLAG_MACRO | 
 |  | 
 | }  // namespace dart | 
 |  | 
 | #endif  // RUNTIME_VM_FLAGS_H_ |