Chromium Code Reviews| Index: src/d8.cc |
| diff --git a/src/d8.cc b/src/d8.cc |
| index 56a43ad2411e375f529beca5a62dd6c2df5469ac..4a05277ec5e09e34e66210ad3b9cc8d0e6650888 100644 |
| --- a/src/d8.cc |
| +++ b/src/d8.cc |
| @@ -489,7 +489,21 @@ void Shell::AddHistogramSample(void* histogram, int sample) { |
| void Shell::InstallUtilityScript() { |
| Locker lock; |
| HandleScope scope; |
|
Søren Thygesen Gjesse
2011/06/24 11:36:09
Maybe add a comment here that when the utility con
|
| + 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<i::JSObject> js_debug |
| + = i::Handle<i::JSObject>(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<i::D8>::GetIndex("d8"); |
| i::Vector<const char> shell_source = |
| @@ -514,6 +528,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 +600,8 @@ Handle<ObjectTemplate> 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 +621,23 @@ void Shell::Initialize() { |
| V8::SetAddHistogramSampleFunction(AddHistogramSample); |
| } |
| - // Initialize the global objects |
| + if (test_shell && !i::FLAG_remote_debugger) return; |
| + |
| + Locker lock; |
| HandleScope scope; |
| Handle<ObjectTemplate> 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<i::JSObject> js_debug |
| - = i::Handle<i::JSObject>(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 +652,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<i::FixedArray> arguments_array = |
| FACTORY->NewFixedArray(js_args.argc()); |
| @@ -650,24 +666,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 +751,7 @@ void Shell::RunShell() { |
| if (i::FLAG_debugger) { |
| printf("JavaScript debugger enabled\n"); |
| } |
| + |
| editor->Open(); |
| while (true) { |
| Locker locker; |
| @@ -800,7 +799,6 @@ void ShellThread::Run() { |
| } |
| Persistent<Context> thread_context = Context::New(NULL, global_template); |
| - thread_context->SetSecurityToken(Undefined()); |
| Context::Scope context_scope(thread_context); |
| while ((ptr != NULL) && (*ptr != '\0')) { |
| @@ -826,7 +824,7 @@ void ShellThread::Run() { |
| } |
| } |
| -int Shell::RunMain(int argc, char* argv[]) { |
| +int Shell::RunMain(int argc, char* argv[], bool* executed) { |
|
Yang
2011/06/23 21:45:53
Pass this flag by reference to track whether somet
|
| // Default use preemption if threads are created. |
| bool use_preemption = true; |
| @@ -871,6 +869,7 @@ int Shell::RunMain(int argc, char* argv[]) { |
| v8::HandleScope handle_scope; |
| v8::Handle<v8::String> file_name = v8::String::New("unnamed"); |
| v8::Handle<v8::String> source = v8::String::New(argv[++i]); |
| + (*executed) = true; |
| if (!ExecuteString(source, file_name, false, true)) { |
| OnExit(); |
| return 1; |
| @@ -884,11 +883,13 @@ int Shell::RunMain(int argc, char* argv[]) { |
| i::Vector<const char>(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<String> file_name = v8::String::New(str); |
| Handle<String> source = ReadFile(str); |
| + (*executed) = true; |
| if (source.IsEmpty()) { |
| printf("Error reading '%s'\n", str); |
| return 1; |
| @@ -922,7 +923,9 @@ int Shell::Main(int argc, char* argv[]) { |
| // optimization in the last run. |
| bool FLAG_stress_opt = false; |
| bool FLAG_stress_deopt = false; |
| - bool run_shell = (argc == 1); |
| + bool FLAG_interactive_shell = false; |
| + bool FLAG_test_shell = false; |
| + bool FLAG_executed = false; |
|
Søren Thygesen Gjesse
2011/06/24 11:36:09
FLAG_executed -> executed or script_executed. It i
|
| for (int i = 0; i < argc; i++) { |
| if (strcmp(argv[i], "--stress-opt") == 0) { |
| @@ -936,14 +939,17 @@ int Shell::Main(int argc, char* argv[]) { |
| FLAG_stress_opt = false; |
| FLAG_stress_deopt = false; |
| } else if (strcmp(argv[i], "--shell") == 0) { |
| - 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); |
| - Initialize(); |
| + Initialize(FLAG_test_shell); |
| int result = 0; |
| if (FLAG_stress_opt || FLAG_stress_deopt) { |
| @@ -954,22 +960,25 @@ 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, &FLAG_executed); |
| } |
| printf("======== Full Deoptimization =======\n"); |
| v8::Testing::DeoptimizeAll(); |
| } else { |
| - result = RunMain(argc, argv); |
| + result = RunMain(argc, argv, &FLAG_executed); |
| } |
| #ifdef ENABLE_DEBUGGER_SUPPORT |
| if (i::FLAG_remote_debugger) { |
| + 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 || !FLAG_executed) && !FLAG_test_shell) { |
| InstallUtilityScript(); |
| RunShell(); |
| } |