13ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Copyright 2012 the V8 project authors. All rights reserved. 2b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// found in the LICENSE file. 4a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifndef V8_D8_H_ 6a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define V8_D8_H_ 7a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch#ifndef V8_SHARED 9b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/allocation.h" 10b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/hashmap.h" 11b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/smart-pointers.h" 12b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/v8.h" 133fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch#else 14b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "include/v8.h" 15b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/base/compiler-specific.h" 16b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif // !V8_SHARED 17a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 18a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace v8 { 19a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 20a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch#ifndef V8_SHARED 22a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// A single counter in a counter collection. 23a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass Counter { 24a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 25a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kMaxNameSize = 64; 26a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int32_t* Bind(const char* name, bool histogram); 27a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int32_t* ptr() { return &count_; } 28a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int32_t count() { return count_; } 29a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int32_t sample_total() { return sample_total_; } 30a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bool is_histogram() { return is_histogram_; } 31a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void AddSample(int32_t sample); 32a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 33a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int32_t count_; 34a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int32_t sample_total_; 35a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bool is_histogram_; 36a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block uint8_t name_[kMaxNameSize]; 37a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 38a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 39a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 40a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// A set of counters and associated information. An instance of this 41a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// class is stored directly in the memory-mapped counters file if 42a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// the --map-counters options is used 43a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass CounterCollection { 44a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 45a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block CounterCollection(); 46a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Counter* GetNextCounter(); 47a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 48b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const unsigned kMaxCounters = 512; 49a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block uint32_t magic_number_; 50a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block uint32_t max_counters_; 51a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block uint32_t max_name_size_; 52a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block uint32_t counters_in_use_; 53a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Counter counters_[kMaxCounters]; 54a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 55a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 56a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 57a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass CounterMap { 58a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 59a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block CounterMap(): hash_map_(Match) { } 60a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Counter* Lookup(const char* name) { 61a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block i::HashMap::Entry* answer = hash_map_.Lookup( 62a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block const_cast<char*>(name), 63a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Hash(name), 64a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block false); 65a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (!answer) return NULL; 66a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return reinterpret_cast<Counter*>(answer->value); 67a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 68a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void Set(const char* name, Counter* value) { 69a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block i::HashMap::Entry* answer = hash_map_.Lookup( 70a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block const_cast<char*>(name), 71a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Hash(name), 72a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block true); 73b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(answer != NULL); 74a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block answer->value = value; 75a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 76a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block class Iterator { 77a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 78a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block explicit Iterator(CounterMap* map) 79a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block : map_(&map->hash_map_), entry_(map_->Start()) { } 80a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void Next() { entry_ = map_->Next(entry_); } 81a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bool More() { return entry_ != NULL; } 82a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block const char* CurrentKey() { return static_cast<const char*>(entry_->key); } 83a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Counter* CurrentValue() { return static_cast<Counter*>(entry_->value); } 84a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 85a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block i::HashMap* map_; 86a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block i::HashMap::Entry* entry_; 87a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block }; 883fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 89a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 90a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static int Hash(const char* name); 91a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static bool Match(void* key1, void* key2); 92a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block i::HashMap hash_map_; 93a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 94b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif // !V8_SHARED 95a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 96a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 97589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdochclass LineEditor { 98589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch public: 99589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch enum Type { DUMB = 0, READLINE = 1 }; 100589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch LineEditor(Type type, const char* name); 101589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch virtual ~LineEditor() { } 102589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 1033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Handle<String> Prompt(const char* prompt) = 0; 104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool Open(Isolate* isolate) { return true; } 105589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch virtual bool Close() { return true; } 106589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch virtual void AddHistory(const char* str) { } 107589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 108589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch const char* name() { return name_; } 109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static LineEditor* Get() { return current_; } 110589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch private: 111589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch Type type_; 112589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch const char* name_; 113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static LineEditor* current_; 114589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch}; 115589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 116589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 1173fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass SourceGroup { 1183fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch public: 1193fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SourceGroup() : 12069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch#ifndef V8_SHARED 121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch next_semaphore_(0), 122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch done_semaphore_(0), 1233fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch thread_(NULL), 124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif // !V8_SHARED 1253fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch argv_(NULL), 1263fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch begin_offset_(0), 127589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch end_offset_(0) {} 128589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 129589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch ~SourceGroup(); 1303fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1313fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch void Begin(char** argv, int offset) { 1323fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch argv_ = const_cast<const char**>(argv); 1333fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch begin_offset_ = offset; 1343fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 1353fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1363fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch void End(int offset) { end_offset_ = offset; } 1373fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void Execute(Isolate* isolate); 1393fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 14069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch#ifndef V8_SHARED 1413fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch void StartExecuteInThread(); 1423fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch void WaitForThread(); 1433fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1443fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch private: 145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class IsolateThread : public base::Thread { 1463fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch public: 1473fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch explicit IsolateThread(SourceGroup* group) 148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : base::Thread(GetThreadOptions()), group_(group) {} 1493fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1503fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch virtual void Run() { 1513fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch group_->ExecuteInThread(); 1523fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 1533fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1543fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch private: 1553fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SourceGroup* group_; 1563fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch }; 1573fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static base::Thread::Options GetThreadOptions(); 1593fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch void ExecuteInThread(); 1603fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch base::Semaphore next_semaphore_; 162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch base::Semaphore done_semaphore_; 163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch base::Thread* thread_; 164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif // !V8_SHARED 1653fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1663fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch void ExitShell(int exit_code); 167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<String> ReadFile(Isolate* isolate, const char* name); 1683fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1693fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch const char** argv_; 1703fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch int begin_offset_; 1713fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch int end_offset_; 1723fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}; 1733fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1743fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass BinaryResource : public v8::String::ExternalOneByteStringResource { 1763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public: 1773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch BinaryResource(const char* string, int length) 1783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch : data_(string), 1793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch length_(length) { } 1803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ~BinaryResource() { 1823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch delete[] data_; 1833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch data_ = NULL; 1843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch length_ = 0; 1853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 1863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual const char* data() const { return data_; } 1883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual size_t length() const { return length_; } 1893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch private: 1913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch const char* data_; 1923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch size_t length_; 1933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 1943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1963fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass ShellOptions { 1973fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch public: 198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ShellOptions() 199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : script_executed(false), 200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch last_run(true), 201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch send_idle_notification(false), 202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch invoke_weak_callbacks(false), 203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch stress_opt(false), 204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch stress_deopt(false), 205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch interactive_shell(false), 206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch test_shell(false), 207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch dump_heap_constants(false), 208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch expected_to_throw(false), 209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch mock_arraybuffer_allocator(false), 210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch num_isolates(1), 211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch compile_options(v8::ScriptCompiler::kNoCompileOptions), 212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch isolate_sources(NULL), 213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch icu_data_file(NULL), 214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch natives_blob(NULL), 215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch snapshot_blob(NULL) {} 2163fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 217589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch ~ShellOptions() { 218589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch delete[] isolate_sources; 219589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch } 220589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool use_interactive_shell() { 222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return (interactive_shell || !script_executed) && !test_shell; 223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2253fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch bool script_executed; 2263fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch bool last_run; 227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool send_idle_notification; 228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool invoke_weak_callbacks; 2293fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch bool stress_opt; 2303fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch bool stress_deopt; 2313fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch bool interactive_shell; 2323fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch bool test_shell; 233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool dump_heap_constants; 234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool expected_to_throw; 235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool mock_arraybuffer_allocator; 2363fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch int num_isolates; 237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch v8::ScriptCompiler::CompileOptions compile_options; 2383fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SourceGroup* isolate_sources; 239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const char* icu_data_file; 240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const char* natives_blob; 241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const char* snapshot_blob; 2423fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}; 2433fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 24469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch#ifdef V8_SHARED 2453fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass Shell { 2463fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch#else 2473fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass Shell : public i::AllStatic { 24869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch#endif // V8_SHARED 249589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 250a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Local<UnboundScript> CompileString( 252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Isolate* isolate, Local<String> source, Local<Value> name, 253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch v8::ScriptCompiler::CompileOptions compile_options); 254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static bool ExecuteString(Isolate* isolate, 255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<String> source, 256a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Handle<Value> name, 257a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bool print_result, 258a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bool report_exceptions); 2596ded16be15dd865a9b21ea304d5273c8be299c87Steve Block static const char* ToCString(const v8::String::Utf8Value& value); 260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void ReportException(Isolate* isolate, TryCatch* try_catch); 261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<String> ReadFile(Isolate* isolate, const char* name); 262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Local<Context> CreateEvaluationContext(Isolate* isolate); 263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static int RunMain(Isolate* isolate, int argc, char* argv[]); 2643fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch static int Main(int argc, char* argv[]); 265589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch static void Exit(int exit_code); 266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void OnExit(); 2673fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 26869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch#ifndef V8_SHARED 269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<Array> GetCompletions(Isolate* isolate, 270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<String> text, 2713fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch Handle<String> full); 272a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static int* LookupCounter(const char* name); 273a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static void* CreateHistogram(const char* name, 274a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int min, 275a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int max, 276a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block size_t buckets); 277a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static void AddHistogramSample(void* histogram, int sample); 278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void MapCounters(v8::Isolate* isolate, const char* name); 279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Local<Object> DebugMessageDetails(Isolate* isolate, 281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<String> message); 282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Local<Value> DebugCommandToJSONRequest(Isolate* isolate, 283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<String> command); 284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void PerformanceNow(const v8::FunctionCallbackInfo<v8::Value>& args); 286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif // !V8_SHARED 287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 288b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void RealmCurrent(const v8::FunctionCallbackInfo<v8::Value>& args); 289b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void RealmOwner(const v8::FunctionCallbackInfo<v8::Value>& args); 290b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void RealmGlobal(const v8::FunctionCallbackInfo<v8::Value>& args); 291b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void RealmCreate(const v8::FunctionCallbackInfo<v8::Value>& args); 292b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void RealmDispose(const v8::FunctionCallbackInfo<v8::Value>& args); 293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void RealmSwitch(const v8::FunctionCallbackInfo<v8::Value>& args); 294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void RealmEval(const v8::FunctionCallbackInfo<v8::Value>& args); 295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void RealmSharedGet(Local<String> property, 296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const PropertyCallbackInfo<Value>& info); 297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void RealmSharedSet(Local<String> property, 298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Local<Value> value, 299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const PropertyCallbackInfo<void>& info); 300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void Print(const v8::FunctionCallbackInfo<v8::Value>& args); 302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void Write(const v8::FunctionCallbackInfo<v8::Value>& args); 303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void Quit(const v8::FunctionCallbackInfo<v8::Value>& args); 304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void Version(const v8::FunctionCallbackInfo<v8::Value>& args); 305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void Read(const v8::FunctionCallbackInfo<v8::Value>& args); 306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void ReadBuffer(const v8::FunctionCallbackInfo<v8::Value>& args); 307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<String> ReadFromStdin(Isolate* isolate); 308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void ReadLine(const v8::FunctionCallbackInfo<v8::Value>& args) { 309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch args.GetReturnValue().Set(ReadFromStdin(args.GetIsolate())); 3103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void Load(const v8::FunctionCallbackInfo<v8::Value>& args); 312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void ArrayBuffer(const v8::FunctionCallbackInfo<v8::Value>& args); 313b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void Int8Array(const v8::FunctionCallbackInfo<v8::Value>& args); 314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void Uint8Array(const v8::FunctionCallbackInfo<v8::Value>& args); 315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void Int16Array(const v8::FunctionCallbackInfo<v8::Value>& args); 316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void Uint16Array(const v8::FunctionCallbackInfo<v8::Value>& args); 317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void Int32Array(const v8::FunctionCallbackInfo<v8::Value>& args); 318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void Uint32Array(const v8::FunctionCallbackInfo<v8::Value>& args); 319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void Float32Array(const v8::FunctionCallbackInfo<v8::Value>& args); 320b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void Float64Array(const v8::FunctionCallbackInfo<v8::Value>& args); 321b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void Uint8ClampedArray( 322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const v8::FunctionCallbackInfo<v8::Value>& args); 323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void ArrayBufferSlice(const v8::FunctionCallbackInfo<v8::Value>& args); 324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void ArraySubArray(const v8::FunctionCallbackInfo<v8::Value>& args); 325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void ArraySet(const v8::FunctionCallbackInfo<v8::Value>& 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. 352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void OSObject(const v8::FunctionCallbackInfo<v8::Value>& args); 353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void System(const v8::FunctionCallbackInfo<v8::Value>& args); 354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void ChangeDirectory(const v8::FunctionCallbackInfo<v8::Value>& args); 355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void SetEnvironment(const v8::FunctionCallbackInfo<v8::Value>& args); 356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void UnsetEnvironment(const v8::FunctionCallbackInfo<v8::Value>& args); 357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void SetUMask(const v8::FunctionCallbackInfo<v8::Value>& args); 358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void MakeDirectory(const v8::FunctionCallbackInfo<v8::Value>& args); 359b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void RemoveDirectory(const v8::FunctionCallbackInfo<v8::Value>& args); 360b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void AddOSMethods(v8::Isolate* isolate, 362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<ObjectTemplate> os_template); 363b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 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_; 376b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static base::OS::MemoryMappedFile* counters_file_; 377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static base::Mutex context_mutex_; 378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const base::TimeTicks kInitialTicks; 3793fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 380a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static Counter* GetCounter(const char* name, bool is_histogram); 381b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void InstallUtilityScript(Isolate* isolate); 382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif // !V8_SHARED 383b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void Initialize(Isolate* isolate); 384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void InitializeDebugger(Isolate* isolate); 385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void RunShell(Isolate* isolate); 3863fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch static bool SetOptions(int argc, char* argv[]); 387b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<ObjectTemplate> CreateGlobalTemplate(Isolate* isolate); 388b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<FunctionTemplate> CreateArrayBufferTemplate(FunctionCallback); 389b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<FunctionTemplate> CreateArrayTemplate(FunctionCallback); 390b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<Value> CreateExternalArrayBuffer(Isolate* isolate, 391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Object> buffer, 392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t size); 393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<Object> CreateExternalArray(Isolate* isolate, 394b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Object> array, 395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Object> buffer, 396b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ExternalArrayType type, 397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t length, 398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t byteLength, 399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t byteOffset, 400b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t element_size); 401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void CreateExternalArray( 402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const v8::FunctionCallbackInfo<v8::Value>& args, 403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ExternalArrayType type, 404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t element_size); 405b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void ExternalArrayWeakCallback(Isolate* isolate, 406b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Persistent<Object>* object, 407b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint8_t* data); 408a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 409a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 410a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 411a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} // namespace v8 412a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 413a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 414a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif // V8_D8_H_ 415