The data contained in this repository can be downloaded to your computer using one of several clients.
Please see the documentation of your version control software client for more information.

Please select the desired protocol below to get the URL.

This URL has Read-Only access.

Statistics
| Branch: | Revision:

main_repo / deps / v8 / src / d8.h @ 40c0f755

History | View | Annotate | Download (7.99 KB)

1
// Copyright 2009 the V8 project authors. All rights reserved.
2
// Redistribution and use in source and binary forms, with or without
3
// modification, are permitted provided that the following conditions are
4
// met:
5
//
6
//     * Redistributions of source code must retain the above copyright
7
//       notice, this list of conditions and the following disclaimer.
8
//     * Redistributions in binary form must reproduce the above
9
//       copyright notice, this list of conditions and the following
10
//       disclaimer in the documentation and/or other materials provided
11
//       with the distribution.
12
//     * Neither the name of Google Inc. nor the names of its
13
//       contributors may be used to endorse or promote products derived
14
//       from this software without specific prior written permission.
15
//
16
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27

    
28
#ifndef V8_D8_H_
29
#define V8_D8_H_
30

    
31
#include "v8.h"
32
#include "hashmap.h"
33

    
34

    
35
namespace v8 {
36

    
37

    
38
namespace i = v8::internal;
39

    
40

    
41
// A single counter in a counter collection.
42
class Counter {
43
 public:
44
  static const int kMaxNameSize = 64;
45
  int32_t* Bind(const char* name, bool histogram);
46
  int32_t* ptr() { return &count_; }
47
  int32_t count() { return count_; }
48
  int32_t sample_total() { return sample_total_; }
49
  bool is_histogram() { return is_histogram_; }
50
  void AddSample(int32_t sample);
51
 private:
52
  int32_t count_;
53
  int32_t sample_total_;
54
  bool is_histogram_;
55
  uint8_t name_[kMaxNameSize];
56
};
57

    
58

    
59
// A set of counters and associated information.  An instance of this
60
// class is stored directly in the memory-mapped counters file if
61
// the --map-counters options is used
62
class CounterCollection {
63
 public:
64
  CounterCollection();
65
  Counter* GetNextCounter();
66
 private:
67
  static const unsigned kMaxCounters = 256;
68
  uint32_t magic_number_;
69
  uint32_t max_counters_;
70
  uint32_t max_name_size_;
71
  uint32_t counters_in_use_;
72
  Counter counters_[kMaxCounters];
73
};
74

    
75

    
76
class CounterMap {
77
 public:
78
  CounterMap(): hash_map_(Match) { }
79
  Counter* Lookup(const char* name) {
80
    i::HashMap::Entry* answer = hash_map_.Lookup(
81
        const_cast<char*>(name),
82
        Hash(name),
83
        false);
84
    if (!answer) return NULL;
85
    return reinterpret_cast<Counter*>(answer->value);
86
  }
87
  void Set(const char* name, Counter* value) {
88
    i::HashMap::Entry* answer = hash_map_.Lookup(
89
        const_cast<char*>(name),
90
        Hash(name),
91
        true);
92
    ASSERT(answer != NULL);
93
    answer->value = value;
94
  }
95
  class Iterator {
96
   public:
97
    explicit Iterator(CounterMap* map)
98
        : map_(&map->hash_map_), entry_(map_->Start()) { }
99
    void Next() { entry_ = map_->Next(entry_); }
100
    bool More() { return entry_ != NULL; }
101
    const char* CurrentKey() { return static_cast<const char*>(entry_->key); }
102
    Counter* CurrentValue() { return static_cast<Counter*>(entry_->value); }
103
   private:
104
    i::HashMap* map_;
105
    i::HashMap::Entry* entry_;
106
  };
107
 private:
108
  static int Hash(const char* name);
109
  static bool Match(void* key1, void* key2);
110
  i::HashMap hash_map_;
111
};
112

    
113

    
114
class Shell: public i::AllStatic {
115
 public:
116
  static bool ExecuteString(Handle<String> source,
117
                            Handle<Value> name,
118
                            bool print_result,
119
                            bool report_exceptions);
120
  static void ReportException(TryCatch* try_catch);
121
  static void Initialize();
122
  static void OnExit();
123
  static int* LookupCounter(const char* name);
124
  static void* CreateHistogram(const char* name,
125
                               int min,
126
                               int max,
127
                               size_t buckets);
128
  static void AddHistogramSample(void* histogram, int sample);
129
  static void MapCounters(const char* name);
130
  static Handle<String> ReadFile(const char* name);
131
  static void RunShell();
132
  static int Main(int argc, char* argv[]);
133
  static Handle<Array> GetCompletions(Handle<String> text,
134
                                      Handle<String> full);
135
  static Handle<Object> DebugMessageDetails(Handle<String> message);
136
  static Handle<Value> DebugCommandToJSONRequest(Handle<String> command);
137

    
138
  static Handle<Value> Print(const Arguments& args);
139
  static Handle<Value> Yield(const Arguments& args);
140
  static Handle<Value> Quit(const Arguments& args);
141
  static Handle<Value> Version(const Arguments& args);
142
  static Handle<Value> Load(const Arguments& args);
143
  // The OS object on the global object contains methods for performing
144
  // operating system calls:
145
  //
146
  // os.system("program_name", ["arg1", "arg2", ...], timeout1, timeout2) will
147
  // run the command, passing the arguments to the program.  The standard output
148
  // of the program will be picked up and returned as a multiline string.  If
149
  // timeout1 is present then it should be a number.  -1 indicates no timeout
150
  // and a positive number is used as a timeout in milliseconds that limits the
151
  // time spent waiting between receiving output characters from the program.
152
  // timeout2, if present, should be a number indicating the limit in
153
  // milliseconds on the total running time of the program.  Exceptions are
154
  // thrown on timeouts or other errors or if the exit status of the program
155
  // indicates an error.
156
  //
157
  // os.chdir(dir) changes directory to the given directory.  Throws an
158
  // exception/ on error.
159
  //
160
  // os.setenv(variable, value) sets an environment variable.  Repeated calls to
161
  // this method leak memory due to the API of setenv in the standard C library.
162
  //
163
  // os.umask(alue) calls the umask system call and returns the old umask.
164
  //
165
  // os.mkdirp(name, mask) creates a directory.  The mask (if present) is anded
166
  // with the current umask.  Intermediate directories are created if necessary.
167
  // An exception is not thrown if the directory already exists.  Analogous to
168
  // the "mkdir -p" command.
169
  static Handle<Value> OSObject(const Arguments& args);
170
  static Handle<Value> System(const Arguments& args);
171
  static Handle<Value> ChangeDirectory(const Arguments& args);
172
  static Handle<Value> SetEnvironment(const Arguments& args);
173
  static Handle<Value> SetUMask(const Arguments& args);
174
  static Handle<Value> MakeDirectory(const Arguments& args);
175
  static Handle<Value> RemoveDirectory(const Arguments& args);
176

    
177
  static void AddOSMethods(Handle<ObjectTemplate> os_template);
178

    
179
  static Handle<Context> utility_context() { return utility_context_; }
180

    
181
  static const char* kHistoryFileName;
182
  static const char* kPrompt;
183
 private:
184
  static Persistent<Context> utility_context_;
185
  static Persistent<Context> evaluation_context_;
186
  static CounterMap* counter_map_;
187
  // We statically allocate a set of local counters to be used if we
188
  // don't want to store the stats in a memory-mapped file
189
  static CounterCollection local_counters_;
190
  static CounterCollection* counters_;
191
  static i::OS::MemoryMappedFile* counters_file_;
192
  static Counter* GetCounter(const char* name, bool is_histogram);
193
};
194

    
195

    
196
class LineEditor {
197
 public:
198
  enum Type { DUMB = 0, READLINE = 1 };
199
  LineEditor(Type type, const char* name);
200
  virtual ~LineEditor() { }
201

    
202
  virtual i::SmartPointer<char> Prompt(const char* prompt) = 0;
203
  virtual bool Open() { return true; }
204
  virtual bool Close() { return true; }
205
  virtual void AddHistory(const char* str) { }
206

    
207
  const char* name() { return name_; }
208
  static LineEditor* Get();
209
 private:
210
  Type type_;
211
  const char* name_;
212
  LineEditor* next_;
213
  static LineEditor* first_;
214
};
215

    
216

    
217
}  // namespace v8
218

    
219

    
220
#endif  // V8_D8_H_