1f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com// Copyright 2012 the V8 project authors. All rights reserved.
23484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// Use of this source code is governed by a BSD-style license that can be
33484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// found in the LICENSE file.
45a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org
55a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org#ifndef V8_D8_H_
65a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org#define V8_D8_H_
75a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org
87c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org#ifndef V8_SHARED
9196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/allocation.h"
10196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/hashmap.h"
11196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/smart-pointers.h"
12196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/v8.h"
1384bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org#else
14196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "include/v8.h"
15ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org#include "src/base/compiler-specific.h"
16865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org#endif  // !V8_SHARED
175a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org
185a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.orgnamespace v8 {
195a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org
205a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org
217c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org#ifndef V8_SHARED
22a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// A single counter in a counter collection.
235a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.orgclass Counter {
245a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org public:
25a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  static const int kMaxNameSize = 64;
26d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org  int32_t* Bind(const char* name, bool histogram);
27d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org  int32_t* ptr() { return &count_; }
28d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org  int32_t count() { return count_; }
29d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org  int32_t sample_total() { return sample_total_; }
30d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org  bool is_histogram() { return is_histogram_; }
31d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org  void AddSample(int32_t sample);
325a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org private:
33d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org  int32_t count_;
34d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org  int32_t sample_total_;
35d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org  bool is_histogram_;
36a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  uint8_t name_[kMaxNameSize];
37a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org};
38a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
39a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
40a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// A set of counters and associated information.  An instance of this
41a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// class is stored directly in the memory-mapped counters file if
42a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// the --map-counters options is used
43a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgclass CounterCollection {
44a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org public:
45a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  CounterCollection();
46a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  Counter* GetNextCounter();
47a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org private:
4828583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org  static const unsigned kMaxCounters = 512;
49a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  uint32_t magic_number_;
50a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  uint32_t max_counters_;
51a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  uint32_t max_name_size_;
52a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  uint32_t counters_in_use_;
53a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  Counter counters_[kMaxCounters];
545a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org};
555a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org
565a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org
57f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.orgclass CounterMap {
58f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org public:
59f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org  CounterMap(): hash_map_(Match) { }
60f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org  Counter* Lookup(const char* name) {
61f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org    i::HashMap::Entry* answer = hash_map_.Lookup(
62f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org        const_cast<char*>(name),
63f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org        Hash(name),
64f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org        false);
65f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org    if (!answer) return NULL;
66f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org    return reinterpret_cast<Counter*>(answer->value);
67f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org  }
68f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org  void Set(const char* name, Counter* value) {
69f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org    i::HashMap::Entry* answer = hash_map_.Lookup(
70f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org        const_cast<char*>(name),
71f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org        Hash(name),
72f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org        true);
73e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(answer != NULL);
74f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org    answer->value = value;
75f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org  }
76f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org  class Iterator {
77f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org   public:
78f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org    explicit Iterator(CounterMap* map)
79f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org        : map_(&map->hash_map_), entry_(map_->Start()) { }
80f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org    void Next() { entry_ = map_->Next(entry_); }
81f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org    bool More() { return entry_ != NULL; }
82f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org    const char* CurrentKey() { return static_cast<const char*>(entry_->key); }
83f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org    Counter* CurrentValue() { return static_cast<Counter*>(entry_->value); }
84f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org   private:
85f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org    i::HashMap* map_;
86f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org    i::HashMap::Entry* entry_;
87f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org  };
88e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org
89f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org private:
90f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org  static int Hash(const char* name);
91f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org  static bool Match(void* key1, void* key2);
92f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org  i::HashMap hash_map_;
93f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org};
94865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org#endif  // !V8_SHARED
95f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org
96f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org
9734e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.orgclass LineEditor {
9834e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org public:
9934e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  enum Type { DUMB = 0, READLINE = 1 };
10034e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  LineEditor(Type type, const char* name);
10134e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  virtual ~LineEditor() { }
10234e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org
1032efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org  virtual Handle<String> Prompt(const char* prompt) = 0;
1046e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org  virtual bool Open(Isolate* isolate) { return true; }
10534e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  virtual bool Close() { return true; }
10634e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  virtual void AddHistory(const char* str) { }
10734e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org
10834e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  const char* name() { return name_; }
1094a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org  static LineEditor* Get() { return current_; }
11034e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org private:
11134e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  Type type_;
11234e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  const char* name_;
1134a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org  static LineEditor* current_;
11434e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org};
11534e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org
11634e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org
1176db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.orgclass SourceGroup {
1186db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org public:
11984bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org  SourceGroup() :
1207c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org#ifndef V8_SHARED
121e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org      next_semaphore_(0),
122e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org      done_semaphore_(0),
12383e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org      thread_(NULL),
124865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org#endif  // !V8_SHARED
12584bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org      argv_(NULL),
12684bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org      begin_offset_(0),
12755ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org      end_offset_(0) {}
1286db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org
12983e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org  ~SourceGroup();
13083e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org
1316db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org  void Begin(char** argv, int offset) {
1326db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org    argv_ = const_cast<const char**>(argv);
1336db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org    begin_offset_ = offset;
1346db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org  }
1356db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org
1366db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org  void End(int offset) { end_offset_ = offset; }
1376db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org
1388e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  void Execute(Isolate* isolate);
1396db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org
1407c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org#ifndef V8_SHARED
1416db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org  void StartExecuteInThread();
1426db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org  void WaitForThread();
1436db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org
1446db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org private:
1455de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org  class IsolateThread : public base::Thread {
1466db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org   public:
1476db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org    explicit IsolateThread(SourceGroup* group)
1485de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org        : base::Thread(GetThreadOptions()), group_(group) {}
1496db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org
1506db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org    virtual void Run() {
1516db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org      group_->ExecuteInThread();
1526db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org    }
1536db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org
1546db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org   private:
1556db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org    SourceGroup* group_;
1566db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org  };
1576db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org
1585de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org  static base::Thread::Options GetThreadOptions();
1596db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org  void ExecuteInThread();
1606db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org
1615de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org  base::Semaphore next_semaphore_;
1625de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org  base::Semaphore done_semaphore_;
1635de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org  base::Thread* thread_;
164865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org#endif  // !V8_SHARED
1656db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org
1666db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org  void ExitShell(int exit_code);
1678e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  Handle<String> ReadFile(Isolate* isolate, const char* name);
1686db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org
1696db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org  const char** argv_;
1706db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org  int begin_offset_;
1716db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org  int end_offset_;
1726db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org};
1736db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org
1746db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org
1752c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.orgclass BinaryResource : public v8::String::ExternalOneByteStringResource {
176659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org public:
177659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org  BinaryResource(const char* string, int length)
178659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org      : data_(string),
179659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org        length_(length) { }
180659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org
181659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org  ~BinaryResource() {
182659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org    delete[] data_;
183659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org    data_ = NULL;
184659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org    length_ = 0;
185659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org  }
186659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org
187659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org  virtual const char* data() const { return data_; }
188659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org  virtual size_t length() const { return length_; }
189659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org
190659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org private:
191659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org  const char* data_;
192659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org  size_t length_;
193659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org};
194659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org
195659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org
1966db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.orgclass ShellOptions {
1976db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org public:
1984c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  ShellOptions()
1994c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org      : script_executed(false),
2004c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org        last_run(true),
2014c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org        send_idle_notification(false),
2024c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org        invoke_weak_callbacks(false),
2034c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org        stress_opt(false),
2044c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org        stress_deopt(false),
2054c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org        interactive_shell(false),
2064c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org        test_shell(false),
2074c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org        dump_heap_constants(false),
2084c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org        expected_to_throw(false),
2094c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org        mock_arraybuffer_allocator(false),
2104c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org        num_isolates(1),
2114c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org        compile_options(v8::ScriptCompiler::kNoCompileOptions),
2124c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org        isolate_sources(NULL),
2134c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org        icu_data_file(NULL),
2144c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org        natives_blob(NULL),
2154c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org        snapshot_blob(NULL) {}
21684bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org
21734e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  ~ShellOptions() {
21834e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org    delete[] isolate_sources;
21934e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  }
22034e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org
221d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  bool use_interactive_shell() {
222d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org    return (interactive_shell || !script_executed) && !test_shell;
223d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  }
224d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org
2256db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org  bool script_executed;
2266db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org  bool last_run;
22746839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  bool send_idle_notification;
228d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  bool invoke_weak_callbacks;
2296db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org  bool stress_opt;
2306db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org  bool stress_deopt;
2316db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org  bool interactive_shell;
2326db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org  bool test_shell;
233594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  bool dump_heap_constants;
23463ea3d20e0c5531a4bb0853218d5f746117edea1mvstanton@chromium.org  bool expected_to_throw;
235af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org  bool mock_arraybuffer_allocator;
2366db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org  int num_isolates;
2374c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  v8::ScriptCompiler::CompileOptions compile_options;
2386db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org  SourceGroup* isolate_sources;
239b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org  const char* icu_data_file;
240975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org  const char* natives_blob;
241975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org  const char* snapshot_blob;
2426db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org};
2436db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org
2447c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org#ifdef V8_SHARED
24584bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.orgclass Shell {
24684bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org#else
24784bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.orgclass Shell : public i::AllStatic {
2487c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org#endif  // V8_SHARED
24983e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org
2505a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org public:
2514c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  static Local<UnboundScript> CompileString(
2524c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org      Isolate* isolate, Local<String> source, Local<Value> name,
2534c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org      v8::ScriptCompiler::CompileOptions compile_options);
2542bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  static bool ExecuteString(Isolate* isolate,
2552bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org                            Handle<String> source,
2565a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org                            Handle<Value> name,
2575a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org                            bool print_result,
2585a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org                            bool report_exceptions);
259c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org  static const char* ToCString(const v8::String::Utf8Value& value);
2602bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  static void ReportException(Isolate* isolate, TryCatch* try_catch);
2618e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  static Handle<String> ReadFile(Isolate* isolate, const char* name);
26257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  static Local<Context> CreateEvaluationContext(Isolate* isolate);
2638e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  static int RunMain(Isolate* isolate, int argc, char* argv[]);
26484bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org  static int Main(int argc, char* argv[]);
26534e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  static void Exit(int exit_code);
26659297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org  static void OnExit();
26784bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org
2687c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org#ifndef V8_SHARED
2692bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  static Handle<Array> GetCompletions(Isolate* isolate,
2702bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org                                      Handle<String> text,
27184bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org                                      Handle<String> full);
272a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  static int* LookupCounter(const char* name);
273d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org  static void* CreateHistogram(const char* name,
274d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org                               int min,
275d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org                               int max,
276d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org                               size_t buckets);
277d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org  static void AddHistogramSample(void* histogram, int sample);
2786b0d137a5839eff3ce1a98ca9e12310027eff30fmachenbach@chromium.org  static void MapCounters(v8::Isolate* isolate, const char* name);
27984bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org
280034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org  static Local<Object> DebugMessageDetails(Isolate* isolate,
281034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org                                           Handle<String> message);
282034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org  static Local<Value> DebugCommandToJSONRequest(Isolate* isolate,
283034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org                                                Handle<String> command);
284e94b5ff1e1e95fb2c8ef6bce66ce8533786d9792bmeurer@chromium.org
285e94b5ff1e1e95fb2c8ef6bce66ce8533786d9792bmeurer@chromium.org  static void PerformanceNow(const v8::FunctionCallbackInfo<v8::Value>& args);
286865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org#endif  // !V8_SHARED
2875a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org
288d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  static void RealmCurrent(const v8::FunctionCallbackInfo<v8::Value>& args);
289d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  static void RealmOwner(const v8::FunctionCallbackInfo<v8::Value>& args);
290d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  static void RealmGlobal(const v8::FunctionCallbackInfo<v8::Value>& args);
291d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  static void RealmCreate(const v8::FunctionCallbackInfo<v8::Value>& args);
292d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  static void RealmDispose(const v8::FunctionCallbackInfo<v8::Value>& args);
293d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  static void RealmSwitch(const v8::FunctionCallbackInfo<v8::Value>& args);
294d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  static void RealmEval(const v8::FunctionCallbackInfo<v8::Value>& args);
295d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  static void RealmSharedGet(Local<String> property,
296d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org                             const  PropertyCallbackInfo<Value>& info);
29732d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org  static void RealmSharedSet(Local<String> property,
29832d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org                             Local<Value> value,
299d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org                             const  PropertyCallbackInfo<void>& info);
300d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org
301d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  static void Print(const v8::FunctionCallbackInfo<v8::Value>& args);
302d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  static void Write(const v8::FunctionCallbackInfo<v8::Value>& args);
303d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  static void Quit(const v8::FunctionCallbackInfo<v8::Value>& args);
304d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  static void Version(const v8::FunctionCallbackInfo<v8::Value>& args);
305d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  static void Read(const v8::FunctionCallbackInfo<v8::Value>& args);
306d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  static void ReadBuffer(const v8::FunctionCallbackInfo<v8::Value>& args);
3078e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  static Handle<String> ReadFromStdin(Isolate* isolate);
308d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  static void ReadLine(const v8::FunctionCallbackInfo<v8::Value>& args) {
309d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org    args.GetReturnValue().Set(ReadFromStdin(args.GetIsolate()));
3102efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org  }
311d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  static void Load(const v8::FunctionCallbackInfo<v8::Value>& args);
312d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  static void ArrayBuffer(const v8::FunctionCallbackInfo<v8::Value>& args);
313d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  static void Int8Array(const v8::FunctionCallbackInfo<v8::Value>& args);
314d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  static void Uint8Array(const v8::FunctionCallbackInfo<v8::Value>& args);
315d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  static void Int16Array(const v8::FunctionCallbackInfo<v8::Value>& args);
316d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  static void Uint16Array(const v8::FunctionCallbackInfo<v8::Value>& args);
317d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  static void Int32Array(const v8::FunctionCallbackInfo<v8::Value>& args);
318d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  static void Uint32Array(const v8::FunctionCallbackInfo<v8::Value>& args);
319d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  static void Float32Array(const v8::FunctionCallbackInfo<v8::Value>& args);
320d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  static void Float64Array(const v8::FunctionCallbackInfo<v8::Value>& args);
321d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  static void Uint8ClampedArray(
322d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org      const v8::FunctionCallbackInfo<v8::Value>& args);
323d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  static void ArrayBufferSlice(const v8::FunctionCallbackInfo<v8::Value>& args);
324d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  static void ArraySubArray(const v8::FunctionCallbackInfo<v8::Value>& args);
325d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  static void ArraySet(const v8::FunctionCallbackInfo<v8::Value>& args);
32671daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org  // The OS object on the global object contains methods for performing
32771daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org  // operating system calls:
32871daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org  //
32971daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org  // os.system("program_name", ["arg1", "arg2", ...], timeout1, timeout2) will
33071daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org  // run the command, passing the arguments to the program.  The standard output
33171daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org  // of the program will be picked up and returned as a multiline string.  If
33241826e77311db718135ef6517b846933dfd275f3ager@chromium.org  // timeout1 is present then it should be a number.  -1 indicates no timeout
33341826e77311db718135ef6517b846933dfd275f3ager@chromium.org  // and a positive number is used as a timeout in milliseconds that limits the
33441826e77311db718135ef6517b846933dfd275f3ager@chromium.org  // time spent waiting between receiving output characters from the program.
33541826e77311db718135ef6517b846933dfd275f3ager@chromium.org  // timeout2, if present, should be a number indicating the limit in
33641826e77311db718135ef6517b846933dfd275f3ager@chromium.org  // milliseconds on the total running time of the program.  Exceptions are
33741826e77311db718135ef6517b846933dfd275f3ager@chromium.org  // thrown on timeouts or other errors or if the exit status of the program
33841826e77311db718135ef6517b846933dfd275f3ager@chromium.org  // indicates an error.
33971daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org  //
34071daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org  // os.chdir(dir) changes directory to the given directory.  Throws an
34171daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org  // exception/ on error.
34271daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org  //
34371daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org  // os.setenv(variable, value) sets an environment variable.  Repeated calls to
34471daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org  // this method leak memory due to the API of setenv in the standard C library.
34571daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org  //
34671daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org  // os.umask(alue) calls the umask system call and returns the old umask.
34771daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org  //
34871daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org  // os.mkdirp(name, mask) creates a directory.  The mask (if present) is anded
34971daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org  // with the current umask.  Intermediate directories are created if necessary.
35071daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org  // An exception is not thrown if the directory already exists.  Analogous to
35171daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org  // the "mkdir -p" command.
352d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  static void OSObject(const v8::FunctionCallbackInfo<v8::Value>& args);
353d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  static void System(const v8::FunctionCallbackInfo<v8::Value>& args);
354d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  static void ChangeDirectory(const v8::FunctionCallbackInfo<v8::Value>& args);
355d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  static void SetEnvironment(const v8::FunctionCallbackInfo<v8::Value>& args);
356d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  static void UnsetEnvironment(const v8::FunctionCallbackInfo<v8::Value>& args);
357d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  static void SetUMask(const v8::FunctionCallbackInfo<v8::Value>& args);
358d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  static void MakeDirectory(const v8::FunctionCallbackInfo<v8::Value>& args);
359d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  static void RemoveDirectory(const v8::FunctionCallbackInfo<v8::Value>& args);
36071daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org
361f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org  static void AddOSMethods(v8::Isolate* isolate,
362f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org                           Handle<ObjectTemplate> os_template);
3632efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org
3645a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org  static const char* kPrompt;
3656db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org  static ShellOptions options;
3666db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org
3675a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org private:
3685a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org  static Persistent<Context> evaluation_context_;
3697c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org#ifndef V8_SHARED
37084bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org  static Persistent<Context> utility_context_;
371f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org  static CounterMap* counter_map_;
372a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  // We statically allocate a set of local counters to be used if we
373a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  // don't want to store the stats in a memory-mapped file
374a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  static CounterCollection local_counters_;
375a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  static CounterCollection* counters_;
3765de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org  static base::OS::MemoryMappedFile* counters_file_;
3775de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org  static base::Mutex context_mutex_;
3785de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org  static const base::TimeTicks kInitialTicks;
37984bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org
380d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org  static Counter* GetCounter(const char* name, bool is_histogram);
38146a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  static void InstallUtilityScript(Isolate* isolate);
382865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org#endif  // !V8_SHARED
3838e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  static void Initialize(Isolate* isolate);
3848e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  static void InitializeDebugger(Isolate* isolate);
3858e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  static void RunShell(Isolate* isolate);
38684bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org  static bool SetOptions(int argc, char* argv[]);
3878e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  static Handle<ObjectTemplate> CreateGlobalTemplate(Isolate* isolate);
388662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org  static Handle<FunctionTemplate> CreateArrayBufferTemplate(FunctionCallback);
389662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org  static Handle<FunctionTemplate> CreateArrayTemplate(FunctionCallback);
3908e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  static Handle<Value> CreateExternalArrayBuffer(Isolate* isolate,
3918e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org                                                 Handle<Object> buffer,
392c74d674717b2e229addbb9349986cd157947f7edyangguo@chromium.org                                                 int32_t size);
3938e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  static Handle<Object> CreateExternalArray(Isolate* isolate,
3948e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org                                            Handle<Object> array,
395c74d674717b2e229addbb9349986cd157947f7edyangguo@chromium.org                                            Handle<Object> buffer,
396c74d674717b2e229addbb9349986cd157947f7edyangguo@chromium.org                                            ExternalArrayType type,
397c74d674717b2e229addbb9349986cd157947f7edyangguo@chromium.org                                            int32_t length,
398c74d674717b2e229addbb9349986cd157947f7edyangguo@chromium.org                                            int32_t byteLength,
399c74d674717b2e229addbb9349986cd157947f7edyangguo@chromium.org                                            int32_t byteOffset,
400c74d674717b2e229addbb9349986cd157947f7edyangguo@chromium.org                                            int32_t element_size);
401d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  static void CreateExternalArray(
402d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org      const v8::FunctionCallbackInfo<v8::Value>& args,
403d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org      ExternalArrayType type,
404d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org      int32_t element_size);
405d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org  static void ExternalArrayWeakCallback(Isolate* isolate,
40657ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org                                        Persistent<Object>* object,
40757ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org                                        uint8_t* data);
4085a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org};
4095a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org
4105a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org
4115a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org}  // namespace v8
4125a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org
4135a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org
4145a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org#endif  // V8_D8_H_
415