| OLD | NEW | 
|     1 // Copyright 2011 the V8 project authors. All rights reserved. |     1 // Copyright 2011 the V8 project authors. All rights reserved. | 
|     2 // Redistribution and use in source and binary forms, with or without |     2 // Redistribution and use in source and binary forms, with or without | 
|     3 // modification, are permitted provided that the following conditions are |     3 // modification, are permitted provided that the following conditions are | 
|     4 // met: |     4 // met: | 
|     5 // |     5 // | 
|     6 //     * Redistributions of source code must retain the above copyright |     6 //     * Redistributions of source code must retain the above copyright | 
|     7 //       notice, this list of conditions and the following disclaimer. |     7 //       notice, this list of conditions and the following disclaimer. | 
|     8 //     * Redistributions in binary form must reproduce the above |     8 //     * Redistributions in binary form must reproduce the above | 
|     9 //       copyright notice, this list of conditions and the following |     9 //       copyright notice, this list of conditions and the following | 
|    10 //       disclaimer in the documentation and/or other materials provided |    10 //       disclaimer in the documentation and/or other materials provided | 
|    11 //       with the distribution. |    11 //       with the distribution. | 
|    12 //     * Neither the name of Google Inc. nor the names of its |    12 //     * Neither the name of Google Inc. nor the names of its | 
|    13 //       contributors may be used to endorse or promote products derived |    13 //       contributors may be used to endorse or promote products derived | 
|    14 //       from this software without specific prior written permission. |    14 //       from this software without specific prior written permission. | 
|    15 // |    15 // | 
|    16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |    16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | 
|    17 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |    17 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | 
|    18 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |    18 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | 
|    19 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |    19 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | 
|    20 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |    20 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | 
|    21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |    21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | 
|    22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |    22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | 
|    23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |    23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 
|    24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |    24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 
|    25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |    25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 
|    26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |    26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 
|    27  |    27  | 
|    28  |    28  | 
|    29 #ifdef V8_SHARED |    29 #ifdef USING_V8_SHARED  // Defined when linking against shared lib on Windows. | 
|    30 #define USING_V8_SHARED |    30 #define V8_SHARED | 
|    31 #endif |    31 #endif | 
|    32  |    32  | 
|    33 #ifdef COMPRESS_STARTUP_DATA_BZ2 |    33 #ifdef COMPRESS_STARTUP_DATA_BZ2 | 
|    34 #include <bzlib.h> |    34 #include <bzlib.h> | 
|    35 #endif |    35 #endif | 
|    36  |    36  | 
|    37 #include <errno.h> |    37 #include <errno.h> | 
|    38 #include <stdlib.h> |    38 #include <stdlib.h> | 
|    39 #include <string.h> |    39 #include <string.h> | 
 |    40 #include <sys/stat.h> | 
