diff options
Diffstat (limited to 'deps/v8/src/d8.cc')
-rw-r--r-- | deps/v8/src/d8.cc | 180 |
1 files changed, 91 insertions, 89 deletions
diff --git a/deps/v8/src/d8.cc b/deps/v8/src/d8.cc index f4ace87eb3..3b9c183c2a 100644 --- a/deps/v8/src/d8.cc +++ b/deps/v8/src/d8.cc @@ -26,8 +26,8 @@ // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -#ifdef V8_SHARED -#define USING_V8_SHARED +#ifdef USING_V8_SHARED // Defined when linking against shared lib on Windows. +#define V8_SHARED #endif #ifdef COMPRESS_STARTUP_DATA_BZ2 @@ -37,15 +37,16 @@ #include <errno.h> #include <stdlib.h> #include <string.h> +#include <sys/stat.h> -#ifdef USING_V8_SHARED +#ifdef V8_SHARED #include <assert.h> #include "../include/v8-testing.h" -#endif // USING_V8_SHARED +#endif // V8_SHARED #include "d8.h" -#ifndef USING_V8_SHARED +#ifndef V8_SHARED #include "api.h" #include "checks.h" #include "d8-debug.h" @@ -53,20 +54,20 @@ #include "natives.h" #include "platform.h" #include "v8.h" -#endif // USING_V8_SHARED +#endif // V8_SHARED #if !defined(_WIN32) && !defined(_WIN64) #include <unistd.h> // NOLINT #endif -#ifdef USING_V8_SHARED +#ifndef ASSERT #define ASSERT(condition) assert(condition) -#endif // USING_V8_SHARED +#endif namespace v8 { -#ifndef USING_V8_SHARED +#ifndef V8_SHARED LineEditor *LineEditor::first_ = NULL; const char* Shell::kHistoryFileName = ".d8_history"; @@ -116,20 +117,20 @@ CounterCollection Shell::local_counters_; CounterCollection* Shell::counters_ = &local_counters_; i::Mutex* Shell::context_mutex_(i::OS::CreateMutex()); Persistent<Context> Shell::utility_context_; -#endif // USING_V8_SHARED +#endif // V8_SHARED Persistent<Context> Shell::evaluation_context_; ShellOptions Shell::options; const char* Shell::kPrompt = "d8> "; -#ifndef USING_V8_SHARED +#ifndef V8_SHARED bool CounterMap::Match(void* key1, void* key2) { const char* name1 = reinterpret_cast<const char*>(key1); const char* name2 = reinterpret_cast<const char*>(key2); return strcmp(name1, name2) == 0; } -#endif // USING_V8_SHARED +#endif // V8_SHARED // Converts a V8 value to a C string. @@ -143,11 +144,11 @@ bool Shell::ExecuteString(Handle<String> source, Handle<Value> name, bool print_result, bool report_exceptions) { -#ifndef USING_V8_SHARED +#ifndef V8_SHARED bool FLAG_debugger = i::FLAG_debugger; #else bool FLAG_debugger = false; -#endif // USING_V8_SHARED +#endif // V8_SHARED HandleScope handle_scope; TryCatch try_catch; options.script_executed = true; @@ -276,9 +277,9 @@ Handle<Value> Shell::CreateExternalArray(const Arguments& args, String::New("Array constructor needs one parameter.")); } static const int kMaxLength = 0x3fffffff; -#ifndef USING_V8_SHARED +#ifndef V8_SHARED ASSERT(kMaxLength == i::ExternalArray::kMaxLength); -#endif // USING_V8_SHARED +#endif // V8_SHARED size_t length = 0; if (args[0]->IsUint32()) { length = args[0]->Uint32Value(); @@ -378,9 +379,9 @@ Handle<Value> Shell::Yield(const Arguments& args) { Handle<Value> Shell::Quit(const Arguments& args) { int exit_code = args[0]->Int32Value(); -#ifndef USING_V8_SHARED +#ifndef V8_SHARED OnExit(); -#endif // USING_V8_SHARED +#endif // V8_SHARED exit(exit_code); return Undefined(); } @@ -429,7 +430,7 @@ void Shell::ReportException(v8::TryCatch* try_catch) { } -#ifndef USING_V8_SHARED +#ifndef V8_SHARED Handle<Array> Shell::GetCompletions(Handle<String> text, Handle<String> full) { HandleScope handle_scope; Context::Scope context_scope(utility_context_); @@ -464,10 +465,10 @@ Handle<Value> Shell::DebugCommandToJSONRequest(Handle<String> command) { return val; } #endif // ENABLE_DEBUGGER_SUPPORT -#endif // USING_V8_SHARED +#endif // V8_SHARED -#ifndef USING_V8_SHARED +#ifndef V8_SHARED int32_t* Counter::Bind(const char* name, bool is_histogram) { int i; for (i = 0; i < kMaxNameSize - 1 && name[i]; i++) @@ -615,7 +616,7 @@ void Shell::InstallUtilityScript() { } #endif // ENABLE_DEBUGGER_SUPPORT } -#endif // USING_V8_SHARED +#endif // V8_SHARED #ifdef COMPRESS_STARTUP_DATA_BZ2 @@ -682,11 +683,11 @@ Handle<ObjectTemplate> Shell::CreateGlobalTemplate() { global_template->Set(String::New("lol_is_enabled"), Boolean::New(false)); #endif -#ifndef USING_V8_SHARED +#ifndef V8_SHARED Handle<ObjectTemplate> os_templ = ObjectTemplate::New(); AddOSMethods(os_templ); global_template->Set(String::New("os"), os_templ); -#endif // USING_V8_SHARED +#endif // V8_SHARED return global_template; } @@ -702,7 +703,7 @@ void Shell::Initialize() { } #endif -#ifndef USING_V8_SHARED +#ifndef V8_SHARED Shell::counter_map_ = new CounterMap(); // Set up counters if (i::StrLength(i::FLAG_map_counters) != 0) @@ -712,10 +713,10 @@ void Shell::Initialize() { V8::SetCreateHistogramFunction(CreateHistogram); V8::SetAddHistogramSampleFunction(AddHistogramSample); } -#endif // USING_V8_SHARED +#endif // V8_SHARED if (options.test_shell) return; -#ifndef USING_V8_SHARED +#ifndef V8_SHARED Locker lock; HandleScope scope; Handle<ObjectTemplate> global_template = CreateGlobalTemplate(); @@ -727,21 +728,21 @@ void Shell::Initialize() { v8::Debug::EnableAgent("d8 shell", i::FLAG_debugger_port, true); } #endif // ENABLE_DEBUGGER_SUPPORT -#endif // USING_V8_SHARED +#endif // V8_SHARED } Persistent<Context> Shell::CreateEvaluationContext() { -#ifndef USING_V8_SHARED +#ifndef V8_SHARED // This needs to be a critical section since this is not thread-safe i::ScopedLock lock(context_mutex_); -#endif // USING_V8_SHARED +#endif // V8_SHARED // Initialize the global objects Handle<ObjectTemplate> global_template = CreateGlobalTemplate(); Persistent<Context> context = Context::New(NULL, global_template); Context::Scope scope(context); -#ifndef USING_V8_SHARED +#ifndef V8_SHARED i::JSArguments js_args = i::FLAG_js_arguments; i::Handle<i::FixedArray> arguments_array = FACTORY->NewFixedArray(js_args.argc()); @@ -754,12 +755,12 @@ Persistent<Context> Shell::CreateEvaluationContext() { FACTORY->NewJSArrayWithElements(arguments_array); context->Global()->Set(String::New("arguments"), Utils::ToLocal(arguments_jsarray)); -#endif // USING_V8_SHARED +#endif // V8_SHARED return context; } -#ifndef USING_V8_SHARED +#ifndef V8_SHARED void Shell::OnExit() { if (i::FLAG_dump_counters) { printf("+----------------------------------------+-------------+\n"); @@ -779,18 +780,34 @@ void Shell::OnExit() { if (counters_file_ != NULL) delete counters_file_; } -#endif // USING_V8_SHARED +#endif // V8_SHARED + + +static FILE* FOpen(const char* path, const char* mode) { +#if (defined(_WIN32) || defined(_WIN64)) + FILE* result; + if (fopen_s(&result, path, mode) == 0) { + return result; + } else { + return NULL; + } +#else + FILE* file = fopen(path, mode); + if (file == NULL) return NULL; + struct stat file_stat; + if (fstat(fileno(file), &file_stat) != 0) return NULL; + bool is_regular_file = ((file_stat.st_mode & S_IFREG) != 0); + if (is_regular_file) return file; + fclose(file); + return NULL; +#endif +} static char* ReadChars(const char* name, int* size_out) { // Release the V8 lock while reading files. v8::Unlocker unlocker(Isolate::GetCurrent()); -#ifndef USING_V8_SHARED - FILE* file = i::OS::FOpen(name, "rb"); -#else - // TODO(yangguo@chromium.org): reading from a directory hangs! - FILE* file = fopen(name, "rb"); -#endif // USING_V8_SHARED + FILE* file = FOpen(name, "rb"); if (file == NULL) return NULL; fseek(file, 0, SEEK_END); @@ -809,7 +826,7 @@ static char* ReadChars(const char* name, int* size_out) { } -#ifndef USING_V8_SHARED +#ifndef V8_SHARED static char* ReadToken(char* data, char token) { char* next = i::OS::StrChr(data, token); if (next != NULL) { @@ -829,7 +846,7 @@ static char* ReadLine(char* data) { static char* ReadWord(char* data) { return ReadToken(data, ' '); } -#endif // USING_V8_SHARED +#endif // V8_SHARED // Reads a file into a v8 string. @@ -848,7 +865,7 @@ void Shell::RunShell() { Context::Scope context_scope(evaluation_context_); HandleScope handle_scope; Handle<String> name = String::New("(d8)"); -#ifndef USING_V8_SHARED +#ifndef V8_SHARED LineEditor* editor = LineEditor::Get(); printf("V8 version %s [console: %s]\n", V8::GetVersion(), editor->name()); if (i::FLAG_debugger) { @@ -871,12 +888,12 @@ void Shell::RunShell() { if (fgets(buffer, kBufferSize, stdin) == NULL) break; ExecuteString(String::New(buffer), name, true, true); } -#endif // USING_V8_SHARED +#endif // V8_SHARED printf("\n"); } -#ifndef USING_V8_SHARED +#ifndef V8_SHARED class ShellThread : public i::Thread { public: ShellThread(int no, i::Vector<const char> files) @@ -929,7 +946,7 @@ void ShellThread::Run() { ptr = next_line; } } -#endif // USING_V8_SHARED +#endif // V8_SHARED void SourceGroup::ExitShell(int exit_code) { @@ -976,32 +993,16 @@ void SourceGroup::Execute() { Handle<String> SourceGroup::ReadFile(const char* name) { -#ifndef USING_V8_SHARED - FILE* file = i::OS::FOpen(name, "rb"); -#else - // TODO(yangguo@chromium.org): reading from a directory hangs! - FILE* file = fopen(name, "rb"); -#endif // USING_V8_SHARED - if (file == NULL) return Handle<String>(); - - fseek(file, 0, SEEK_END); - int size = ftell(file); - rewind(file); - - char* chars = new char[size + 1]; - chars[size] = '\0'; - for (int i = 0; i < size;) { - int read = static_cast<int>(fread(&chars[i], 1, size - i, file)); - i += read; - } - fclose(file); + int size; + const char* chars = ReadChars(name, &size); + if (chars == NULL) return Handle<String>(); Handle<String> result = String::New(chars, size); delete[] chars; return result; } -#ifndef USING_V8_SHARED +#ifndef V8_SHARED i::Thread::Options SourceGroup::GetThreadOptions() { i::Thread::Options options; options.name = "IsolateThread"; @@ -1053,7 +1054,7 @@ void SourceGroup::WaitForThread() { done_semaphore_->Wait(); } } -#endif // USING_V8_SHARED +#endif // V8_SHARED bool Shell::SetOptions(int argc, char* argv[]) { @@ -1075,23 +1076,23 @@ bool Shell::SetOptions(int argc, char* argv[]) { options.test_shell = true; argv[i] = NULL; } else if (strcmp(argv[i], "--preemption") == 0) { -#ifdef USING_V8_SHARED +#ifdef V8_SHARED printf("D8 with shared library does not support multi-threading\n"); return false; #else options.use_preemption = true; argv[i] = NULL; -#endif // USING_V8_SHARED +#endif // V8_SHARED } else if (strcmp(argv[i], "--no-preemption") == 0) { -#ifdef USING_V8_SHARED +#ifdef V8_SHARED printf("D8 with shared library does not support multi-threading\n"); return false; #else options.use_preemption = false; argv[i] = NULL; -#endif // USING_V8_SHARED +#endif // V8_SHARED } else if (strcmp(argv[i], "--preemption-interval") == 0) { -#ifdef USING_V8_SHARED +#ifdef V8_SHARED printf("D8 with shared library does not support multi-threading\n"); return false; #else @@ -1110,19 +1111,19 @@ bool Shell::SetOptions(int argc, char* argv[]) { printf("Missing value for --preemption-interval\n"); return false; } -#endif // USING_V8_SHARED +#endif // V8_SHARED } else if (strcmp(argv[i], "-f") == 0) { // Ignore any -f flags for compatibility with other stand-alone // JavaScript engines. continue; } else if (strcmp(argv[i], "--isolate") == 0) { -#ifdef USING_V8_SHARED +#ifdef V8_SHARED printf("D8 with shared library does not support multi-threading\n"); return false; -#endif // USING_V8_SHARED +#endif // V8_SHARED options.num_isolates++; } -#ifdef USING_V8_SHARED +#ifdef V8_SHARED else if (strcmp(argv[i], "--dump-counters") == 0) { printf("D8 with shared library does not include counters\n"); return false; @@ -1133,10 +1134,10 @@ bool Shell::SetOptions(int argc, char* argv[]) { printf("Javascript debugger not included\n"); return false; } -#endif // USING_V8_SHARED +#endif // V8_SHARED } -#ifndef USING_V8_SHARED +#ifndef V8_SHARED // Run parallel threads if we are not using --isolate for (int i = 1; i < argc; i++) { if (argv[i] == NULL) continue; @@ -1157,9 +1158,10 @@ bool Shell::SetOptions(int argc, char* argv[]) { } argv[i] = NULL; options.parallel_files->Add(i::Vector<const char>(files, size)); + delete[] files; } } -#endif // USING_V8_SHARED +#endif // V8_SHARED v8::V8::SetFlagsFromCommandLine(&argc, argv, true); @@ -1184,7 +1186,7 @@ bool Shell::SetOptions(int argc, char* argv[]) { int Shell::RunMain(int argc, char* argv[]) { -#ifndef USING_V8_SHARED +#ifndef V8_SHARED i::List<i::Thread*> threads(1); if (options.parallel_files != NULL) for (int i = 0; i < options.parallel_files->length(); i++) { @@ -1197,7 +1199,7 @@ int Shell::RunMain(int argc, char* argv[]) { for (int i = 1; i < options.num_isolates; ++i) { options.isolate_sources[i].StartExecuteInThread(); } -#endif // USING_V8_SHARED +#endif // V8_SHARED { // NOLINT Locker lock; HandleScope scope; @@ -1213,17 +1215,17 @@ int Shell::RunMain(int argc, char* argv[]) { context.Dispose(); } -#ifndef USING_V8_SHARED +#ifndef V8_SHARED // Start preemption if threads have been created and preemption is enabled. if (options.parallel_files != NULL && threads.length() > 0 && options.use_preemption) { Locker::StartPreemption(options.preemption_interval); } -#endif // USING_V8_SHARED +#endif // V8_SHARED } -#ifndef USING_V8_SHARED +#ifndef V8_SHARED for (int i = 1; i < options.num_isolates; ++i) { options.isolate_sources[i].WaitForThread(); } @@ -1236,7 +1238,7 @@ int Shell::RunMain(int argc, char* argv[]) { } OnExit(); -#endif // USING_V8_SHARED +#endif // V8_SHARED return 0; } @@ -1264,14 +1266,14 @@ int Shell::Main(int argc, char* argv[]) { } -#if !defined(USING_V8_SHARED) && defined(ENABLE_DEBUGGER_SUPPORT) +#if !defined(V8_SHARED) && defined(ENABLE_DEBUGGER_SUPPORT) // Run remote debugger if requested, but never on --test if (i::FLAG_remote_debugger && !options.test_shell) { InstallUtilityScript(); RunRemoteDebugger(i::FLAG_debugger_port); return 0; } -#endif // !USING_V8_SHARED && ENABLE_DEBUGGER_SUPPORT +#endif // !V8_SHARED && ENABLE_DEBUGGER_SUPPORT // Run interactive shell if explicitly requested or if no script has been // executed, but never on --test @@ -1279,9 +1281,9 @@ int Shell::Main(int argc, char* argv[]) { if (( options.interactive_shell || !options.script_executed ) && !options.test_shell ) { -#ifndef USING_V8_SHARED +#ifndef V8_SHARED InstallUtilityScript(); -#endif // USING_V8_SHARED +#endif // V8_SHARED RunShell(); } |