13ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Copyright 2012 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 3169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch#ifndef V8_SHARED 323fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch#include "allocation.h" 33a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include "hashmap.h" 34589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch#include "smart-array-pointer.h" 35589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch#include "v8.h" 363fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch#else 373fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch#include "../include/v8.h" 3869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch#endif // V8_SHARED 39a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 40a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace v8 { 41a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 42a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch#ifndef V8_SHARED 44a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// A single counter in a counter collection. 45a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass Counter { 46a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 47a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kMaxNameSize = 64; 48a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int32_t* Bind(const char* name, bool histogram); 49a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int32_t* ptr() { return &count_; } 50a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int32_t count() { return count_; } 51a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int32_t sample_total() { return sample_total_; } 52a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bool is_histogram() { return is_histogram_; } 53a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void AddSample(int32_t sample); 54a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 55a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int32_t count_; 56a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int32_t sample_total_; 57a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bool is_histogram_; 58a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block uint8_t name_[kMaxNameSize]; 59a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 60a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 61a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 62a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// A set of counters and associated information. An instance of this 63a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// class is stored directly in the memory-mapped counters file if 64a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// the --map-counters options is used 65a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass CounterCollection { 66a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 67a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block CounterCollection(); 68a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Counter* GetNextCounter(); 69a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 70a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const unsigned kMaxCounters = 256; 71a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block uint32_t magic_number_; 72a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block uint32_t max_counters_; 73a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block uint32_t max_name_size_; 74a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block uint32_t counters_in_use_; 75a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Counter counters_[kMaxCounters]; 76a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 77a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 78a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 79a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass CounterMap { 80a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 81a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block CounterMap(): hash_map_(Match) { } 82a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Counter* Lookup(const char* name) { 83a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block i::HashMap::Entry* answer = hash_map_.Lookup( 84a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block const_cast<char*>(name), 85a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Hash(name), 86a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block false); 87a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (!answer) return NULL; 88a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return reinterpret_cast<Counter*>(answer->value); 89a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 90a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void Set(const char* name, Counter* value) { 91a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block i::HashMap::Entry* answer = hash_map_.Lookup( 92a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block const_cast<char*>(name), 93a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Hash(name), 94a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block true); 95a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(answer != NULL); 96a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block answer->value = value; 97a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 98a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block class Iterator { 99a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 100a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block explicit Iterator(CounterMap* map) 101a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block : map_(&map->hash_map_), entry_(map_->Start()) { } 102a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void Next() { entry_ = map_->Next(entry_); } 103a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bool More() { return entry_ != NULL; } 104a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block const char* CurrentKey() { return static_cast<const char*>(entry_->key); } 105a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Counter* CurrentValue() { return static_cast<Counter*>(entry_->value); } 106a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 107a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block i::HashMap* map_; 108a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block i::HashMap::Entry* entry_; 109a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block }; 1103fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 111a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 112a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static int Hash(const char* name); 113a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static bool Match(void* key1, void* key2); 114a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block i::HashMap hash_map_; 115a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 11669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch#endif // V8_SHARED 117a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 118a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 119589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdochclass LineEditor { 120589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch public: 121589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch enum Type { DUMB = 0, READLINE = 1 }; 122589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch LineEditor(Type type, const char* name); 123589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch virtual ~LineEditor() { } 124589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 1253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Handle<String> Prompt(const char* prompt) = 0; 126589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch virtual bool Open() { return true; } 127589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch virtual bool Close() { return true; } 128589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch virtual void AddHistory(const char* str) { } 129589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 130589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch const char* name() { return name_; } 131589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch static LineEditor* Get(); 132589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch private: 133589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch Type type_; 134589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch const char* name_; 135589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch LineEditor* next_; 136589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch static LineEditor* first_; 137589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch}; 138589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 139589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 1403fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass SourceGroup { 1413fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch public: 1423fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SourceGroup() : 14369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch#ifndef V8_SHARED 1443fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch next_semaphore_(v8::internal::OS::CreateSemaphore(0)), 1453fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch done_semaphore_(v8::internal::OS::CreateSemaphore(0)), 1463fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch thread_(NULL), 14769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch#endif // V8_SHARED 1483fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch argv_(NULL), 1493fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch begin_offset_(0), 150589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch end_offset_(0) {} 151589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 152589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch ~SourceGroup(); 1533fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1543fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch void Begin(char** argv, int offset) { 1553fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch argv_ = const_cast<const char**>(argv); 1563fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch begin_offset_ = offset; 1573fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 1583fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1593fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch void End(int offset) { end_offset_ = offset; } 1603fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1613fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch void Execute(); 1623fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 16369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch#ifndef V8_SHARED 1643fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch void StartExecuteInThread(); 1653fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch void WaitForThread(); 1663fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1673fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch private: 1683fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch class IsolateThread : public i::Thread { 1693fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch public: 1703fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch explicit IsolateThread(SourceGroup* group) 1713fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : i::Thread(GetThreadOptions()), group_(group) {} 1723fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1733fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch virtual void Run() { 1743fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch group_->ExecuteInThread(); 1753fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 1763fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1773fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch private: 1783fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SourceGroup* group_; 1793fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch }; 1803fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1813fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch static i::Thread::Options GetThreadOptions(); 1823fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch void ExecuteInThread(); 1833fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1843fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch i::Semaphore* next_semaphore_; 1853fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch i::Semaphore* done_semaphore_; 1863fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch i::Thread* thread_; 18769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch#endif // V8_SHARED 1883fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1893fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch void ExitShell(int exit_code); 1903fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch Handle<String> ReadFile(const char* name); 1913fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1923fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch const char** argv_; 1933fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch int begin_offset_; 1943fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch int end_offset_; 1953fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}; 1963fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1973fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass BinaryResource : public v8::String::ExternalAsciiStringResource { 1993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public: 2003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch BinaryResource(const char* string, int length) 2013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch : data_(string), 2023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch length_(length) { } 2033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ~BinaryResource() { 2053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch delete[] data_; 2063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch data_ = NULL; 2073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch length_ = 0; 2083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 2093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual const char* data() const { return data_; } 2113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual size_t length() const { return length_; } 2123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch private: 2143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch const char* data_; 2153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch size_t length_; 2163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 2173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2193fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass ShellOptions { 2203fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch public: 2213fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch ShellOptions() : 22269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch#ifndef V8_SHARED 2233fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch use_preemption(true), 2243fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch preemption_interval(10), 225589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch num_parallel_files(0), 2263fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch parallel_files(NULL), 22769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch#endif // V8_SHARED 2283fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch script_executed(false), 2293fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch last_run(true), 2303fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch stress_opt(false), 2313fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch stress_deopt(false), 2323fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch interactive_shell(false), 2333fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch test_shell(false), 2343fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch num_isolates(1), 2353fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch isolate_sources(NULL) { } 2363fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 237589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch ~ShellOptions() { 238589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch#ifndef V8_SHARED 239589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch delete[] parallel_files; 240589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch#endif // V8_SHARED 241589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch delete[] isolate_sources; 242589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch } 243589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 24469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch#ifndef V8_SHARED 2453fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch bool use_preemption; 2463fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch int preemption_interval; 247589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch int num_parallel_files; 248589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch char** parallel_files; 24969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch#endif // V8_SHARED 2503fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch bool script_executed; 2513fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch bool last_run; 2523fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch bool stress_opt; 2533fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch bool stress_deopt; 2543fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch bool interactive_shell; 2553fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch bool test_shell; 2563fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch int num_isolates; 2573fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SourceGroup* isolate_sources; 2583fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}; 2593fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 26069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch#ifdef V8_SHARED 2613fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass Shell { 2623fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch#else 2633fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass Shell : public i::AllStatic { 26469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch#endif // V8_SHARED 265589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 266a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 267a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static bool ExecuteString(Handle<String> source, 268a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Handle<Value> name, 269a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bool print_result, 270a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bool report_exceptions); 2716ded16be15dd865a9b21ea304d5273c8be299c87Steve Block static const char* ToCString(const v8::String::Utf8Value& value); 272a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static void ReportException(TryCatch* try_catch); 2733fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch static Handle<String> ReadFile(const char* name); 2743fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch static Persistent<Context> CreateEvaluationContext(); 2753fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch static int RunMain(int argc, char* argv[]); 2763fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch static int Main(int argc, char* argv[]); 277589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch static void Exit(int exit_code); 2783fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 27969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch#ifndef V8_SHARED 2803fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch static Handle<Array> GetCompletions(Handle<String> text, 2813fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch Handle<String> full); 282a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static void OnExit(); 283a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static int* LookupCounter(const char* name); 284a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static void* CreateHistogram(const char* name, 285a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int min, 286a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int max, 287a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block size_t buckets); 288a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static void AddHistogramSample(void* histogram, int sample); 289a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static void MapCounters(const char* name); 2903fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 291a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifdef ENABLE_DEBUGGER_SUPPORT 292a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static Handle<Object> DebugMessageDetails(Handle<String> message); 293a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static Handle<Value> DebugCommandToJSONRequest(Handle<String> command); 2943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static void DispatchDebugMessages(); 2953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#endif // ENABLE_DEBUGGER_SUPPORT 2963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#endif // V8_SHARED 297a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 298b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef WIN32 299b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#undef Yield 300b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif 301b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 302a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static Handle<Value> Print(const Arguments& args); 303a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static Handle<Value> Write(const Arguments& args); 304a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static Handle<Value> Yield(const Arguments& args); 305a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static Handle<Value> Quit(const Arguments& args); 306a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static Handle<Value> Version(const Arguments& args); 307589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch static Handle<Value> EnableProfiler(const Arguments& args); 308589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch static Handle<Value> DisableProfiler(const Arguments& args); 309a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static Handle<Value> Read(const Arguments& args); 3103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static Handle<Value> ReadBinary(const Arguments& args); 3113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static Handle<String> ReadFromStdin(); 3123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static Handle<Value> ReadLine(const Arguments& args) { 3133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return ReadFromStdin(); 3143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 315a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static Handle<Value> Load(const Arguments& args); 3163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static Handle<Value> ArrayBuffer(const Arguments& args); 3173fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch static Handle<Value> Int8Array(const Arguments& args); 3183fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch static Handle<Value> Uint8Array(const Arguments& args); 3193fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch static Handle<Value> Int16Array(const Arguments& args); 3203fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch static Handle<Value> Uint16Array(const Arguments& args); 3213fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch static Handle<Value> Int32Array(const Arguments& args); 3223fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch static Handle<Value> Uint32Array(const Arguments& args); 3233fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch static Handle<Value> Float32Array(const Arguments& args); 3243fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch static Handle<Value> Float64Array(const Arguments& args); 3253fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch static Handle<Value> PixelArray(const Arguments& args); 326a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // The OS object on the global object contains methods for performing 327a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // operating system calls: 328a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // 329a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // os.system("program_name", ["arg1", "arg2", ...], timeout1, timeout2) will 330a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // run the command, passing the arguments to the program. The standard output 331a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // of the program will be picked up and returned as a multiline string. If 332a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // timeout1 is present then it should be a number. -1 indicates no timeout 333a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // and a positive number is used as a timeout in milliseconds that limits the 334a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // time spent waiting between receiving output characters from the program. 335a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // timeout2, if present, should be a number indicating the limit in 336a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // milliseconds on the total running time of the program. Exceptions are 337a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // thrown on timeouts or other errors or if the exit status of the program 338a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // indicates an error. 339a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // 340a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // os.chdir(dir) changes directory to the given directory. Throws an 341a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // exception/ on error. 342a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // 343a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // os.setenv(variable, value) sets an environment variable. Repeated calls to 344a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // this method leak memory due to the API of setenv in the standard C library. 345a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // 346a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // os.umask(alue) calls the umask system call and returns the old umask. 347a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // 348a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // os.mkdirp(name, mask) creates a directory. The mask (if present) is anded 349a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // with the current umask. Intermediate directories are created if necessary. 350a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // An exception is not thrown if the directory already exists. Analogous to 351a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // the "mkdir -p" command. 352a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static Handle<Value> OSObject(const Arguments& args); 353a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static Handle<Value> System(const Arguments& args); 354a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static Handle<Value> ChangeDirectory(const Arguments& args); 355a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static Handle<Value> SetEnvironment(const Arguments& args); 3566ded16be15dd865a9b21ea304d5273c8be299c87Steve Block static Handle<Value> UnsetEnvironment(const Arguments& args); 357a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static Handle<Value> SetUMask(const Arguments& args); 358a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static Handle<Value> MakeDirectory(const Arguments& args); 359a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static Handle<Value> RemoveDirectory(const Arguments& args); 360a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 361a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static void AddOSMethods(Handle<ObjectTemplate> os_template); 3623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 363589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch static LineEditor* console; 364a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const char* kPrompt; 3653fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch static ShellOptions options; 3663fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 367a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 368a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static Persistent<Context> evaluation_context_; 36969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch#ifndef V8_SHARED 3703fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch static Persistent<Context> utility_context_; 371a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static CounterMap* counter_map_; 372a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // We statically allocate a set of local counters to be used if we 373a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // don't want to store the stats in a memory-mapped file 374a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static CounterCollection local_counters_; 375a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static CounterCollection* counters_; 376a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static i::OS::MemoryMappedFile* counters_file_; 3773fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch static i::Mutex* context_mutex_; 3783fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 379a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static Counter* GetCounter(const char* name, bool is_histogram); 3803fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch static void InstallUtilityScript(); 38169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch#endif // V8_SHARED 3823fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch static void Initialize(); 3833fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch static void RunShell(); 3843fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch static bool SetOptions(int argc, char* argv[]); 3853fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch static Handle<ObjectTemplate> CreateGlobalTemplate(); 3863fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch static Handle<Value> CreateExternalArray(const Arguments& args, 3873fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch ExternalArrayType type, 3883fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch size_t element_size); 3893fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch static void ExternalArrayWeakCallback(Persistent<Value> object, void* data); 390a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 391a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 392a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 393a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} // namespace v8 394a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 395a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 396a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif // V8_D8_H_ 397