|    40  |    41  | 
|    41 #ifdef USING_V8_SHARED |    42 #ifdef V8_SHARED | 
|    42 #include <assert.h> |    43 #include <assert.h> | 
|    43 #include "../include/v8-testing.h" |    44 #include "../include/v8-testing.h" | 
|    44 #endif  // USING_V8_SHARED |    45 #endif  // V8_SHARED | 
|    45  |    46  | 
|    46 #include "d8.h" |    47 #include "d8.h" | 
|    47  |    48  | 
|    48 #ifndef USING_V8_SHARED |    49 #ifndef V8_SHARED | 
|    49 #include "api.h" |    50 #include "api.h" | 
|    50 #include "checks.h" |    51 #include "checks.h" | 
|    51 #include "d8-debug.h" |    52 #include "d8-debug.h" | 
|    52 #include "debug.h" |    53 #include "debug.h" | 
|    53 #include "natives.h" |    54 #include "natives.h" | 
|    54 #include "platform.h" |    55 #include "platform.h" | 
|    55 #include "v8.h" |    56 #include "v8.h" | 
|    56 #endif  // USING_V8_SHARED |    57 #endif  // V8_SHARED | 
|    57  |    58  | 
|    58 #if !defined(_WIN32) && !defined(_WIN64) |    59 #if !defined(_WIN32) && !defined(_WIN64) | 
|    59 #include <unistd.h>  // NOLINT |    60 #include <unistd.h>  // NOLINT | 
|    60 #endif |    61 #endif | 
|    61  |    62  | 
|    62 #ifdef USING_V8_SHARED |    63 #ifndef ASSERT | 
|    63 #define ASSERT(condition) assert(condition) |    64 #define ASSERT(condition) assert(condition) | 
|    64 #endif  // USING_V8_SHARED |    65 #endif | 
|    65  |    66  | 
|    66 namespace v8 { |    67 namespace v8 { | 
|    67  |    68  | 
|    68  |    69  | 
|    69 #ifndef USING_V8_SHARED |    70 #ifndef V8_SHARED | 
|    70 LineEditor *LineEditor::first_ = NULL; |    71 LineEditor *LineEditor::first_ = NULL; | 
|    71 const char* Shell::kHistoryFileName = ".d8_history"; |    72 const char* Shell::kHistoryFileName = ".d8_history"; | 
|    72  |    73  | 
|    73  |    74  | 
|    74 LineEditor::LineEditor(Type type, const char* name) |    75 LineEditor::LineEditor(Type type, const char* name) | 
|    75     : type_(type), |    76     : type_(type), | 
|    76       name_(name), |    77       name_(name), | 
|    77       next_(first_) { |    78       next_(first_) { | 
|    78   first_ = this; |    79   first_ = this; | 
|    79 } |    80 } | 
| (...skipping 29 matching lines...) Expand all  Loading... | 
|   109   return i::SmartPointer<char>(str ? i::StrDup(str) : str); |   110   return i::SmartPointer<char>(str ? i::StrDup(str) : str); | 
|   110 } |   111 } | 
|   111  |   112  | 
|   112  |   113  | 
|   113 CounterMap* Shell::counter_map_; |   114 CounterMap* Shell::counter_map_; | 
|   114 i::OS::MemoryMappedFile* Shell::counters_file_ = NULL; |   115 i::OS::MemoryMappedFile* Shell::counters_file_ = NULL; | 
|   115 CounterCollection Shell::local_counters_; |   116 CounterCollection Shell::local_counters_; | 
|   116 CounterCollection* Shell::counters_ = &local_counters_; |   117 CounterCollection* Shell::counters_ = &local_counters_; | 
|   117 i::Mutex* Shell::context_mutex_(i::OS::CreateMutex()); |   118 i::Mutex* Shell::context_mutex_(i::OS::CreateMutex()); | 
|   118 Persistent<Context> Shell::utility_context_; |   119 Persistent<Context> Shell::utility_context_; | 
|   119 #endif  // USING_V8_SHARED |   120 #endif  // V8_SHARED | 
|   120  |   121  | 
|   121 Persistent<Context> Shell::evaluation_context_; |   122 Persistent<Context> Shell::evaluation_context_; | 
|   122 ShellOptions Shell::options; |   123 ShellOptions Shell::options; | 
|   123 const char* Shell::kPrompt = "d8> "; |   124 const char* Shell::kPrompt = "d8> "; | 
|   124  |   125  | 
|   125  |   126  | 
|   126 #ifndef USING_V8_SHARED |   127 #ifndef V8_SHARED | 
|   127 bool CounterMap::Match(void* key1, void* key2) { |   128 bool CounterMap::Match(void* key1, void* key2) { | 
|   128   const char* name1 = reinterpret_cast<const char*>(key1); |   129   const char* name1 = reinterpret_cast<const char*>(key1); | 
|   129   const char* name2 = reinterpret_cast<const char*>(key2); |   130   const char* name2 = reinterpret_cast<const char*>(key2); | 
|   130   return strcmp(name1, name2) == 0; |   131   return strcmp(name1, name2) == 0; | 
|   131 } |   132 } | 
|   132 #endif  // USING_V8_SHARED |   133 #endif  // V8_SHARED | 
|   133  |   134  | 
|   134  |   135  | 
|   135 // Converts a V8 value to a C string. |   136 // Converts a V8 value to a C string. | 
|   136 const char* Shell::ToCString(const v8::String::Utf8Value& value) { |   137 const char* Shell::ToCString(const v8::String::Utf8Value& value) { | 
|   137   return *value ? *value : "<string conversion failed>"; |   138   return *value ? *value : "<string conversion failed>"; | 
|   138 } |   139 } | 
|   139  |   140  | 
|   140  |   141  | 
|   141 // Executes a string within the current v8 context. |   142 // Executes a string within the current v8 context. | 
|   142 bool Shell::ExecuteString(Handle<String> source, |   143 bool Shell::ExecuteString(Handle<String> source, | 
|   143                           Handle<Value> name, |   144                           Handle<Value> name, | 
|   144                           bool print_result, |   145                           bool print_result, | 
|   145                           bool report_exceptions) { |   146                           bool report_exceptions) { | 
|   146 #ifndef USING_V8_SHARED |   147 #ifndef V8_SHARED | 
|   147   bool FLAG_debugger = i::FLAG_debugger; |   148   bool FLAG_debugger = i::FLAG_debugger; | 
|   148 #else |   149 #else | 
|   149   bool FLAG_debugger = false; |   150   bool FLAG_debugger = false; | 
|   150 #endif  // USING_V8_SHARED |   151 #endif  // V8_SHARED | 
|   151   HandleScope handle_scope; |   152   HandleScope handle_scope; | 
|   152   TryCatch try_catch; |   153   TryCatch try_catch; | 
|   153   options.script_executed = true; |   154   options.script_executed = true; | 
|   154   if (FLAG_debugger) { |   155   if (FLAG_debugger) { | 
|   155     // When debugging make exceptions appear to be uncaught. |   156     // When debugging make exceptions appear to be uncaught. | 
|   156     try_catch.SetVerbose(true); |   157     try_catch.SetVerbose(true); | 
|   157   } |   158   } | 
|   158   Handle<Script> script = Script::Compile(source, name); |   159   Handle<Script> script = Script::Compile(source, name); | 
|   159   if (script.IsEmpty()) { |   160   if (script.IsEmpty()) { | 
|   160     // Print errors that happened during compilation. |   161     // Print errors that happened during compilation. | 
| (...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   269 Handle<Value> Shell::CreateExternalArray(const Arguments& args, |   270 Handle<Value> Shell::CreateExternalArray(const Arguments& args, | 
|   270                                          ExternalArrayType type, |   271                                          ExternalArrayType type, | 
|   271                                          size_t element_size) { |   272                                          size_t element_size) { | 
|   272   ASSERT(element_size == 1 || element_size == 2 || element_size == 4 || |   273   ASSERT(element_size == 1 || element_size == 2 || element_size == 4 || | 
|   273          element_size == 8); |   274          element_size == 8); | 
|   274   if (args.Length() != 1) { |   275   if (args.Length() != 1) { | 
|   275     return ThrowException( |   276     return ThrowException( | 
|   276         String::New("Array constructor needs one parameter.")); |   277         String::New("Array constructor needs one parameter.")); | 
|   277   } |   278   } | 
|   278   static const int kMaxLength = 0x3fffffff; |   279   static const int kMaxLength = 0x3fffffff; | 
|   279 #ifndef USING_V8_SHARED |   280 #ifndef V8_SHARED | 
|   280   ASSERT(kMaxLength == i::ExternalArray::kMaxLength); |   281   ASSERT(kMaxLength == i::ExternalArray::kMaxLength); | 
|   281 #endif  // USING_V8_SHARED |   282 #endif  // V8_SHARED | 
|   282   size_t length = 0; |   283   size_t length = 0; | 
|   283   if (args[0]->IsUint32()) { |   284   if (args[0]->IsUint32()) { | 
|   284     length = args[0]->Uint32Value(); |   285     length = args[0]->Uint32Value(); | 
|   285   } else if (args[0]->IsNumber()) { |   286   } else if (args[0]->IsNumber()) { | 
|   286     double raw_length = args[0]->NumberValue(); |   287     double raw_length = args[0]->NumberValue(); | 
|   287     if (raw_length < 0) { |   288     if (raw_length < 0) { | 
|   288       return ThrowException(String::New("Array length must not be negative.")); |   289       return ThrowException(String::New("Array length must not be negative.")); | 
|   289     } |   290     } | 
|   290     if (raw_length > kMaxLength) { |   291     if (raw_length > kMaxLength) { | 
|   291       return ThrowException( |   292       return ThrowException( | 
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   371  |   372  | 
|   372  |   373  | 
|   373 Handle<Value> Shell::Yield(const Arguments& args) { |   374 Handle<Value> Shell::Yield(const Arguments& args) { | 
|   374   v8::Unlocker unlocker; |   375   v8::Unlocker unlocker; | 
|   375   return Undefined(); |   376   return Undefined(); | 
|   376 } |   377 } | 
|   377  |   378  | 
|   378  |   379  | 
|   379 Handle<Value> Shell::Quit(const Arguments& args) { |   380 Handle<Value> Shell::Quit(const Arguments& args) { | 
|   380   int exit_code = args[0]->Int32Value(); |   381   int exit_code = args[0]->Int32Value(); | 
|   381 #ifndef USING_V8_SHARED |   382 #ifndef V8_SHARED | 
|   382   OnExit(); |   383   OnExit(); | 
|   383 #endif  // USING_V8_SHARED |   384 #endif  // V8_SHARED | 
|   384   exit(exit_code); |   385   exit(exit_code); | 
|   385   return Undefined(); |   386   return Undefined(); | 
|   386 } |   387 } | 
|   387  |   388  | 
|   388  |   389  | 
|   389 Handle<Value> Shell::Version(const Arguments& args) { |   390 Handle<Value> Shell::Version(const Arguments& args) { | 
|   390   return String::New(V8::GetVersion()); |   391   return String::New(V8::GetVersion()); | 
|   391 } |   392 } | 
|   392  |   393  | 
|   393  |   394  | 
| (...skipping 28 matching lines...) Expand all  Loading... | 
|   422     printf("\n"); |   423     printf("\n"); | 
|   423     v8::String::Utf8Value stack_trace(try_catch->StackTrace()); |   424     v8::String::Utf8Value stack_trace(try_catch->StackTrace()); | 
|   424     if (stack_trace.length() > 0) { |   425     if (stack_trace.length() > 0) { | 
|   425       const char* stack_trace_string = ToCString(stack_trace); |   426       const char* stack_trace_string = ToCString(stack_trace); | 
|   426       printf("%s\n", stack_trace_string); |   427       printf("%s\n", stack_trace_string); | 
|   427     } |   428     } | 
|   428   } |   429   } | 
|   429 } |   430 } | 
|   430  |   431  | 
|   431  |   432  | 
|   432 #ifndef USING_V8_SHARED |   433 #ifndef V8_SHARED | 
|   433 Handle<Array> Shell::GetCompletions(Handle<String> text, Handle<String> full) { |   434 Handle<Array> Shell::GetCompletions(Handle<String> text, Handle<String> full) { | 
|   434   HandleScope handle_scope; |   435   HandleScope handle_scope; | 
|   435   Context::Scope context_scope(utility_context_); |   436   Context::Scope context_scope(utility_context_); | 
|   436   Handle<Object> global = utility_context_->Global(); |   437   Handle<Object> global = utility_context_->Global(); | 
|   437   Handle<Value> fun = global->Get(String::New("GetCompletions")); |   438   Handle<Value> fun = global->Get(String::New("GetCompletions")); | 
|   438   static const int kArgc = 3; |   439   static const int kArgc = 3; | 
|   439   Handle<Value> argv[kArgc] = { evaluation_context_->Global(), text, full }; |   440   Handle<Value> argv[kArgc] = { evaluation_context_->Global(), text, full }; | 
|   440   Handle<Value> val = Handle<Function>::Cast(fun)->Call(global, kArgc, argv); |   441   Handle<Value> val = Handle<Function>::Cast(fun)->Call(global, kArgc, argv); | 
|   441   return handle_scope.Close(Handle<Array>::Cast(val)); |   442   return handle_scope.Close(Handle<Array>::Cast(val)); | 
|   442 } |   443 } | 
| (...skipping 14 matching lines...) Expand all  Loading... | 
|   457 Handle<Value> Shell::DebugCommandToJSONRequest(Handle<String> command) { |   458 Handle<Value> Shell::DebugCommandToJSONRequest(Handle<String> command) { | 
|   458   Context::Scope context_scope(utility_context_); |   459   Context::Scope context_scope(utility_context_); | 
|   459   Handle<Object> global = utility_context_->Global(); |   460   Handle<Object> global = utility_context_->Global(); | 
|   460   Handle<Value> fun = global->Get(String::New("DebugCommandToJSONRequest")); |   461   Handle<Value> fun = global->Get(String::New("DebugCommandToJSONRequest")); | 
|   461   static const int kArgc = 1; |   462   static const int kArgc = 1; | 
|   462   Handle<Value> argv[kArgc] = { command }; |   463   Handle<Value> argv[kArgc] = { command }; | 
|   463   Handle<Value> val = Handle<Function>::Cast(fun)->Call(global, kArgc, argv); |   464   Handle<Value> val = Handle<Function>::Cast(fun)->Call(global, kArgc, argv); | 
|   464   return val; |   465   return val; | 
|   465 } |   466 } | 
|   466 #endif  // ENABLE_DEBUGGER_SUPPORT |   467 #endif  // ENABLE_DEBUGGER_SUPPORT | 
|   467 #endif  // USING_V8_SHARED |   468 #endif  // V8_SHARED | 
|   468  |   469  | 
|   469  |   470  | 
|   470 #ifndef USING_V8_SHARED |   471 #ifndef V8_SHARED | 
|   471 int32_t* Counter::Bind(const char* name, bool is_histogram) { |   472 int32_t* Counter::Bind(const char* name, bool is_histogram) { | 
|   472   int i; |   473   int i; | 
|   473   for (i = 0; i < kMaxNameSize - 1 && name[i]; i++) |   474   for (i = 0; i < kMaxNameSize - 1 && name[i]; i++) | 
|   474     name_[i] = static_cast<char>(name[i]); |   475     name_[i] = static_cast<char>(name[i]); | 
|   475   name_[i] = '\0'; |   476   name_[i] = '\0'; | 
|   476   is_histogram_ = is_histogram; |   477   is_histogram_ = is_histogram; | 
|   477   return ptr(); |   478   return ptr(); | 
|   478 } |   479 } | 
|   479  |   480  | 
|   480  |   481  | 
| (...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   608           i::SharedFunctionInfo::cast(*compiled_script)->script())); |   609           i::SharedFunctionInfo::cast(*compiled_script)->script())); | 
|   609   script_object->set_type(i::Smi::FromInt(i::Script::TYPE_NATIVE)); |   610   script_object->set_type(i::Smi::FromInt(i::Script::TYPE_NATIVE)); | 
|   610  |   611  | 
|   611 #ifdef ENABLE_DEBUGGER_SUPPORT |   612 #ifdef ENABLE_DEBUGGER_SUPPORT | 
|   612   // Start the in-process debugger if requested. |   613   // Start the in-process debugger if requested. | 
|   613   if (i::FLAG_debugger && !i::FLAG_debugger_agent) { |   614   if (i::FLAG_debugger && !i::FLAG_debugger_agent) { | 
|   614     v8::Debug::SetDebugEventListener(HandleDebugEvent); |   615     v8::Debug::SetDebugEventListener(HandleDebugEvent); | 
|   615   } |   616   } | 
|   616 #endif  // ENABLE_DEBUGGER_SUPPORT |   617 #endif  // ENABLE_DEBUGGER_SUPPORT | 
|   617 } |   618 } | 
|   618 #endif  // USING_V8_SHARED |   619 #endif  // V8_SHARED | 
|   619  |   620  | 
|   620  |   621  | 
|   621 #ifdef COMPRESS_STARTUP_DATA_BZ2 |   622 #ifdef COMPRESS_STARTUP_DATA_BZ2 | 
|   622 class BZip2Decompressor : public v8::StartupDataDecompressor { |   623 class BZip2Decompressor : public v8::StartupDataDecompressor { | 
|   623  public: |   624  public: | 
|   624   virtual ~BZip2Decompressor() { } |   625   virtual ~BZip2Decompressor() { } | 
|   625  |   626  | 
|   626  protected: |   627  protected: | 
|   627   virtual int DecompressData(char* raw_data, |   628   virtual int DecompressData(char* raw_data, | 
|   628                              int* raw_data_size, |   629                              int* raw_data_size, | 
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   675                        FunctionTemplate::New(Float64Array)); |   676                        FunctionTemplate::New(Float64Array)); | 
|   676   global_template->Set(String::New("PixelArray"), |   677   global_template->Set(String::New("PixelArray"), | 
|   677                        FunctionTemplate::New(PixelArray)); |   678                        FunctionTemplate::New(PixelArray)); | 
|   678  |   679  | 
|   679 #ifdef LIVE_OBJECT_LIST |   680 #ifdef LIVE_OBJECT_LIST | 
|   680   global_template->Set(String::New("lol_is_enabled"), Boolean::New(true)); |   681   global_template->Set(String::New("lol_is_enabled"), Boolean::New(true)); | 
|   681 #else |   682 #else | 
|   682   global_template->Set(String::New("lol_is_enabled"), Boolean::New(false)); |   683   global_template->Set(String::New("lol_is_enabled"), Boolean::New(false)); | 
|   683 #endif |   684 #endif | 
|   684  |   685  | 
|   685 #ifndef USING_V8_SHARED |   686 #ifndef V8_SHARED | 
|   686   Handle<ObjectTemplate> os_templ = ObjectTemplate::New(); |   687   Handle<ObjectTemplate> os_templ = ObjectTemplate::New(); | 
|   687   AddOSMethods(os_templ); |   688   AddOSMethods(os_templ); | 
|   688   global_template->Set(String::New("os"), os_templ); |   689   global_template->Set(String::New("os"), os_templ); | 
|   689 #endif  // USING_V8_SHARED |   690 #endif  // V8_SHARED | 
|   690  |   691  | 
|   691   return global_template; |   692   return global_template; | 
|   692 } |   693 } | 
|   693  |   694  | 
|   694  |   695  | 
|   695 void Shell::Initialize() { |   696 void Shell::Initialize() { | 
|   696 #ifdef COMPRESS_STARTUP_DATA_BZ2 |   697 #ifdef COMPRESS_STARTUP_DATA_BZ2 | 
|   697   BZip2Decompressor startup_data_decompressor; |   698   BZip2Decompressor startup_data_decompressor; | 
|   698   int bz2_result = startup_data_decompressor.Decompress(); |   699   int bz2_result = startup_data_decompressor.Decompress(); | 
|   699   if (bz2_result != BZ_OK) { |   700   if (bz2_result != BZ_OK) { | 
|   700     fprintf(stderr, "bzip error code: %d\n", bz2_result); |   701     fprintf(stderr, "bzip error code: %d\n", bz2_result); | 
|   701     exit(1); |   702     exit(1); | 
|   702   } |   703   } | 
|   703 #endif |   704 #endif | 
|   704  |   705  | 
|   705 #ifndef USING_V8_SHARED |   706 #ifndef V8_SHARED | 
|   706   Shell::counter_map_ = new CounterMap(); |   707   Shell::counter_map_ = new CounterMap(); | 
|   707   // Set up counters |   708   // Set up counters | 
|   708   if (i::StrLength(i::FLAG_map_counters) != 0) |   709   if (i::StrLength(i::FLAG_map_counters) != 0) | 
|   709     MapCounters(i::FLAG_map_counters); |   710     MapCounters(i::FLAG_map_counters); | 
|   710   if (i::FLAG_dump_counters) { |   711   if (i::FLAG_dump_counters) { | 
|   711     V8::SetCounterFunction(LookupCounter); |   712     V8::SetCounterFunction(LookupCounter); | 
|   712     V8::SetCreateHistogramFunction(CreateHistogram); |   713     V8::SetCreateHistogramFunction(CreateHistogram); | 
|   713     V8::SetAddHistogramSampleFunction(AddHistogramSample); |   714     V8::SetAddHistogramSampleFunction(AddHistogramSample); | 
|   714   } |   715   } | 
|   715 #endif  // USING_V8_SHARED |   716 #endif  // V8_SHARED | 
|   716   if (options.test_shell) return; |   717   if (options.test_shell) return; | 
|   717  |   718  | 
|   718 #ifndef USING_V8_SHARED |   719 #ifndef V8_SHARED | 
|   719   Locker lock; |   720   Locker lock; | 
|   720   HandleScope scope; |   721   HandleScope scope; | 
|   721   Handle<ObjectTemplate> global_template = CreateGlobalTemplate(); |   722   Handle<ObjectTemplate> global_template = CreateGlobalTemplate(); | 
|   722   utility_context_ = Context::New(NULL, global_template); |   723   utility_context_ = Context::New(NULL, global_template); | 
|   723  |   724  | 
|   724 #ifdef ENABLE_DEBUGGER_SUPPORT |   725 #ifdef ENABLE_DEBUGGER_SUPPORT | 
|   725   // Start the debugger agent if requested. |   726   // Start the debugger agent if requested. | 
|   726   if (i::FLAG_debugger_agent) { |   727   if (i::FLAG_debugger_agent) { | 
|   727     v8::Debug::EnableAgent("d8 shell", i::FLAG_debugger_port, true); |   728     v8::Debug::EnableAgent("d8 shell", i::FLAG_debugger_port, true); | 
|   728   } |   729   } | 
|   729 #endif  // ENABLE_DEBUGGER_SUPPORT |   730 #endif  // ENABLE_DEBUGGER_SUPPORT | 
|   730 #endif  // USING_V8_SHARED |   731 #endif  // V8_SHARED | 
|   731 } |   732 } | 
|   732  |   733  | 
|   733  |   734  | 
|   734 Persistent<Context> Shell::CreateEvaluationContext() { |   735 Persistent<Context> Shell::CreateEvaluationContext() { | 
|   735 #ifndef USING_V8_SHARED |   736 #ifndef V8_SHARED | 
|   736   // This needs to be a critical section since this is not thread-safe |   737   // This needs to be a critical section since this is not thread-safe | 
|   737   i::ScopedLock lock(context_mutex_); |   738   i::ScopedLock lock(context_mutex_); | 
|   738 #endif  // USING_V8_SHARED |   739 #endif  // V8_SHARED | 
|   739   // Initialize the global objects |   740   // Initialize the global objects | 
|   740   Handle<ObjectTemplate> global_template = CreateGlobalTemplate(); |   741   Handle<ObjectTemplate> global_template = CreateGlobalTemplate(); | 
|   741   Persistent<Context> context = Context::New(NULL, global_template); |   742   Persistent<Context> context = Context::New(NULL, global_template); | 
|   742   Context::Scope scope(context); |   743   Context::Scope scope(context); | 
|   743  |   744  | 
|   744 #ifndef USING_V8_SHARED |   745 #ifndef V8_SHARED | 
|   745   i::JSArguments js_args = i::FLAG_js_arguments; |   746   i::JSArguments js_args = i::FLAG_js_arguments; | 
|   746   i::Handle<i::FixedArray> arguments_array = |   747   i::Handle<i::FixedArray> arguments_array = | 
|   747       FACTORY->NewFixedArray(js_args.argc()); |   748       FACTORY->NewFixedArray(js_args.argc()); | 
|   748   for (int j = 0; j < js_args.argc(); j++) { |   749   for (int j = 0; j < js_args.argc(); j++) { | 
|   749     i::Handle<i::String> arg = |   750     i::Handle<i::String> arg = | 
|   750         FACTORY->NewStringFromUtf8(i::CStrVector(js_args[j])); |   751         FACTORY->NewStringFromUtf8(i::CStrVector(js_args[j])); | 
|   751     arguments_array->set(j, *arg); |   752     arguments_array->set(j, *arg); | 
|   752   } |   753   } | 
|   753   i::Handle<i::JSArray> arguments_jsarray = |   754   i::Handle<i::JSArray> arguments_jsarray = | 
|   754       FACTORY->NewJSArrayWithElements(arguments_array); |   755       FACTORY->NewJSArrayWithElements(arguments_array); | 
|   755   context->Global()->Set(String::New("arguments"), |   756   context->Global()->Set(String::New("arguments"), | 
|   756                          Utils::ToLocal(arguments_jsarray)); |   757                          Utils::ToLocal(arguments_jsarray)); | 
|   757 #endif  // USING_V8_SHARED |   758 #endif  // V8_SHARED | 
|   758   return context; |   759   return context; | 
|   759 } |   760 } | 
|   760  |   761  | 
|   761  |   762  | 
|   762 #ifndef USING_V8_SHARED |   763 #ifndef V8_SHARED | 
|   763 void Shell::OnExit() { |   764 void Shell::OnExit() { | 
|   764   if (i::FLAG_dump_counters) { |   765   if (i::FLAG_dump_counters) { | 
|   765     printf("+----------------------------------------+-------------+\n"); |   766     printf("+----------------------------------------+-------------+\n"); | 
|   766     printf("| Name                                   | Value       |\n"); |   767     printf("| Name                                   | Value       |\n"); | 
|   767     printf("+----------------------------------------+-------------+\n"); |   768     printf("+----------------------------------------+-------------+\n"); | 
|   768     for (CounterMap::Iterator i(counter_map_); i.More(); i.Next()) { |   769     for (CounterMap::Iterator i(counter_map_); i.More(); i.Next()) { | 
|   769       Counter* counter = i.CurrentValue(); |   770       Counter* counter = i.CurrentValue(); | 
|   770       if (counter->is_histogram()) { |   771       if (counter->is_histogram()) { | 
|   771         printf("| c:%-36s | %11i |\n", i.CurrentKey(), counter->count()); |   772         printf("| c:%-36s | %11i |\n", i.CurrentKey(), counter->count()); | 
|   772         printf("| t:%-36s | %11i |\n", i.CurrentKey(), counter->sample_total()); |   773         printf("| t:%-36s | %11i |\n", i.CurrentKey(), counter->sample_total()); | 
|   773       } else { |   774       } else { | 
|   774         printf("| %-38s | %11i |\n", i.CurrentKey(), counter->count()); |   775         printf("| %-38s | %11i |\n", i.CurrentKey(), counter->count()); | 
|   775       } |   776       } | 
|   776     } |   777     } | 
|   777     printf("+----------------------------------------+-------------+\n"); |   778     printf("+----------------------------------------+-------------+\n"); | 
|   778   } |   779   } | 
|   779   if (counters_file_ != NULL) |   780   if (counters_file_ != NULL) | 
|   780     delete counters_file_; |   781     delete counters_file_; | 
|   781 } |   782 } | 
|   782 #endif  // USING_V8_SHARED |   783 #endif  // V8_SHARED | 
 |   784  | 
 |   785  | 
 |   786 static FILE* FOpen(const char* path, const char* mode) { | 
 |   787 #if (defined(_WIN32) || defined(_WIN64)) | 
 |   788   FILE* result; | 
 |   789   if (fopen_s(&result, path, mode) == 0) { | 
 |   790    return result; | 
 |   791   } else { | 
 |   792    return NULL; | 
 |   793   } | 
 |   794 #else | 
 |   795   FILE* file = fopen(path, mode); | 
 |   796   if (file == NULL) return NULL; | 
 |   797   struct stat file_stat; | 
 |   798   if (fstat(fileno(file), &file_stat) != 0) return NULL; | 
 |   799   bool is_regular_file = ((file_stat.st_mode & S_IFREG) != 0); | 
 |   800   if (is_regular_file) return file; | 
 |   801   fclose(file); | 
 |   802   return NULL; | 
 |   803 #endif | 
 |   804 } | 
|   783  |   805  | 
|   784  |   806  | 
|   785 static char* ReadChars(const char* name, int* size_out) { |   807 static char* ReadChars(const char* name, int* size_out) { | 
|   786   // Release the V8 lock while reading files. |   808   // Release the V8 lock while reading files. | 
|   787   v8::Unlocker unlocker(Isolate::GetCurrent()); |   809   v8::Unlocker unlocker(Isolate::GetCurrent()); | 
|   788 #ifndef USING_V8_SHARED |   810   FILE* file = FOpen(name, "rb"); | 
|   789   FILE* file = i::OS::FOpen(name, "rb"); |  | 
|   790 #else |  | 
|   791   // TODO(yangguo@chromium.org): reading from a directory hangs! |  | 
|   792   FILE* file = fopen(name, "rb"); |  | 
|   793 #endif  // USING_V8_SHARED |  | 
|   794   if (file == NULL) return NULL; |   811   if (file == NULL) return NULL; | 
|   795  |   812  | 
|   796   fseek(file, 0, SEEK_END); |   813   fseek(file, 0, SEEK_END); | 
|   797   int size = ftell(file); |   814   int size = ftell(file); | 
|   798   rewind(file); |   815   rewind(file); | 
|   799  |   816  | 
|   800   char* chars = new char[size + 1]; |   817   char* chars = new char[size + 1]; | 
|   801   chars[size] = '\0'; |   818   chars[size] = '\0'; | 
|   802   for (int i = 0; i < size;) { |   819   for (int i = 0; i < size;) { | 
|   803     int read = static_cast<int>(fread(&chars[i], 1, size - i, file)); |   820     int read = static_cast<int>(fread(&chars[i], 1, size - i, file)); | 
|   804     i += read; |   821     i += read; | 
|   805   } |   822   } | 
|   806   fclose(file); |   823   fclose(file); | 
|   807   *size_out = size; |   824   *size_out = size; | 
|   808   return chars; |   825   return chars; | 
|   809 } |   826 } | 
|   810  |   827  | 
|   811  |   828  | 
|   812 #ifndef USING_V8_SHARED |   829 #ifndef V8_SHARED | 
|   813 static char* ReadToken(char* data, char token) { |   830 static char* ReadToken(char* data, char token) { | 
|   814   char* next = i::OS::StrChr(data, token); |   831   char* next = i::OS::StrChr(data, token); | 
|   815   if (next != NULL) { |   832   if (next != NULL) { | 
|   816     *next = '\0'; |   833     *next = '\0'; | 
|   817     return (next + 1); |   834     return (next + 1); | 
|   818   } |   835   } | 
|   819  |   836  | 
|   820   return NULL; |   837   return NULL; | 
|   821 } |   838 } | 
|   822  |   839  | 
|   823  |   840  | 
|   824 static char* ReadLine(char* data) { |   841 static char* ReadLine(char* data) { | 
|   825   return ReadToken(data, '\n'); |   842   return ReadToken(data, '\n'); | 
|   826 } |   843 } | 
|   827  |   844  | 
|   828  |   845  | 
|   829 static char* ReadWord(char* data) { |   846 static char* ReadWord(char* data) { | 
|   830   return ReadToken(data, ' '); |   847   return ReadToken(data, ' '); | 
|   831 } |   848 } | 
|   832 #endif  // USING_V8_SHARED |   849 #endif  // V8_SHARED | 
|   833  |   850  | 
|   834  |   851  | 
|   835 // Reads a file into a v8 string. |   852 // Reads a file into a v8 string. | 
|   836 Handle<String> Shell::ReadFile(const char* name) { |   853 Handle<String> Shell::ReadFile(const char* name) { | 
|   837   int size = 0; |   854   int size = 0; | 
|   838   char* chars = ReadChars(name, &size); |   855   char* chars = ReadChars(name, &size); | 
|   839   if (chars == NULL) return Handle<String>(); |   856   if (chars == NULL) return Handle<String>(); | 
|   840   Handle<String> result = String::New(chars); |   857   Handle<String> result = String::New(chars); | 
|   841   delete[] chars; |   858   delete[] chars; | 
|   842   return result; |   859   return result; | 
|   843 } |   860 } | 
|   844  |   861  | 
|   845  |   862  | 
|   846 void Shell::RunShell() { |   863 void Shell::RunShell() { | 
|   847   Locker locker; |   864   Locker locker; | 
|   848   Context::Scope context_scope(evaluation_context_); |   865   Context::Scope context_scope(evaluation_context_); | 
|   849   HandleScope handle_scope; |   866   HandleScope handle_scope; | 
|   850   Handle<String> name = String::New("(d8)"); |   867   Handle<String> name = String::New("(d8)"); | 
|   851 #ifndef USING_V8_SHARED |   868 #ifndef V8_SHARED | 
|   852   LineEditor* editor = LineEditor::Get(); |   869   LineEditor* editor = LineEditor::Get(); | 
|   853   printf("V8 version %s [console: %s]\n", V8::GetVersion(), editor->name()); |   870   printf("V8 version %s [console: %s]\n", V8::GetVersion(), editor->name()); | 
|   854   if (i::FLAG_debugger) { |   871   if (i::FLAG_debugger) { | 
|   855     printf("JavaScript debugger enabled\n"); |   872     printf("JavaScript debugger enabled\n"); | 
|   856   } |   873   } | 
|   857   editor->Open(); |   874   editor->Open(); | 
|   858   while (true) { |   875   while (true) { | 
|   859     i::SmartPointer<char> input = editor->Prompt(Shell::kPrompt); |   876     i::SmartPointer<char> input = editor->Prompt(Shell::kPrompt); | 
|   860     if (input.is_empty()) break; |   877     if (input.is_empty()) break; | 
|   861     editor->AddHistory(*input); |   878     editor->AddHistory(*input); | 
|   862     ExecuteString(String::New(*input), name, true, true); |   879     ExecuteString(String::New(*input), name, true, true); | 
|   863   } |   880   } | 
|   864   editor->Close(); |   881   editor->Close(); | 
|   865 #else |   882 #else | 
|   866   printf("V8 version %s [D8 light using shared library]\n", V8::GetVersion()); |   883   printf("V8 version %s [D8 light using shared library]\n", V8::GetVersion()); | 
|   867   static const int kBufferSize = 256; |   884   static const int kBufferSize = 256; | 
|   868   while (true) { |   885   while (true) { | 
|   869     char buffer[kBufferSize]; |   886     char buffer[kBufferSize]; | 
|   870     printf("%s", Shell::kPrompt); |   887     printf("%s", Shell::kPrompt); | 
|   871     if (fgets(buffer, kBufferSize, stdin) == NULL) break; |   888     if (fgets(buffer, kBufferSize, stdin) == NULL) break; | 
|   872     ExecuteString(String::New(buffer), name, true, true); |   889     ExecuteString(String::New(buffer), name, true, true); | 
|   873   } |   890   } | 
|   874 #endif  // USING_V8_SHARED |   891 #endif  // V8_SHARED | 
|   875   printf("\n"); |   892   printf("\n"); | 
|   876 } |   893 } | 
|   877  |   894  | 
|   878  |   895  | 
|   879 #ifndef USING_V8_SHARED |   896 #ifndef V8_SHARED | 
|   880 class ShellThread : public i::Thread { |   897 class ShellThread : public i::Thread { | 
|   881  public: |   898  public: | 
|   882   ShellThread(int no, i::Vector<const char> files) |   899   ShellThread(int no, i::Vector<const char> files) | 
|   883       : Thread("d8:ShellThread"), |   900       : Thread("d8:ShellThread"), | 
|   884         no_(no), files_(files) { } |   901         no_(no), files_(files) { } | 
|   885   virtual void Run(); |   902   virtual void Run(); | 
|   886  private: |   903  private: | 
|   887   int no_; |   904   int no_; | 
|   888   i::Vector<const char> files_; |   905   i::Vector<const char> files_; | 
|   889 }; |   906 }; | 
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   922         break; |   939         break; | 
|   923       } |   940       } | 
|   924  |   941  | 
|   925       Shell::ExecuteString(str, String::New(filename), false, false); |   942       Shell::ExecuteString(str, String::New(filename), false, false); | 
|   926     } |   943     } | 
|   927  |   944  | 
|   928     thread_context.Dispose(); |   945     thread_context.Dispose(); | 
|   929     ptr = next_line; |   946     ptr = next_line; | 
|   930   } |   947   } | 
|   931 } |   948 } | 
|   932 #endif  // USING_V8_SHARED |   949 #endif  // V8_SHARED | 
|   933  |   950  | 
|   934  |   951  | 
|   935 void SourceGroup::ExitShell(int exit_code) { |   952 void SourceGroup::ExitShell(int exit_code) { | 
|   936   // Use _exit instead of exit to avoid races between isolate |   953   // Use _exit instead of exit to avoid races between isolate | 
|   937   // threads and static destructors. |   954   // threads and static destructors. | 
|   938   fflush(stdout); |   955   fflush(stdout); | 
|   939   fflush(stderr); |   956   fflush(stderr); | 
|   940   _exit(exit_code); |   957   _exit(exit_code); | 
|   941 } |   958 } | 
|   942  |   959  | 
| (...skipping 26 matching lines...) Expand all  Loading... | 
|   969       if (!Shell::ExecuteString(source, file_name, false, true)) { |   986       if (!Shell::ExecuteString(source, file_name, false, true)) { | 
|   970         ExitShell(1); |   987         ExitShell(1); | 
|   971         return; |   988         return; | 
|   972       } |   989       } | 
|   973     } |   990     } | 
|   974   } |   991   } | 
|   975 } |   992 } | 
|   976  |   993  | 
|   977  |   994  | 
|   978 Handle<String> SourceGroup::ReadFile(const char* name) { |   995 Handle<String> SourceGroup::ReadFile(const char* name) { | 
|   979 #ifndef USING_V8_SHARED |   996   int size; | 
|   980   FILE* file = i::OS::FOpen(name, "rb"); |   997   const char* chars = ReadChars(name, &size); | 
|   981 #else |   998   if (chars == NULL) return Handle<String>(); | 
|   982   // TODO(yangguo@chromium.org): reading from a directory hangs! |  | 
|   983   FILE* file = fopen(name, "rb"); |  | 
|   984 #endif  // USING_V8_SHARED |  | 
|   985   if (file == NULL) return Handle<String>(); |  | 
|   986  |  | 
|   987   fseek(file, 0, SEEK_END); |  | 
|   988   int size = ftell(file); |  | 
|   989   rewind(file); |  | 
|   990  |  | 
|   991   char* chars = new char[size + 1]; |  | 
|   992   chars[size] = '\0'; |  | 
|   993   for (int i = 0; i < size;) { |  | 
|   994     int read = static_cast<int>(fread(&chars[i], 1, size - i, file)); |  | 
|   995     i += read; |  | 
|   996   } |  | 
|   997   fclose(file); |  | 
|   998   Handle<String> result = String::New(chars, size); |   999   Handle<String> result = String::New(chars, size); | 
|   999   delete[] chars; |  1000   delete[] chars; | 
|  1000   return result; |  1001   return result; | 
|  1001 } |  1002 } | 
|  1002  |  1003  | 
|  1003  |  1004  | 
|  1004 #ifndef USING_V8_SHARED |  1005 #ifndef V8_SHARED | 
|  1005 i::Thread::Options SourceGroup::GetThreadOptions() { |  1006 i::Thread::Options SourceGroup::GetThreadOptions() { | 
|  1006   i::Thread::Options options; |  1007   i::Thread::Options options; | 
|  1007   options.name = "IsolateThread"; |  1008   options.name = "IsolateThread"; | 
|  1008   // On some systems (OSX 10.6) the stack size default is 0.5Mb or less |  1009   // On some systems (OSX 10.6) the stack size default is 0.5Mb or less | 
|  1009   // which is not enough to parse the big literal expressions used in tests. |  1010   // which is not enough to parse the big literal expressions used in tests. | 
|  1010   // The stack size should be at least StackGuard::kLimitSize + some |  1011   // The stack size should be at least StackGuard::kLimitSize + some | 
|  1011   // OS-specific padding for thread startup code. |  1012   // OS-specific padding for thread startup code. | 
|  1012   options.stack_size = 2 << 20;  // 2 Mb seems to be enough |  1013   options.stack_size = 2 << 20;  // 2 Mb seems to be enough | 
|  1013   return options; |  1014   return options; | 
|  1014 } |  1015 } | 
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1046  |  1047  | 
|  1047 void SourceGroup::WaitForThread() { |  1048 void SourceGroup::WaitForThread() { | 
|  1048   if (thread_ == NULL) return; |  1049   if (thread_ == NULL) return; | 
|  1049   if (Shell::options.last_run) { |  1050   if (Shell::options.last_run) { | 
|  1050     thread_->Join(); |  1051     thread_->Join(); | 
|  1051     thread_ = NULL; |  1052     thread_ = NULL; | 
|  1052   } else { |  1053   } else { | 
|  1053     done_semaphore_->Wait(); |  1054     done_semaphore_->Wait(); | 
|  1054   } |  1055   } | 
|  1055 } |  1056 } | 
|  1056 #endif  // USING_V8_SHARED |  1057 #endif  // V8_SHARED | 
|  1057  |  1058  | 
|  1058  |  1059  | 
|  1059 bool Shell::SetOptions(int argc, char* argv[]) { |  1060 bool Shell::SetOptions(int argc, char* argv[]) { | 
|  1060   for (int i = 0; i < argc; i++) { |  1061   for (int i = 0; i < argc; i++) { | 
|  1061     if (strcmp(argv[i], "--stress-opt") == 0) { |  1062     if (strcmp(argv[i], "--stress-opt") == 0) { | 
|  1062       options.stress_opt = true; |  1063       options.stress_opt = true; | 
|  1063       argv[i] = NULL; |  1064       argv[i] = NULL; | 
|  1064     } else if (strcmp(argv[i], "--stress-deopt") == 0) { |  1065     } else if (strcmp(argv[i], "--stress-deopt") == 0) { | 
|  1065       options.stress_deopt = true; |  1066       options.stress_deopt = true; | 
|  1066       argv[i] = NULL; |  1067       argv[i] = NULL; | 
|  1067     } else if (strcmp(argv[i], "--noalways-opt") == 0) { |  1068     } else if (strcmp(argv[i], "--noalways-opt") == 0) { | 
|  1068       // No support for stressing if we can't use --always-opt. |  1069       // No support for stressing if we can't use --always-opt. | 
|  1069       options.stress_opt = false; |  1070       options.stress_opt = false; | 
|  1070       options.stress_deopt = false; |  1071       options.stress_deopt = false; | 
|  1071     } else if (strcmp(argv[i], "--shell") == 0) { |  1072     } else if (strcmp(argv[i], "--shell") == 0) { | 
|  1072       options.interactive_shell = true; |  1073       options.interactive_shell = true; | 
|  1073       argv[i] = NULL; |  1074       argv[i] = NULL; | 
|  1074     } else if (strcmp(argv[i], "--test") == 0) { |  1075     } else if (strcmp(argv[i], "--test") == 0) { | 
|  1075       options.test_shell = true; |  1076       options.test_shell = true; | 
|  1076       argv[i] = NULL; |  1077       argv[i] = NULL; | 
|  1077     } else if (strcmp(argv[i], "--preemption") == 0) { |  1078     } else if (strcmp(argv[i], "--preemption") == 0) { | 
|  1078 #ifdef USING_V8_SHARED |  1079 #ifdef V8_SHARED | 
|  1079       printf("D8 with shared library does not support multi-threading\n"); |  1080       printf("D8 with shared library does not support multi-threading\n"); | 
|  1080       return false; |  1081       return false; | 
|  1081 #else |  1082 #else | 
|  1082       options.use_preemption = true; |  1083       options.use_preemption = true; | 
|  1083       argv[i] = NULL; |  1084       argv[i] = NULL; | 
|  1084 #endif  // USING_V8_SHARED |  1085 #endif  // V8_SHARED | 
|  1085     } else if (strcmp(argv[i], "--no-preemption") == 0) { |  1086     } else if (strcmp(argv[i], "--no-preemption") == 0) { | 
|  1086 #ifdef USING_V8_SHARED |  1087 #ifdef V8_SHARED | 
|  1087       printf("D8 with shared library does not support multi-threading\n"); |  1088       printf("D8 with shared library does not support multi-threading\n"); | 
|  1088       return false; |  1089       return false; | 
|  1089 #else |  1090 #else | 
|  1090       options.use_preemption = false; |  1091       options.use_preemption = false; | 
|  1091       argv[i] = NULL; |  1092       argv[i] = NULL; | 
|  1092 #endif  // USING_V8_SHARED |  1093 #endif  // V8_SHARED | 
|  1093     } else if (strcmp(argv[i], "--preemption-interval") == 0) { |  1094     } else if (strcmp(argv[i], "--preemption-interval") == 0) { | 
|  1094 #ifdef USING_V8_SHARED |  1095 #ifdef V8_SHARED | 
|  1095       printf("D8 with shared library does not support multi-threading\n"); |  1096       printf("D8 with shared library does not support multi-threading\n"); | 
|  1096       return false; |  1097       return false; | 
|  1097 #else |  1098 #else | 
|  1098       if (++i < argc) { |  1099       if (++i < argc) { | 
|  1099         argv[i-1] = NULL; |  1100         argv[i-1] = NULL; | 
|  1100         char* end = NULL; |  1101         char* end = NULL; | 
|  1101         options.preemption_interval = strtol(argv[i], &end, 10);  // NOLINT |  1102         options.preemption_interval = strtol(argv[i], &end, 10);  // NOLINT | 
|  1102         if (options.preemption_interval <= 0 |  1103         if (options.preemption_interval <= 0 | 
|  1103             || *end != '\0' |  1104             || *end != '\0' | 
|  1104             || errno == ERANGE) { |  1105             || errno == ERANGE) { | 
|  1105           printf("Invalid value for --preemption-interval '%s'\n", argv[i]); |  1106           printf("Invalid value for --preemption-interval '%s'\n", argv[i]); | 
|  1106           return false; |  1107           return false; | 
|  1107         } |  1108         } | 
|  1108         argv[i] = NULL; |  1109         argv[i] = NULL; | 
|  1109       } else { |  1110       } else { | 
|  1110         printf("Missing value for --preemption-interval\n"); |  1111         printf("Missing value for --preemption-interval\n"); | 
|  1111         return false; |  1112         return false; | 
|  1112       } |  1113       } | 
|  1113 #endif  // USING_V8_SHARED |  1114 #endif  // V8_SHARED | 
|  1114     } else if (strcmp(argv[i], "-f") == 0) { |  1115     } else if (strcmp(argv[i], "-f") == 0) { | 
|  1115       // Ignore any -f flags for compatibility with other stand-alone |  1116       // Ignore any -f flags for compatibility with other stand-alone | 
|  1116       // JavaScript engines. |  1117       // JavaScript engines. | 
|  1117       continue; |  1118       continue; | 
|  1118     } else if (strcmp(argv[i], "--isolate") == 0) { |  1119     } else if (strcmp(argv[i], "--isolate") == 0) { | 
|  1119 #ifdef USING_V8_SHARED |  1120 #ifdef V8_SHARED | 
|  1120       printf("D8 with shared library does not support multi-threading\n"); |  1121       printf("D8 with shared library does not support multi-threading\n"); | 
|  1121       return false; |  1122       return false; | 
|  1122 #endif  // USING_V8_SHARED |  1123 #endif  // V8_SHARED | 
|  1123       options.num_isolates++; |  1124       options.num_isolates++; | 
|  1124     } |  1125     } | 
|  1125 #ifdef USING_V8_SHARED |  1126 #ifdef V8_SHARED | 
|  1126     else if (strcmp(argv[i], "--dump-counters") == 0) { |  1127     else if (strcmp(argv[i], "--dump-counters") == 0) { | 
|  1127       printf("D8 with shared library does not include counters\n"); |  1128       printf("D8 with shared library does not include counters\n"); | 
|  1128       return false; |  1129       return false; | 
|  1129     } else if (strcmp(argv[i], "-p") == 0) { |  1130     } else if (strcmp(argv[i], "-p") == 0) { | 
|  1130       printf("D8 with shared library does not support multi-threading\n"); |  1131       printf("D8 with shared library does not support multi-threading\n"); | 
|  1131       return false; |  1132       return false; | 
|  1132     } else if (strcmp(argv[i], "--debugger") == 0) { |  1133     } else if (strcmp(argv[i], "--debugger") == 0) { | 
|  1133       printf("Javascript debugger not included\n"); |  1134       printf("Javascript debugger not included\n"); | 
|  1134       return false; |  1135       return false; | 
|  1135     } |  1136     } | 
|  1136 #endif  // USING_V8_SHARED |  1137 #endif  // V8_SHARED | 
|  1137   } |  1138   } | 
|  1138  |  1139  | 
|  1139 #ifndef USING_V8_SHARED |  1140 #ifndef V8_SHARED | 
|  1140   // Run parallel threads if we are not using --isolate |  1141   // Run parallel threads if we are not using --isolate | 
|  1141   for (int i = 1; i < argc; i++) { |  1142   for (int i = 1; i < argc; i++) { | 
|  1142     if (argv[i] == NULL) continue; |  1143     if (argv[i] == NULL) continue; | 
|  1143     if (strcmp(argv[i], "-p") == 0 && i + 1 < argc) { |  1144     if (strcmp(argv[i], "-p") == 0 && i + 1 < argc) { | 
|  1144       if (options.num_isolates > 1) { |  1145       if (options.num_isolates > 1) { | 
|  1145         printf("-p is not compatible with --isolate\n"); |  1146         printf("-p is not compatible with --isolate\n"); | 
|  1146         return false; |  1147         return false; | 
|  1147       } |  1148       } | 
|  1148       argv[i] = NULL; |  1149       argv[i] = NULL; | 
|  1149       if (options.parallel_files == NULL) { |  1150       if (options.parallel_files == NULL) { | 
|  1150         options.parallel_files = new i::List<i::Vector<const char> >(); |  1151         options.parallel_files = new i::List<i::Vector<const char> >(); | 
|  1151       } |  1152       } | 
|  1152       int size = 0; |  1153       int size = 0; | 
|  1153       const char* files = ReadChars(argv[++i], &size); |  1154       const char* files = ReadChars(argv[++i], &size); | 
|  1154       if (files == NULL) { |  1155       if (files == NULL) { | 
|  1155         printf("-p option incomplete\n"); |  1156         printf("-p option incomplete\n"); | 
|  1156         return false; |  1157         return false; | 
|  1157       } |  1158       } | 
|  1158       argv[i] = NULL; |  1159       argv[i] = NULL; | 
|  1159       options.parallel_files->Add(i::Vector<const char>(files, size)); |  1160       options.parallel_files->Add(i::Vector<const char>(files, size)); | 
 |  1161       delete[] files; | 
|  1160     } |  1162     } | 
|  1161   } |  1163   } | 
|  1162 #endif  // USING_V8_SHARED |  1164 #endif  // V8_SHARED | 
|  1163  |  1165  | 
|  1164   v8::V8::SetFlagsFromCommandLine(&argc, argv, true); |  1166   v8::V8::SetFlagsFromCommandLine(&argc, argv, true); | 
|  1165  |  1167  | 
|  1166   // set up isolated source groups |  1168   // set up isolated source groups | 
|  1167   options.isolate_sources = new SourceGroup[options.num_isolates]; |  1169   options.isolate_sources = new SourceGroup[options.num_isolates]; | 
|  1168   SourceGroup* current = options.isolate_sources; |  1170   SourceGroup* current = options.isolate_sources; | 
|  1169   current->Begin(argv, 1); |  1171   current->Begin(argv, 1); | 
|  1170   for (int i = 1; i < argc; i++) { |  1172   for (int i = 1; i < argc; i++) { | 
|  1171     const char* str = argv[i]; |  1173     const char* str = argv[i]; | 
|  1172     if (strcmp(str, "--isolate") == 0) { |  1174     if (strcmp(str, "--isolate") == 0) { | 
|  1173       current->End(i); |  1175       current->End(i); | 
|  1174       current++; |  1176       current++; | 
|  1175       current->Begin(argv, i + 1); |  1177       current->Begin(argv, i + 1); | 
|  1176     } else if (strncmp(argv[i], "--", 2) == 0) { |  1178     } else if (strncmp(argv[i], "--", 2) == 0) { | 
|  1177       printf("Warning: unknown flag %s.\nTry --help for options\n", argv[i]); |  1179       printf("Warning: unknown flag %s.\nTry --help for options\n", argv[i]); | 
|  1178     } |  1180     } | 
|  1179   } |  1181   } | 
|  1180   current->End(argc); |  1182   current->End(argc); | 
|  1181  |  1183  | 
|  1182   return true; |  1184   return true; | 
|  1183 } |  1185 } | 
|  1184  |  1186  | 
|  1185  |  1187  | 
|  1186 int Shell::RunMain(int argc, char* argv[]) { |  1188 int Shell::RunMain(int argc, char* argv[]) { | 
|  1187 #ifndef USING_V8_SHARED |  1189 #ifndef V8_SHARED | 
|  1188   i::List<i::Thread*> threads(1); |  1190   i::List<i::Thread*> threads(1); | 
|  1189   if (options.parallel_files != NULL) |  1191   if (options.parallel_files != NULL) | 
|  1190     for (int i = 0; i < options.parallel_files->length(); i++) { |  1192     for (int i = 0; i < options.parallel_files->length(); i++) { | 
|  1191       i::Vector<const char> files = options.parallel_files->at(i); |  1193       i::Vector<const char> files = options.parallel_files->at(i); | 
|  1192       ShellThread* thread = new ShellThread(threads.length(), files); |  1194       ShellThread* thread = new ShellThread(threads.length(), files); | 
|  1193       thread->Start(); |  1195       thread->Start(); | 
|  1194       threads.Add(thread); |  1196       threads.Add(thread); | 
|  1195     } |  1197     } | 
|  1196  |  1198  | 
|  1197   for (int i = 1; i < options.num_isolates; ++i) { |  1199   for (int i = 1; i < options.num_isolates; ++i) { | 
|  1198     options.isolate_sources[i].StartExecuteInThread(); |  1200     options.isolate_sources[i].StartExecuteInThread(); | 
|  1199   } |  1201   } | 
|  1200 #endif  // USING_V8_SHARED |  1202 #endif  // V8_SHARED | 
|  1201   {  // NOLINT |  1203   {  // NOLINT | 
|  1202     Locker lock; |  1204     Locker lock; | 
|  1203     HandleScope scope; |  1205     HandleScope scope; | 
|  1204     Persistent<Context> context = CreateEvaluationContext(); |  1206     Persistent<Context> context = CreateEvaluationContext(); | 
|  1205     { |  1207     { | 
|  1206       Context::Scope cscope(context); |  1208       Context::Scope cscope(context); | 
|  1207       options.isolate_sources[0].Execute(); |  1209       options.isolate_sources[0].Execute(); | 
|  1208     } |  1210     } | 
|  1209     if (options.last_run) { |  1211     if (options.last_run) { | 
|  1210       // Keep using the same context in the interactive shell |  1212       // Keep using the same context in the interactive shell | 
|  1211       evaluation_context_ = context; |  1213       evaluation_context_ = context; | 
|  1212     } else { |  1214     } else { | 
|  1213       context.Dispose(); |  1215       context.Dispose(); | 
|  1214     } |  1216     } | 
|  1215  |  1217  | 
|  1216 #ifndef USING_V8_SHARED |  1218 #ifndef V8_SHARED | 
|  1217     // Start preemption if threads have been created and preemption is enabled. |  1219     // Start preemption if threads have been created and preemption is enabled. | 
|  1218     if (options.parallel_files != NULL |  1220     if (options.parallel_files != NULL | 
|  1219         && threads.length() > 0 |  1221         && threads.length() > 0 | 
|  1220         && options.use_preemption) { |  1222         && options.use_preemption) { | 
|  1221       Locker::StartPreemption(options.preemption_interval); |  1223       Locker::StartPreemption(options.preemption_interval); | 
|  1222     } |  1224     } | 
|  1223 #endif  // USING_V8_SHARED |  1225 #endif  // V8_SHARED | 
|  1224   } |  1226   } | 
|  1225  |  1227  | 
|  1226 #ifndef USING_V8_SHARED |  1228 #ifndef V8_SHARED | 
|  1227   for (int i = 1; i < options.num_isolates; ++i) { |  1229   for (int i = 1; i < options.num_isolates; ++i) { | 
|  1228     options.isolate_sources[i].WaitForThread(); |  1230     options.isolate_sources[i].WaitForThread(); | 
|  1229   } |  1231   } | 
|  1230  |  1232  | 
|  1231   if (options.parallel_files != NULL) |  1233   if (options.parallel_files != NULL) | 
|  1232     for (int i = 0; i < threads.length(); i++) { |  1234     for (int i = 0; i < threads.length(); i++) { | 
|  1233       i::Thread* thread = threads[i]; |  1235       i::Thread* thread = threads[i]; | 
|  1234       thread->Join(); |  1236       thread->Join(); | 
|  1235       delete thread; |  1237       delete thread; | 
|  1236     } |  1238     } | 
|  1237  |  1239  | 
|  1238   OnExit(); |  1240   OnExit(); | 
|  1239 #endif  // USING_V8_SHARED |  1241 #endif  // V8_SHARED | 
|  1240   return 0; |  1242   return 0; | 
|  1241 } |  1243 } | 
|  1242  |  1244  | 
|  1243  |  1245  | 
|  1244 int Shell::Main(int argc, char* argv[]) { |  1246 int Shell::Main(int argc, char* argv[]) { | 
|  1245   if (!SetOptions(argc, argv)) return 1; |  1247   if (!SetOptions(argc, argv)) return 1; | 
|  1246   Initialize(); |  1248   Initialize(); | 
|  1247  |  1249  | 
|  1248   int result = 0; |  1250   int result = 0; | 
|  1249   if (options.stress_opt || options.stress_deopt) { |  1251   if (options.stress_opt || options.stress_deopt) { | 
|  1250     Testing::SetStressRunType( |  1252     Testing::SetStressRunType( | 
|  1251         options.stress_opt ? Testing::kStressTypeOpt |  1253         options.stress_opt ? Testing::kStressTypeOpt | 
|  1252                            : Testing::kStressTypeDeopt); |  1254                            : Testing::kStressTypeDeopt); | 
|  1253     int stress_runs = Testing::GetStressRuns(); |  1255     int stress_runs = Testing::GetStressRuns(); | 
|  1254     for (int i = 0; i < stress_runs && result == 0; i++) { |  1256     for (int i = 0; i < stress_runs && result == 0; i++) { | 
|  1255       printf("============ Stress %d/%d ============\n", i + 1, stress_runs); |  1257       printf("============ Stress %d/%d ============\n", i + 1, stress_runs); | 
|  1256       Testing::PrepareStressRun(i); |  1258       Testing::PrepareStressRun(i); | 
|  1257       options.last_run = (i == stress_runs - 1); |  1259       options.last_run = (i == stress_runs - 1); | 
|  1258       result = RunMain(argc, argv); |  1260       result = RunMain(argc, argv); | 
|  1259     } |  1261     } | 
|  1260     printf("======== Full Deoptimization =======\n"); |  1262     printf("======== Full Deoptimization =======\n"); | 
|  1261     Testing::DeoptimizeAll(); |  1263     Testing::DeoptimizeAll(); | 
|  1262   } else { |  1264   } else { | 
|  1263     result = RunMain(argc, argv); |  1265     result = RunMain(argc, argv); | 
|  1264   } |  1266   } | 
|  1265  |  1267  | 
|  1266  |  1268  | 
|  1267 #if !defined(USING_V8_SHARED) && defined(ENABLE_DEBUGGER_SUPPORT) |  1269 #if !defined(V8_SHARED) && defined(ENABLE_DEBUGGER_SUPPORT) | 
|  1268   // Run remote debugger if requested, but never on --test |  1270   // Run remote debugger if requested, but never on --test | 
|  1269   if (i::FLAG_remote_debugger && !options.test_shell) { |  1271   if (i::FLAG_remote_debugger && !options.test_shell) { | 
|  1270     InstallUtilityScript(); |  1272     InstallUtilityScript(); | 
|  1271     RunRemoteDebugger(i::FLAG_debugger_port); |  1273     RunRemoteDebugger(i::FLAG_debugger_port); | 
|  1272     return 0; |  1274     return 0; | 
|  1273   } |  1275   } | 
|  1274 #endif  // !USING_V8_SHARED && ENABLE_DEBUGGER_SUPPORT |  1276 #endif  // !V8_SHARED && ENABLE_DEBUGGER_SUPPORT | 
|  1275  |  1277  | 
|  1276   // Run interactive shell if explicitly requested or if no script has been |  1278   // Run interactive shell if explicitly requested or if no script has been | 
|  1277   // executed, but never on --test |  1279   // executed, but never on --test | 
|  1278  |  1280  | 
|  1279   if (( options.interactive_shell |  1281   if (( options.interactive_shell | 
|  1280       || !options.script_executed ) |  1282       || !options.script_executed ) | 
|  1281       && !options.test_shell ) { |  1283       && !options.test_shell ) { | 
|  1282 #ifndef USING_V8_SHARED |  1284 #ifndef V8_SHARED | 
|  1283     InstallUtilityScript(); |  1285     InstallUtilityScript(); | 
|  1284 #endif  // USING_V8_SHARED |  1286 #endif  // V8_SHARED | 
|  1285     RunShell(); |  1287     RunShell(); | 
|  1286   } |  1288   } | 
|  1287  |  1289  | 
|  1288   V8::Dispose(); |  1290   V8::Dispose(); | 
|  1289  |  1291  | 
|  1290   return result; |  1292   return result; | 
|  1291 } |  1293 } | 
|  1292  |  1294  | 
|  1293 }  // namespace v8 |  1295 }  // namespace v8 | 
|  1294  |  1296  | 
|  1295  |  1297  | 
|  1296 #ifndef GOOGLE3 |  1298 #ifndef GOOGLE3 | 
|  1297 int main(int argc, char* argv[]) { |  1299 int main(int argc, char* argv[]) { | 
|  1298   return v8::Shell::Main(argc, argv); |  1300   return v8::Shell::Main(argc, argv); | 
|  1299 } |  1301 } | 
|  1300 #endif |  1302 #endif | 
| OLD | NEW |