00001 // Copyright 2008 the V8 project authors. All rights reserved. 00002 // Redistribution and use in source and binary forms, with or without 00003 // modification, are permitted provided that the following conditions are 00004 // met: 00005 // 00006 // * Redistributions of source code must retain the above copyright 00007 // notice, this list of conditions and the following disclaimer. 00008 // * Redistributions in binary form must reproduce the above 00009 // copyright notice, this list of conditions and the following 00010 // disclaimer in the documentation and/or other materials provided 00011 // with the distribution. 00012 // * Neither the name of Google Inc. nor the names of its 00013 // contributors may be used to endorse or promote products derived 00014 // from this software without specific prior written permission. 00015 // 00016 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 00017 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 00018 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 00019 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 00020 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 00021 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 00022 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 00023 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 00024 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 00025 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 00026 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 00027 00028 #ifndef V8_D8_H_ 00029 #define V8_D8_H_ 00030 00031 00032 // Disable exceptions on windows to not generate warnings from <map>. 00033 #define _HAS_EXCEPTIONS 0 00034 #include <map> 00035 00036 #include "v8.h" 00037 00038 00039 namespace v8 { 00040 00041 00042 namespace i = v8::internal; 00043 00044 00045 class Counter { 00046 public: 00047 explicit Counter(const wchar_t* name) 00048 : name_(name), value_(0) { } 00049 int* GetValuePtr() { return &value_; } 00050 const wchar_t* name() { return name_; } 00051 int value() { return value_; } 00052 private: 00053 const wchar_t* name_; 00054 int value_; 00055 }; 00056 00057 00058 class Shell: public i::AllStatic { 00059 public: 00060 static bool ExecuteString(Handle<String> source, 00061 Handle<Value> name, 00062 bool print_result, 00063 bool report_exceptions); 00064 static void ReportException(TryCatch* try_catch); 00065 static void Initialize(); 00066 static void OnExit(); 00067 static int* LookupCounter(const wchar_t* name); 00068 static Handle<String> ReadFile(const char* name); 00069 static void RunShell(); 00070 static int Main(int argc, char* argv[]); 00071 static Handle<Array> GetCompletions(Handle<String> text, 00072 Handle<String> full); 00073 00074 static Handle<Value> Print(const Arguments& args); 00075 static Handle<Value> Quit(const Arguments& args); 00076 static Handle<Value> Version(const Arguments& args); 00077 static Handle<Value> Load(const Arguments& args); 00078 00079 static const char* kHistoryFileName; 00080 static const char* kPrompt; 00081 private: 00082 static Persistent<Context> utility_context_; 00083 static Persistent<Context> evaluation_context_; 00084 typedef std::map<const wchar_t*, Counter*> CounterMap; 00085 static CounterMap counter_map_; 00086 }; 00087 00088 00089 class LineEditor { 00090 public: 00091 enum Type { DUMB = 0, READLINE = 1 }; 00092 LineEditor(Type type, const char* name); 00093 virtual ~LineEditor() { } 00094 00095 virtual i::SmartPointer<char> Prompt(const char* prompt) = 0; 00096 virtual bool Open() { return true; } 00097 virtual bool Close() { return true; } 00098 virtual void AddHistory(const char* str) { } 00099 00100 const char* name() { return name_; } 00101 static LineEditor* Get(); 00102 private: 00103 Type type_; 00104 const char* name_; 00105 LineEditor* next_; 00106 static LineEditor* first_; 00107 }; 00108 00109 00110 } // namespace v8 00111 00112 00113 #endif // V8_D8_H_