1a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Copyright 2009 the V8 project authors. All rights reserved. 2a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Redistribution and use in source and binary forms, with or without 3a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// modification, are permitted provided that the following conditions are 4a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// met: 5a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 6a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// * Redistributions of source code must retain the above copyright 7a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// notice, this list of conditions and the following disclaimer. 8a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// * Redistributions in binary form must reproduce the above 9a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// copyright notice, this list of conditions and the following 10a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// disclaimer in the documentation and/or other materials provided 11a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// with the distribution. 12a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// * Neither the name of Google Inc. nor the names of its 13a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// contributors may be used to endorse or promote products derived 14a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// from this software without specific prior written permission. 15a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 16a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 28a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifndef V8_D8_H_ 29a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define V8_D8_H_ 30a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 31a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include "v8.h" 32a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include "hashmap.h" 33a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 34a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 35a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace v8 { 36a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 37a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 38a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace i = v8::internal; 39a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 40a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 41a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// A single counter in a counter collection. 42a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass Counter { 43a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 44a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kMaxNameSize = 64; 45a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int32_t* Bind(const char* name, bool histogram); 46a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int32_t* ptr() { return &count_; } 47a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int32_t count() { return count_; } 48a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int32_t sample_total() { return sample_total_; } 49a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bool is_histogram() { return is_histogram_; } 50a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void AddSample(int32_t sample); 51a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 52a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int32_t count_; 53a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int32_t sample_total_; 54a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bool is_histogram_; 55a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block uint8_t name_[kMaxNameSize]; 56a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 57a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 58a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 59a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// A set of counters and associated information. An instance of this 60a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// class is stored directly in the memory-mapped counters file if 61a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// the --map-counters options is used 62a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass CounterCollection { 63a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 64a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block CounterCollection(); 65a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Counter* GetNextCounter(); 66a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 67a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const unsigned kMaxCounters = 256; 68a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block uint32_t magic_number_; 69a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block uint32_t max_counters_; 70a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block uint32_t max_name_size_; 71a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block uint32_t counters_in_use_; 72a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Counter counters_[kMaxCounters]; 73a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 74a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 75a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 76a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass CounterMap { 77a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 78a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block CounterMap(): hash_map_(Match) { } 79a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Counter* Lookup(const char* name) { 80a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block i::HashMap::Entry* answer = hash_map_.Lookup( 81a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block const_cast<char*>(name), 82a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Hash(name), 83a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block false); 84a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (!answer) return NULL; 85a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return reinterpret_cast<Counter*>(answer->value); 86a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 87a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void Set(const char* name, Counter* value) { 88a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block i::HashMap::Entry* answer = hash_map_.Lookup( 89a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block const_cast<char*>(name), 90a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Hash(name), 91a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block true); 92a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(answer != NULL); 93a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block answer->value = value; 94a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 95a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block class Iterator { 96a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 97a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block explicit Iterator(CounterMap* map) 98a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block : map_(&map->hash_map_), entry_(map_->Start()) { } 99a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void Next() { entry_ = map_->Next(entry_); } 100a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bool More() { return entry_ != NULL; } 101a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block const char* CurrentKey() { return static_cast<const char*>(entry_->key); } 102a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Counter* CurrentValue() { return static_cast<Counter*>(entry_->value); } 103a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 104a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block i::HashMap* map_; 105a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block i::HashMap::Entry* entry_; 106a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block }; 107a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 108a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static int Hash(const char* name); 109a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static bool Match(void* key1, void* key2); 110a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block i::HashMap hash_map_; 111a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 112a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 113a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 114a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass Shell: public i::AllStatic { 115a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 116a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static bool ExecuteString(Handle<String> source, 117a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Handle<Value> name, 118a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bool print_result, 119a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bool report_exceptions); 1206ded16be15dd865a9b21ea304d5273c8be299c87Steve Block static const char* ToCString(const v8::String::Utf8Value& value); 121a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static void ReportException(TryCatch* try_catch); 122a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static void Initialize(); 123a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static void OnExit(); 124a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static int* LookupCounter(const char* name); 125a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static void* CreateHistogram(const char* name, 126a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int min, 127a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int max, 128a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block size_t buckets); 129a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static void AddHistogramSample(void* histogram, int sample); 130a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static void MapCounters(const char* name); 131a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static Handle<String> ReadFile(const char* name); 132a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static void RunShell(); 133a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static int Main(int argc, char* argv[]); 134a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static Handle<Array> GetCompletions(Handle<String> text, 135a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Handle<String> full); 136a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifdef ENABLE_DEBUGGER_SUPPORT 137a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static Handle<Object> DebugMessageDetails(Handle<String> message); 138a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static Handle<Value> DebugCommandToJSONRequest(Handle<String> command); 139a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif 140a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 141b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef WIN32 142b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#undef Yield 143b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif 144b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 145a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static Handle<Value> Print(const Arguments& args); 146a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static Handle<Value> Write(const Arguments& args); 147a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static Handle<Value> Yield(const Arguments& args); 148a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static Handle<Value> Quit(const Arguments& args); 149a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static Handle<Value> Version(const Arguments& args); 150a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static Handle<Value> Read(const Arguments& args); 151a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static Handle<Value> ReadLine(const Arguments& args); 152a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static Handle<Value> Load(const Arguments& args); 153a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // The OS object on the global object contains methods for performing 154a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // operating system calls: 155a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // 156a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // os.system("program_name", ["arg1", "arg2", ...], timeout1, timeout2) will 157a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // run the command, passing the arguments to the program. The standard output 158a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // of the program will be picked up and returned as a multiline string. If 159a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // timeout1 is present then it should be a number. -1 indicates no timeout 160a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // and a positive number is used as a timeout in milliseconds that limits the 161a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // time spent waiting between receiving output characters from the program. 162a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // timeout2, if present, should be a number indicating the limit in 163a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // milliseconds on the total running time of the program. Exceptions are 164a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // thrown on timeouts or other errors or if the exit status of the program 165a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // indicates an error. 166a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // 167a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // os.chdir(dir) changes directory to the given directory. Throws an 168a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // exception/ on error. 169a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // 170a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // os.setenv(variable, value) sets an environment variable. Repeated calls to 171a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // this method leak memory due to the API of setenv in the standard C library. 172a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // 173a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // os.umask(alue) calls the umask system call and returns the old umask. 174a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // 175a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // os.mkdirp(name, mask) creates a directory. The mask (if present) is anded 176a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // with the current umask. Intermediate directories are created if necessary. 177a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // An exception is not thrown if the directory already exists. Analogous to 178a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // the "mkdir -p" command. 179a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static Handle<Value> OSObject(const Arguments& args); 180a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static Handle<Value> System(const Arguments& args); 181a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static Handle<Value> ChangeDirectory(const Arguments& args); 182a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static Handle<Value> SetEnvironment(const Arguments& args); 1836ded16be15dd865a9b21ea304d5273c8be299c87Steve Block static Handle<Value> UnsetEnvironment(const Arguments& args); 184a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static Handle<Value> SetUMask(const Arguments& args); 185a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static Handle<Value> MakeDirectory(const Arguments& args); 186a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static Handle<Value> RemoveDirectory(const Arguments& args); 187a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 188a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static void AddOSMethods(Handle<ObjectTemplate> os_template); 189a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 190a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static Handle<Context> utility_context() { return utility_context_; } 191a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 192a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const char* kHistoryFileName; 193a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const char* kPrompt; 194a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 195a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static Persistent<Context> utility_context_; 196a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static Persistent<Context> evaluation_context_; 197a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static CounterMap* counter_map_; 198a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // We statically allocate a set of local counters to be used if we 199a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // don't want to store the stats in a memory-mapped file 200a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static CounterCollection local_counters_; 201a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static CounterCollection* counters_; 202a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static i::OS::MemoryMappedFile* counters_file_; 203a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static Counter* GetCounter(const char* name, bool is_histogram); 204a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 205a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 206a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 207a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass LineEditor { 208a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 209a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block enum Type { DUMB = 0, READLINE = 1 }; 210a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block LineEditor(Type type, const char* name); 211a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block virtual ~LineEditor() { } 212a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 213a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block virtual i::SmartPointer<char> Prompt(const char* prompt) = 0; 214a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block virtual bool Open() { return true; } 215a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block virtual bool Close() { return true; } 216a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block virtual void AddHistory(const char* str) { } 217a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 218a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block const char* name() { return name_; } 219a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static LineEditor* Get(); 220a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 221a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Type type_; 222a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block const char* name_; 223a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block LineEditor* next_; 224a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static LineEditor* first_; 225a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 226a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 227a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 228a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} // namespace v8 229a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 230a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 231a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif // V8_D8_H_ 232