Revision: 8424
Author:   [email protected]
Date:     Fri Jun 24 13:04:32 2011
Log:      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
http://code.google.com/p/v8/source/detail?r=8424

Modified:
 /branches/bleeding_edge/src/d8-debug.cc
 /branches/bleeding_edge/src/d8-posix.cc
 /branches/bleeding_edge/src/d8.cc
 /branches/bleeding_edge/src/d8.h

=======================================
--- /branches/bleeding_edge/src/d8-debug.cc     Fri Jun 10 05:41:35 2011
+++ /branches/bleeding_edge/src/d8-debug.cc     Fri Jun 24 13:04:32 2011
@@ -272,6 +272,7 @@


 void RemoteDebugger::HandleMessageReceived(char* message) {
+  Locker lock;
   HandleScope scope;

   // Print the event details.
@@ -300,6 +301,7 @@


 void RemoteDebugger::HandleKeyboardCommand(char* command) {
+  Locker lock;
   HandleScope scope;

   // Convert the debugger command to a JSON debugger request.
=======================================
--- /branches/bleeding_edge/src/d8-posix.cc     Wed Mar 16 04:15:43 2011
+++ /branches/bleeding_edge/src/d8-posix.cc     Fri Jun 24 13:04:32 2011
@@ -311,10 +311,6 @@
                                int read_timeout,
                                int total_timeout) {
   Handle<String> accumulator = String::Empty();
-  const char* source = "(function(a, b) { return a + b; })";
-  Handle<Value> cons_as_obj(Script::Compile(String::New(source))->Run());
-  Handle<Function> cons_function(Function::Cast(*cons_as_obj));
-  Handle<Value> cons_args[2];

   int fullness = 0;
   static const int kStdoutReadBufferSize = 4096;
@@ -350,12 +346,7 @@
                    bytes_read + fullness :
LengthWithoutIncompleteUtf8(buffer, bytes_read + fullness);
       Handle<String> addition = String::New(buffer, length);
-      cons_args[0] = accumulator;
-      cons_args[1] = addition;
-      accumulator = Handle<String>::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);
     }
=======================================
--- /branches/bleeding_edge/src/d8.cc   Wed Jun 22 10:32:35 2011
+++ /branches/bleeding_edge/src/d8.cc   Fri Jun 24 13:04:32 2011
@@ -489,7 +489,23 @@
 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<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 =
@@ -513,6 +529,7 @@
          i::SharedFunctionInfo::cast(*compiled_script)->script()));
   script_object->set_type(i::Smi::FromInt(i::Script::TYPE_NATIVE));
 }
+

 #ifdef COMPRESS_STARTUP_DATA_BZ2
 class BZip2Decompressor : public v8::StartupDataDecompressor {
@@ -585,7 +602,8 @@
   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 @@
     V8::SetAddHistogramSampleFunction(AddHistogramSample);
   }

-  // Initialize the global objects
+  if (test_shell) 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 +654,8 @@
     evaluation_context_.Dispose();
   }
   evaluation_context_ = Context::New(NULL, global_template);
-  evaluation_context_->SetSecurityToken(Undefined());
-
-  Context::Scope utility_scope(utility_context_);
+  Context::Scope utility_scope(evaluation_context_);
+
   i::JSArguments js_args = i::FLAG_js_arguments;
   i::Handle<i::FixedArray> arguments_array =
       FACTORY->NewFixedArray(js_args.argc());
@@ -650,24 +668,6 @@
       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 @@
   if (i::FLAG_debugger) {
     printf("JavaScript debugger enabled\n");
   }
+
   editor->Open();
   while (true) {
     Locker locker;
@@ -800,7 +801,6 @@
     }

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 +826,7 @@
   }
 }

-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 @@
         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 +885,13 @@
                             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 +925,9 @@
   // 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 @@
       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 @@
     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();
   }
=======================================
--- /branches/bleeding_edge/src/d8.h    Thu Jun  9 07:28:49 2011
+++ /branches/bleeding_edge/src/d8.h    Fri Jun 24 13:04:32 2011
@@ -129,12 +129,12 @@
   static void AddHistogramSample(void* histogram, int sample);
   static void MapCounters(const char* name);
   static Handle<String> 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<ObjectTemplate> CreateGlobalTemplate();
   static Handle<Array> GetCompletions(Handle<String> text,
@@ -201,8 +201,6 @@
   static Handle<Value> RemoveDirectory(const Arguments& args);

   static void AddOSMethods(Handle<ObjectTemplate> os_template);
-
-  static Handle<Context> utility_context() { return utility_context_; }

   static const char* kHistoryFileName;
   static const char* kPrompt;

--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev

Reply via email to