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(); |
} |