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