From 310ed9ebbada92e5c498ec2fe6e406c0c646ca73 Mon Sep 17 00:00:00 2001 From: "yangguo@chromium.org" Date: Fri, 24 Jun 2011 20:04:32 +0000 Subject: [PATCH] removed some unnecessary stuff from d8's initialization and got rid of the utility context unless interactive shell is used Review URL: http://codereview.chromium.org/7219003 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@8424 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/d8-debug.cc | 2 ++ src/d8-posix.cc | 11 +------ src/d8.cc | 98 +++++++++++++++++++++++++++++++-------------------------- src/d8.h | 6 ++-- 4 files changed, 58 insertions(+), 59 deletions(-) diff --git a/src/d8-debug.cc b/src/d8-debug.cc index 8a3886c..0662205 100644 --- a/src/d8-debug.cc +++ b/src/d8-debug.cc @@ -272,6 +272,7 @@ RemoteDebuggerEvent* RemoteDebugger::GetEvent() { void RemoteDebugger::HandleMessageReceived(char* message) { + Locker lock; HandleScope scope; // Print the event details. @@ -300,6 +301,7 @@ void RemoteDebugger::HandleMessageReceived(char* message) { void RemoteDebugger::HandleKeyboardCommand(char* command) { + Locker lock; HandleScope scope; // Convert the debugger command to a JSON debugger request. diff --git a/src/d8-posix.cc b/src/d8-posix.cc index a7a4049..658fd4f 100644 --- a/src/d8-posix.cc +++ b/src/d8-posix.cc @@ -311,10 +311,6 @@ static Handle GetStdout(int child_fd, int read_timeout, int total_timeout) { Handle accumulator = String::Empty(); - const char* source = "(function(a, b) { return a + b; })"; - Handle cons_as_obj(Script::Compile(String::New(source))->Run()); - Handle cons_function(Function::Cast(*cons_as_obj)); - Handle cons_args[2]; int fullness = 0; static const int kStdoutReadBufferSize = 4096; @@ -350,12 +346,7 @@ static Handle GetStdout(int child_fd, bytes_read + fullness : LengthWithoutIncompleteUtf8(buffer, bytes_read + fullness); Handle addition = String::New(buffer, length); - cons_args[0] = accumulator; - cons_args[1] = addition; - accumulator = Handle::Cast(cons_function->Call( - Shell::utility_context()->Global(), - 2, - cons_args)); + accumulator = String::Concat(accumulator, addition); fullness = bytes_read + fullness - length; memcpy(buffer, buffer + length, fullness); } diff --git a/src/d8.cc b/src/d8.cc index 7c9aa9a..7655aad 100644 --- a/src/d8.cc +++ b/src/d8.cc @@ -489,7 +489,23 @@ void Shell::AddHistogramSample(void* histogram, int sample) { void Shell::InstallUtilityScript() { Locker lock; HandleScope scope; + // If we use the utility context, we have to set the security tokens so that + // utility, evaluation and debug context can all access each other. + utility_context_->SetSecurityToken(Undefined()); + evaluation_context_->SetSecurityToken(Undefined()); Context::Scope utility_scope(utility_context_); + +#ifdef ENABLE_DEBUGGER_SUPPORT + // Install the debugger object in the utility scope + i::Debug* debug = i::Isolate::Current()->debug(); + debug->Load(); + i::Handle js_debug + = i::Handle(debug->debug_context()->global()); + utility_context_->Global()->Set(String::New("$debug"), + Utils::ToLocal(js_debug)); + debug->debug_context()->set_security_token(HEAP->undefined_value()); +#endif + // Run the d8 shell utility script in the utility context int source_index = i::NativesCollection::GetIndex("d8"); i::Vector shell_source = @@ -514,6 +530,7 @@ void Shell::InstallUtilityScript() { script_object->set_type(i::Smi::FromInt(i::Script::TYPE_NATIVE)); } + #ifdef COMPRESS_STARTUP_DATA_BZ2 class BZip2Decompressor : public v8::StartupDataDecompressor { public: @@ -585,7 +602,8 @@ Handle Shell::CreateGlobalTemplate() { return global_template; } -void Shell::Initialize() { + +void Shell::Initialize(bool test_shell) { #ifdef COMPRESS_STARTUP_DATA_BZ2 BZip2Decompressor startup_data_decompressor; int bz2_result = startup_data_decompressor.Decompress(); @@ -605,22 +623,23 @@ void Shell::Initialize() { V8::SetAddHistogramSampleFunction(AddHistogramSample); } - // Initialize the global objects + if (test_shell) return; + + Locker lock; HandleScope scope; Handle global_template = CreateGlobalTemplate(); - utility_context_ = Context::New(NULL, global_template); - utility_context_->SetSecurityToken(Undefined()); - Context::Scope utility_scope(utility_context_); #ifdef ENABLE_DEBUGGER_SUPPORT - // Install the debugger object in the utility scope - i::Debug* debug = i::Isolate::Current()->debug(); - debug->Load(); - i::Handle js_debug - = i::Handle(debug->debug_context()->global()); - utility_context_->Global()->Set(String::New("$debug"), - Utils::ToLocal(js_debug)); + // Start the debugger agent if requested. + if (i::FLAG_debugger_agent) { + v8::Debug::EnableAgent("d8 shell", i::FLAG_debugger_port, true); + } + + // Start the in-process debugger if requested. + if (i::FLAG_debugger && !i::FLAG_debugger_agent) { + v8::Debug::SetDebugEventListener(HandleDebugEvent); + } #endif } @@ -635,9 +654,8 @@ void Shell::RenewEvaluationContext() { evaluation_context_.Dispose(); } evaluation_context_ = Context::New(NULL, global_template); - evaluation_context_->SetSecurityToken(Undefined()); + Context::Scope utility_scope(evaluation_context_); - Context::Scope utility_scope(utility_context_); i::JSArguments js_args = i::FLAG_js_arguments; i::Handle arguments_array = FACTORY->NewFixedArray(js_args.argc()); @@ -650,24 +668,6 @@ void Shell::RenewEvaluationContext() { FACTORY->NewJSArrayWithElements(arguments_array); evaluation_context_->Global()->Set(String::New("arguments"), Utils::ToLocal(arguments_jsarray)); - -#ifdef ENABLE_DEBUGGER_SUPPORT - i::Debug* debug = i::Isolate::Current()->debug(); - debug->Load(); - - // Set the security token of the debug context to allow access. - debug->debug_context()->set_security_token(HEAP->undefined_value()); - - // Start the debugger agent if requested. - if (i::FLAG_debugger_agent) { - v8::Debug::EnableAgent("d8 shell", i::FLAG_debugger_port, true); - } - - // Start the in-process debugger if requested. - if (i::FLAG_debugger && !i::FLAG_debugger_agent) { - v8::Debug::SetDebugEventListener(HandleDebugEvent); - } -#endif } @@ -753,6 +753,7 @@ void Shell::RunShell() { if (i::FLAG_debugger) { printf("JavaScript debugger enabled\n"); } + editor->Open(); while (true) { Locker locker; @@ -800,7 +801,6 @@ void ShellThread::Run() { } Persistent thread_context = Context::New(NULL, global_template); - thread_context->SetSecurityToken(Undefined()); Context::Scope context_scope(thread_context); while ((ptr != NULL) && (*ptr != '\0')) { @@ -826,7 +826,7 @@ void ShellThread::Run() { } } -int Shell::RunMain(int argc, char* argv[]) { +int Shell::RunMain(int argc, char* argv[], bool* executed) { // Default use preemption if threads are created. bool use_preemption = true; @@ -871,6 +871,7 @@ int Shell::RunMain(int argc, char* argv[]) { v8::HandleScope handle_scope; v8::Handle file_name = v8::String::New("unnamed"); v8::Handle source = v8::String::New(argv[++i]); + (*executed) = true; if (!ExecuteString(source, file_name, false, true)) { OnExit(); return 1; @@ -884,11 +885,13 @@ int Shell::RunMain(int argc, char* argv[]) { i::Vector(files, size)); thread->Start(); threads.Add(thread); + (*executed) = true; } else { // Use all other arguments as names of files to load and run. HandleScope handle_scope; Handle file_name = v8::String::New(str); Handle source = ReadFile(str); + (*executed) = true; if (source.IsEmpty()) { printf("Error reading '%s'\n", str); return 1; @@ -922,7 +925,9 @@ int Shell::Main(int argc, char* argv[]) { // optimization in the last run. bool FLAG_stress_opt = false; bool FLAG_stress_deopt = false; - bool FLAG_run_shell = false; + bool FLAG_interactive_shell = false; + bool FLAG_test_shell = false; + bool script_executed = false; for (int i = 0; i < argc; i++) { if (strcmp(argv[i], "--stress-opt") == 0) { @@ -936,18 +941,17 @@ int Shell::Main(int argc, char* argv[]) { FLAG_stress_opt = false; FLAG_stress_deopt = false; } else if (strcmp(argv[i], "--shell") == 0) { - FLAG_run_shell = true; + FLAG_interactive_shell = true; + argv[i] = NULL; + } else if (strcmp(argv[i], "--test") == 0) { + FLAG_test_shell = true; argv[i] = NULL; } } v8::V8::SetFlagsFromCommandLine(&argc, argv, true); - // Allow SetFlagsFromCommandLine to decrement argc before deciding to - // run the shell or not. - bool run_shell = FLAG_run_shell || (argc == 1); - - Initialize(); + Initialize(FLAG_test_shell); int result = 0; if (FLAG_stress_opt || FLAG_stress_deopt) { @@ -958,22 +962,26 @@ int Shell::Main(int argc, char* argv[]) { for (int i = 0; i < stress_runs && result == 0; i++) { printf("============ Stress %d/%d ============\n", i + 1, stress_runs); v8::Testing::PrepareStressRun(i); - result = RunMain(argc, argv); + result = RunMain(argc, argv, &script_executed); } printf("======== Full Deoptimization =======\n"); v8::Testing::DeoptimizeAll(); } else { - result = RunMain(argc, argv); + result = RunMain(argc, argv, &script_executed); } #ifdef ENABLE_DEBUGGER_SUPPORT - if (i::FLAG_remote_debugger) { + // Run remote debugger if requested, but never on --test + if (i::FLAG_remote_debugger && !FLAG_test_shell) { + InstallUtilityScript(); RunRemoteDebugger(i::FLAG_debugger_port); return 0; } #endif - if (run_shell) { + // Run interactive shell if explicitly requested or if no script has been + // executed, but never on --test + if ((FLAG_interactive_shell || !script_executed) && !FLAG_test_shell) { InstallUtilityScript(); RunShell(); } diff --git a/src/d8.h b/src/d8.h index e62ce38..f3760e8 100644 --- a/src/d8.h +++ b/src/d8.h @@ -129,12 +129,12 @@ class Shell: public i::AllStatic { static void AddHistogramSample(void* histogram, int sample); static void MapCounters(const char* name); static Handle ReadFile(const char* name); - static void Initialize(); + static void Initialize(bool test_shell); static void RenewEvaluationContext(); static void InstallUtilityScript(); static void RunShell(); static int RunScript(char* filename); - static int RunMain(int argc, char* argv[]); + static int RunMain(int argc, char* argv[], bool* executed); static int Main(int argc, char* argv[]); static Handle CreateGlobalTemplate(); static Handle GetCompletions(Handle text, @@ -202,8 +202,6 @@ class Shell: public i::AllStatic { static void AddOSMethods(Handle os_template); - static Handle utility_context() { return utility_context_; } - static const char* kHistoryFileName; static const char* kPrompt; -- 2.7.4