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