1f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com// Copyright 2012 the V8 project authors. All rights reserved.
25a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org// Redistribution and use in source and binary forms, with or without
35a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org// modification, are permitted provided that the following conditions are
45a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org// met:
55a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org//
65a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org//     * Redistributions of source code must retain the above copyright
75a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org//       notice, this list of conditions and the following disclaimer.
85a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org//     * Redistributions in binary form must reproduce the above
95a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org//       copyright notice, this list of conditions and the following
105a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org//       disclaimer in the documentation and/or other materials provided
115a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org//       with the distribution.
125a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org//     * Neither the name of Google Inc. nor the names of its
135a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org//       contributors may be used to endorse or promote products derived
145a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org//       from this software without specific prior written permission.
155a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org//
165a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
175a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
185a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
195a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
205a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
215a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
225a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
235a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
245a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
255a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
265a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
275a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org
285a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org#ifndef V8_D8_H_
295a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org#define V8_D8_H_
305a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org
317c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org#ifndef V8_SHARED
3284bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org#include "allocation.h"
33f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org#include "hashmap.h"
34304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org#include "smart-pointers.h"
3555ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org#include "v8.h"
3684bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org#else
3784bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org#include "../include/v8.h"
387c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org#endif  // V8_SHARED
395a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org
405a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.orgnamespace v8 {
415a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org
425a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org
437c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org#ifndef V8_SHARED
44a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// A single counter in a counter collection.
455a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.orgclass Counter {
465a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org public:
47a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  static const int kMaxNameSize = 64;
48d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org  int32_t* Bind(const char* name, bool histogram);
49d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org  int32_t* ptr() { return &count_; }
50d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org  int32_t count() { return count_; }
51d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org  int32_t sample_total() { return sample_total_; }
52d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org  bool is_histogram() { return is_histogram_; }
53d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org  void AddSample(int32_t sample);
545a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org private:
55d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org  int32_t count_;
56d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org  int32_t sample_total_;
57d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org  bool is_histogram_;
58a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  uint8_t name_[kMaxNameSize];
59a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org};
60a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
61a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
62a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// A set of counters and associated information.  An instance of this
63a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// class is stored directly in the memory-mapped counters file if
64a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// the --map-counters options is used
65a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgclass CounterCollection {
66a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org public:
67a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  CounterCollection();
68a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  Counter* GetNextCounter();
69a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org private:
7028583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org  static const unsigned kMaxCounters = 512;
71a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  uint32_t magic_number_;
72a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  uint32_t max_counters_;
73a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  uint32_t max_name_size_;
74a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  uint32_t counters_in_use_;
75a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  Counter counters_[kMaxCounters];
765a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org};
775a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org
785a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org
79f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.orgclass CounterMap {
80f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org public:
81f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org  CounterMap(): hash_map_(Match) { }
82f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org  Counter* Lookup(const char* name) {
83f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org    i::HashMap::Entry* answer = hash_map_.Lookup(
84f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org        const_cast<char*>(name),
85f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org        Hash(name),
86f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org        false);
87f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org    if (!answer) return NULL;
88f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org    return reinterpret_cast<Counter*>(answer->value);
89f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org  }
90f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org  void Set(const char* name, Counter* value) {
91f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org    i::HashMap::Entry* answer = hash_map_.Lookup(
92f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org        const_cast<char*>(name),
93f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org        Hash(name),
94f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org        true);
95f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org    ASSERT(answer != NULL);
96f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org    answer->value = value;
97f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org  }
98f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org  class Iterator {
99f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org   public:
100f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org    explicit Iterator(CounterMap* map)
101f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org        : map_(&map->hash_map_), entry_(map_->Start()) { }
102f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org    void Next() { entry_ = map_->Next(entry_); }
103f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org    bool More() { return entry_ != NULL; }
104f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org    const char* CurrentKey() { return static_cast<const char*>(entry_->key); }
105f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org    Counter* CurrentValue() { return static_cast<Counter*>(entry_->value); }
106f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org   private:
107f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org    i::HashMap* map_;
108f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org    i::HashMap::Entry* entry_;
109f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org  };
110e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org
111f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org private:
112f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org  static int Hash(const char* name);
113f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org  static bool Match(void* key1, void* key2);
114f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org  i::HashMap hash_map_;
115f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org};
1167c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org#endif  // V8_SHARED
117f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org
118f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org
11934e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.orgclass LineEditor {
12034e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org public:
12134e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  enum Type { DUMB = 0, READLINE = 1 };
12234e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  LineEditor(Type type, const char* name);
12334e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  virtual ~LineEditor() { }
12434e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org
1252efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org  virtual Handle<String> Prompt(const char* prompt) = 0;
1266e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org  virtual bool Open(Isolate* isolate) { return true; }
12734e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  virtual bool Close() { return true; }
12834e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  virtual void AddHistory(const char* str) { }
12934e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org
13034e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  const char* name() { return name_; }
1314a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org  static LineEditor* Get() { return current_; }
13234e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org private:
13334e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  Type type_;
13434e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  const char* name_;
1354a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org  static LineEditor* current_;
13634e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org};
13734e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org
13834e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org
1396db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.orgclass SourceGroup {
1406db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org public:
14184bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org  SourceGroup() :
1427c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org#ifndef V8_SHARED
143e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org      next_semaphore_(0),
144e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org      done_semaphore_(0),
14583e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org      thread_(NULL),
1467c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org#endif  // V8_SHARED
14784bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org      argv_(NULL),
14884bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org      begin_offset_(0),
14955ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org      end_offset_(0) {}
1506db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org
15183e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org  ~SourceGroup();
15283e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org
1536db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org  void Begin(char** argv, int offset) {
1546db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org    argv_ = const_cast<const char**>(argv);
1556db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org    begin_offset_ = offset;
1566db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org  }
1576db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org
1586db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org  void End(int offset) { end_offset_ = offset; }
1596db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org
1608e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  void Execute(Isolate* isolate);
1616db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org
1627c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org#ifndef V8_SHARED
1636db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org  void StartExecuteInThread();
1646db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org  void WaitForThread();
1656db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org
1666db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org private:
1676db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org  class IsolateThread : public i::Thread {
1686db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org   public:
1696db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org    explicit IsolateThread(SourceGroup* group)
1706db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org        : i::Thread(GetThreadOptions()), group_(group) {}
1716db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org
1726db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org    virtual void Run() {
1736db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org      group_->ExecuteInThread();
1746db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org    }
1756db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org
1766db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org   private:
1776db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org    SourceGroup* group_;
1786db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org  };
1796db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org
1806db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org  static i::Thread::Options GetThreadOptions();
1816db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org  void ExecuteInThread();
1826db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org
183e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org  i::Semaphore next_semaphore_;
184e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org  i::Semaphore done_semaphore_;
18583e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org  i::Thread* thread_;
1867c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org#endif  // V8_SHARED
1876db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org
1886db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org  void ExitShell(int exit_code);
1898e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  Handle<String> ReadFile(Isolate* isolate, const char* name);
1906db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org
1916db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org  const char** argv_;
1926db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org  int begin_offset_;
1936db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org  int end_offset_;
1946db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org};
1956db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org
1966db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org
197659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.orgclass BinaryResource : public v8::String::ExternalAsciiStringResource {
198659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org public:
199659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org  BinaryResource(const char* string, int length)
200659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org      : data_(string),
201659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org        length_(length) { }
202659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org
203659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org  ~BinaryResource() {
204659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org    delete[] data_;
205659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org    data_ = NULL;
206659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org    length_ = 0;
207659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org  }
208659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org
209659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org  virtual const char* data() const { return data_; }
210659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org  virtual size_t length() const { return length_; }
211659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org
212659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org private:
213659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org  const char* data_;
214659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org  size_t length_;
215659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org};
216659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org
217659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org
2186db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.orgclass ShellOptions {
2196db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org public:
22084bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org  ShellOptions() :
2217c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org#ifndef V8_SHARED
22234e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org     num_parallel_files(0),
22384bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org     parallel_files(NULL),
2247c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org#endif  // V8_SHARED
22584bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org     script_executed(false),
22684bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org     last_run(true),
22746839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org     send_idle_notification(false),
22884bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org     stress_opt(false),
22984bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org     stress_deopt(false),
23084bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org     interactive_shell(false),
23184bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org     test_shell(false),
232594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org     dump_heap_constants(false),
23363ea3d20e0c5531a4bb0853218d5f746117edea1mvstanton@chromium.org     expected_to_throw(false),
234af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org     mock_arraybuffer_allocator(false),
23584bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org     num_isolates(1),
23684bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org     isolate_sources(NULL) { }
23784bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org
23834e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  ~ShellOptions() {
23934e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org#ifndef V8_SHARED
24034e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org    delete[] parallel_files;
24134e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org#endif  // V8_SHARED
24234e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org    delete[] isolate_sources;
24334e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  }
24434e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org
2457c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org#ifndef V8_SHARED
24634e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  int num_parallel_files;
24734e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  char** parallel_files;
2487c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org#endif  // V8_SHARED
2496db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org  bool script_executed;
2506db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org  bool last_run;
25146839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  bool send_idle_notification;
2526db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org  bool stress_opt;
2536db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org  bool stress_deopt;
2546db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org  bool interactive_shell;
2556db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org  bool test_shell;
256594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  bool dump_heap_constants;
25763ea3d20e0c5531a4bb0853218d5f746117edea1mvstanton@chromium.org  bool expected_to_throw;
258af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org  bool mock_arraybuffer_allocator;
2596db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org  int num_isolates;
2606db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org  SourceGroup* isolate_sources;
2616db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org};
2626db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org
2637c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org#ifdef V8_SHARED
26484bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.orgclass Shell {
26584bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org#else
26684bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.orgclass Shell : public i::AllStatic {
2677c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org#endif  // V8_SHARED
26883e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org
2695a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org public:
2702bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  static bool ExecuteString(Isolate* isolate,
2712bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org                            Handle<String> source,
2725a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org                            Handle<Value> name,
2735a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org                            bool print_result,
2745a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org                            bool report_exceptions);
275c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org  static const char* ToCString(const v8::String::Utf8Value& value);
2762bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  static void ReportException(Isolate* isolate, TryCatch* try_catch);
2778e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  static Handle<String> ReadFile(Isolate* isolate, const char* name);
27857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  static Local<Context> CreateEvaluationContext(Isolate* isolate);
2798e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  static int RunMain(Isolate* isolate, int argc, char* argv[]);
28084bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org  static int Main(int argc, char* argv[]);
28134e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  static void Exit(int exit_code);
28259297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org  static void OnExit();
28384bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org
2847c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org#ifndef V8_SHARED
2852bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  static Handle<Array> GetCompletions(Isolate* isolate,
2862bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org                                      Handle<String> text,
28784bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org                                      Handle<String> full);
288a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  static int* LookupCounter(const char* name);
289d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org  static void* CreateHistogram(const char* name,
290d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org                               int min,
291d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org                               int max,
292d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org                               size_t buckets);
293d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org  static void AddHistogramSample(void* histogram, int sample);
294a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  static void MapCounters(const char* name);
29584bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org
29665dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org#ifdef ENABLE_DEBUGGER_SUPPORT
29757ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  static Handle<Object> DebugMessageDetails(Isolate* isolate,
29857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org                                            Handle<String> message);
29957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  static Handle<Value> DebugCommandToJSONRequest(Isolate* isolate,
30057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org                                                 Handle<String> command);
30105ed9ddc6ff3a1ab3983c50d378cddfa257869b6jkummerow@chromium.org  static void DispatchDebugMessages();
30205ed9ddc6ff3a1ab3983c50d378cddfa257869b6jkummerow@chromium.org#endif  // ENABLE_DEBUGGER_SUPPORT
303e94b5ff1e1e95fb2c8ef6bce66ce8533786d9792bmeurer@chromium.org
304e94b5ff1e1e95fb2c8ef6bce66ce8533786d9792bmeurer@chromium.org  static void PerformanceNow(const v8::FunctionCallbackInfo<v8::Value>& args);
30505ed9ddc6ff3a1ab3983c50d378cddfa257869b6jkummerow@chromium.org#endif  // V8_SHARED
3065a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org
307d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  static void RealmCurrent(const v8::FunctionCallbackInfo<v8::Value>& args);
308d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  static void RealmOwner(const v8::FunctionCallbackInfo<v8::Value>& args);
309d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  static void RealmGlobal(const v8::FunctionCallbackInfo<v8::Value>& args);
310d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  static void RealmCreate(const v8::FunctionCallbackInfo<v8::Value>& args);
311d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  static void RealmDispose(const v8::FunctionCallbackInfo<v8::Value>& args);
312d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  static void RealmSwitch(const v8::FunctionCallbackInfo<v8::Value>& args);
313d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  static void RealmEval(const v8::FunctionCallbackInfo<v8::Value>& args);
314d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  static void RealmSharedGet(Local<String> property,
315d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org                             const  PropertyCallbackInfo<Value>& info);
31632d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org  static void RealmSharedSet(Local<String> property,
31732d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org                             Local<Value> value,
318d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org                             const  PropertyCallbackInfo<void>& info);
319d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org
320d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  static void Print(const v8::FunctionCallbackInfo<v8::Value>& args);
321d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  static void Write(const v8::FunctionCallbackInfo<v8::Value>& args);
322d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  static void Quit(const v8::FunctionCallbackInfo<v8::Value>& args);
323d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  static void Version(const v8::FunctionCallbackInfo<v8::Value>& args);
324d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  static void Read(const v8::FunctionCallbackInfo<v8::Value>& args);
325d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  static void ReadBuffer(const v8::FunctionCallbackInfo<v8::Value>& args);
3268e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  static Handle<String> ReadFromStdin(Isolate* isolate);
327d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  static void ReadLine(const v8::FunctionCallbackInfo<v8::Value>& args) {
328d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org    args.GetReturnValue().Set(ReadFromStdin(args.GetIsolate()));
3292efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org  }
330d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  static void Load(const v8::FunctionCallbackInfo<v8::Value>& args);
331d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  static void ArrayBuffer(const v8::FunctionCallbackInfo<v8::Value>& args);
332d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  static void Int8Array(const v8::FunctionCallbackInfo<v8::Value>& args);
333d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  static void Uint8Array(const v8::FunctionCallbackInfo<v8::Value>& args);
334d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  static void Int16Array(const v8::FunctionCallbackInfo<v8::Value>& args);
335d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  static void Uint16Array(const v8::FunctionCallbackInfo<v8::Value>& args);
336d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  static void Int32Array(const v8::FunctionCallbackInfo<v8::Value>& args);
337d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  static void Uint32Array(const v8::FunctionCallbackInfo<v8::Value>& args);
338d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  static void Float32Array(const v8::FunctionCallbackInfo<v8::Value>& args);
339d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  static void Float64Array(const v8::FunctionCallbackInfo<v8::Value>& args);
340d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  static void Uint8ClampedArray(
341d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org      const v8::FunctionCallbackInfo<v8::Value>& args);
342d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  static void ArrayBufferSlice(const v8::FunctionCallbackInfo<v8::Value>& args);
343d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  static void ArraySubArray(const v8::FunctionCallbackInfo<v8::Value>& args);
344d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  static void ArraySet(const v8::FunctionCallbackInfo<v8::Value>& args);
34571daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org  // The OS object on the global object contains methods for performing
34671daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org  // operating system calls:
34771daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org  //
34871daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org  // os.system("program_name", ["arg1", "arg2", ...], timeout1, timeout2) will
34971daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org  // run the command, passing the arguments to the program.  The standard output
35071daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org  // of the program will be picked up and returned as a multiline string.  If
35141826e77311db718135ef6517b846933dfd275f3ager@chromium.org  // timeout1 is present then it should be a number.  -1 indicates no timeout
35241826e77311db718135ef6517b846933dfd275f3ager@chromium.org  // and a positive number is used as a timeout in milliseconds that limits the
35341826e77311db718135ef6517b846933dfd275f3ager@chromium.org  // time spent waiting between receiving output characters from the program.
35441826e77311db718135ef6517b846933dfd275f3ager@chromium.org  // timeout2, if present, should be a number indicating the limit in
35541826e77311db718135ef6517b846933dfd275f3ager@chromium.org  // milliseconds on the total running time of the program.  Exceptions are
35641826e77311db718135ef6517b846933dfd275f3ager@chromium.org  // thrown on timeouts or other errors or if the exit status of the program
35741826e77311db718135ef6517b846933dfd275f3ager@chromium.org  // indicates an error.
35871daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org  //
35971daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org  // os.chdir(dir) changes directory to the given directory.  Throws an
36071daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org  // exception/ on error.
36171daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org  //
36271daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org  // os.setenv(variable, value) sets an environment variable.  Repeated calls to
36371daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org  // this method leak memory due to the API of setenv in the standard C library.
36471daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org  //
36571daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org  // os.umask(alue) calls the umask system call and returns the old umask.
36671daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org  //
36771daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org  // os.mkdirp(name, mask) creates a directory.  The mask (if present) is anded
36871daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org  // with the current umask.  Intermediate directories are created if necessary.
36971daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org  // An exception is not thrown if the directory already exists.  Analogous to
37071daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org  // the "mkdir -p" command.
371d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  static void OSObject(const v8::FunctionCallbackInfo<v8::Value>& args);
372d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  static void System(const v8::FunctionCallbackInfo<v8::Value>& args);
373d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  static void ChangeDirectory(const v8::FunctionCallbackInfo<v8::Value>& args);
374d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  static void SetEnvironment(const v8::FunctionCallbackInfo<v8::Value>& args);
375d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  static void UnsetEnvironment(const v8::FunctionCallbackInfo<v8::Value>& args);
376d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  static void SetUMask(const v8::FunctionCallbackInfo<v8::Value>& args);
377d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  static void MakeDirectory(const v8::FunctionCallbackInfo<v8::Value>& args);
378d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  static void RemoveDirectory(const v8::FunctionCallbackInfo<v8::Value>& args);
37971daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org
380f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org  static void AddOSMethods(v8::Isolate* isolate,
381f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org                           Handle<ObjectTemplate> os_template);
3822efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org
3835a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org  static const char* kPrompt;
3846db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org  static ShellOptions options;
3856db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org
3865a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org private:
3875a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org  static Persistent<Context> evaluation_context_;
3887c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org#ifndef V8_SHARED
38984bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org  static Persistent<Context> utility_context_;
390f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org  static CounterMap* counter_map_;
391a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  // We statically allocate a set of local counters to be used if we
392a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  // don't want to store the stats in a memory-mapped file
393a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  static CounterCollection local_counters_;
394a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  static CounterCollection* counters_;
395a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  static i::OS::MemoryMappedFile* counters_file_;
396dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org  static i::Mutex context_mutex_;
397e94b5ff1e1e95fb2c8ef6bce66ce8533786d9792bmeurer@chromium.org  static const i::TimeTicks kInitialTicks;
39884bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org
399d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org  static Counter* GetCounter(const char* name, bool is_histogram);
40046a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  static void InstallUtilityScript(Isolate* isolate);
4017c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org#endif  // V8_SHARED
4028e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  static void Initialize(Isolate* isolate);
4038e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  static void InitializeDebugger(Isolate* isolate);
4048e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  static void RunShell(Isolate* isolate);
40584bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org  static bool SetOptions(int argc, char* argv[]);
4068e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  static Handle<ObjectTemplate> CreateGlobalTemplate(Isolate* isolate);
407662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org  static Handle<FunctionTemplate> CreateArrayBufferTemplate(FunctionCallback);
408662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org  static Handle<FunctionTemplate> CreateArrayTemplate(FunctionCallback);
4098e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  static Handle<Value> CreateExternalArrayBuffer(Isolate* isolate,
4108e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org                                                 Handle<Object> buffer,
411c74d674717b2e229addbb9349986cd157947f7edyangguo@chromium.org                                                 int32_t size);
4128e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  static Handle<Object> CreateExternalArray(Isolate* isolate,
4138e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org                                            Handle<Object> array,
414c74d674717b2e229addbb9349986cd157947f7edyangguo@chromium.org                                            Handle<Object> buffer,
415c74d674717b2e229addbb9349986cd157947f7edyangguo@chromium.org                                            ExternalArrayType type,
416c74d674717b2e229addbb9349986cd157947f7edyangguo@chromium.org                                            int32_t length,
417c74d674717b2e229addbb9349986cd157947f7edyangguo@chromium.org                                            int32_t byteLength,
418c74d674717b2e229addbb9349986cd157947f7edyangguo@chromium.org                                            int32_t byteOffset,
419c74d674717b2e229addbb9349986cd157947f7edyangguo@chromium.org                                            int32_t element_size);
420d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  static void CreateExternalArray(
421d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org      const v8::FunctionCallbackInfo<v8::Value>& args,
422d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org      ExternalArrayType type,
423d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org      int32_t element_size);
424d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org  static void ExternalArrayWeakCallback(Isolate* isolate,
42557ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org                                        Persistent<Object>* object,
42657ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org                                        uint8_t* data);
4275a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org};
4285a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org
4295a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org
4305a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org}  // namespace v8
4315a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org
4325a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org
4335a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org#endif  // V8_D8_H_
434