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 |
(...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
196 Handle<Value> Shell::Write(const Arguments& args) { | 196 Handle<Value> Shell::Write(const Arguments& args) { |
197 for (int i = 0; i < args.Length(); i++) { | 197 for (int i = 0; i < args.Length(); i++) { |
198 HandleScope handle_scope; | 198 HandleScope handle_scope; |
199 if (i != 0) { | 199 if (i != 0) { |
200 printf(" "); | 200 printf(" "); |
201 } | 201 } |
202 v8::String::Utf8Value str(args[i]); | 202 v8::String::Utf8Value str(args[i]); |
203 int n = static_cast<int>(fwrite(*str, sizeof(**str), str.length(), stdout)); | 203 int n = static_cast<int>(fwrite(*str, sizeof(**str), str.length(), stdout)); |
204 if (n != str.length()) { | 204 if (n != str.length()) { |
205 printf("Error in fwrite\n"); | 205 printf("Error in fwrite\n"); |
206 exit(1); | 206 Exit(1); |
207 } | 207 } |
208 } | 208 } |
209 return Undefined(); | 209 return Undefined(); |
210 } | 210 } |
211 | 211 |
212 | 212 |
213 Handle<Value> Shell::EnableProfiler(const Arguments& args) { | 213 Handle<Value> Shell::EnableProfiler(const Arguments& args) { |
214 V8::ResumeProfiler(); | 214 V8::ResumeProfiler(); |
215 return Undefined(); | 215 return Undefined(); |
216 } | 216 } |
(...skipping 297 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
514 } | 514 } |
515 | 515 |
516 | 516 |
517 void Shell::MapCounters(const char* name) { | 517 void Shell::MapCounters(const char* name) { |
518 counters_file_ = i::OS::MemoryMappedFile::create( | 518 counters_file_ = i::OS::MemoryMappedFile::create( |
519 name, sizeof(CounterCollection), &local_counters_); | 519 name, sizeof(CounterCollection), &local_counters_); |
520 void* memory = (counters_file_ == NULL) ? | 520 void* memory = (counters_file_ == NULL) ? |
521 NULL : counters_file_->memory(); | 521 NULL : counters_file_->memory(); |
522 if (memory == NULL) { | 522 if (memory == NULL) { |
523 printf("Could not map counters file %s\n", name); | 523 printf("Could not map counters file %s\n", name); |
524 exit(1); | 524 Exit(1); |
525 } | 525 } |
526 counters_ = static_cast<CounterCollection*>(memory); | 526 counters_ = static_cast<CounterCollection*>(memory); |
527 V8::SetCounterFunction(LookupCounter); | 527 V8::SetCounterFunction(LookupCounter); |
528 V8::SetCreateHistogramFunction(CreateHistogram); | 528 V8::SetCreateHistogramFunction(CreateHistogram); |
529 V8::SetAddHistogramSampleFunction(AddHistogramSample); | 529 V8::SetAddHistogramSampleFunction(AddHistogramSample); |
530 } | 530 } |
531 | 531 |
532 | 532 |
533 int CounterMap::Hash(const char* name) { | 533 int CounterMap::Hash(const char* name) { |
534 int h = 0; | 534 int h = 0; |
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
711 return global_template; | 711 return global_template; |
712 } | 712 } |
713 | 713 |
714 | 714 |
715 void Shell::Initialize() { | 715 void Shell::Initialize() { |
716 #ifdef COMPRESS_STARTUP_DATA_BZ2 | 716 #ifdef COMPRESS_STARTUP_DATA_BZ2 |
717 BZip2Decompressor startup_data_decompressor; | 717 BZip2Decompressor startup_data_decompressor; |
718 int bz2_result = startup_data_decompressor.Decompress(); | 718 int bz2_result = startup_data_decompressor.Decompress(); |
719 if (bz2_result != BZ_OK) { | 719 if (bz2_result != BZ_OK) { |
720 fprintf(stderr, "bzip error code: %d\n", bz2_result); | 720 fprintf(stderr, "bzip error code: %d\n", bz2_result); |
721 exit(1); | 721 Exit(1); |
722 } | 722 } |
723 #endif | 723 #endif |
724 | 724 |
725 #ifndef V8_SHARED | 725 #ifndef V8_SHARED |
726 Shell::counter_map_ = new CounterMap(); | 726 Shell::counter_map_ = new CounterMap(); |
727 // Set up counters | 727 // Set up counters |
728 if (i::StrLength(i::FLAG_map_counters) != 0) | 728 if (i::StrLength(i::FLAG_map_counters) != 0) |
729 MapCounters(i::FLAG_map_counters); | 729 MapCounters(i::FLAG_map_counters); |
730 if (i::FLAG_dump_counters) { | 730 if (i::FLAG_dump_counters) { |
731 V8::SetCounterFunction(LookupCounter); | 731 V8::SetCounterFunction(LookupCounter); |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
773 } | 773 } |
774 i::Handle<i::JSArray> arguments_jsarray = | 774 i::Handle<i::JSArray> arguments_jsarray = |
775 FACTORY->NewJSArrayWithElements(arguments_array); | 775 FACTORY->NewJSArrayWithElements(arguments_array); |
776 context->Global()->Set(String::New("arguments"), | 776 context->Global()->Set(String::New("arguments"), |
777 Utils::ToLocal(arguments_jsarray)); | 777 Utils::ToLocal(arguments_jsarray)); |
778 #endif // V8_SHARED | 778 #endif // V8_SHARED |
779 return context; | 779 return context; |
780 } | 780 } |
781 | 781 |
782 | 782 |
783 void Shell::Exit(int exit_code) { | |
784 // Use _exit instead of exit to avoid races between isolate | |
785 // threads and static destructors. | |
786 fflush(stdout); | |
787 fflush(stderr); | |
788 _exit(exit_code); | |
789 } | |
790 | |
791 | |
783 #ifndef V8_SHARED | 792 #ifndef V8_SHARED |
784 void Shell::OnExit() { | 793 void Shell::OnExit() { |
785 if (i::FLAG_dump_counters) { | 794 if (i::FLAG_dump_counters) { |
786 printf("+----------------------------------------+-------------+\n"); | 795 printf("+----------------------------------------+-------------+\n"); |
787 printf("| Name | Value |\n"); | 796 printf("| Name | Value |\n"); |
788 printf("+----------------------------------------+-------------+\n"); | 797 printf("+----------------------------------------+-------------+\n"); |
789 for (CounterMap::Iterator i(counter_map_); i.More(); i.Next()) { | 798 for (CounterMap::Iterator i(counter_map_); i.More(); i.Next()) { |
790 Counter* counter = i.CurrentValue(); | 799 Counter* counter = i.CurrentValue(); |
791 if (counter->is_histogram()) { | 800 if (counter->is_histogram()) { |
792 printf("| c:%-36s | %11i |\n", i.CurrentKey(), counter->count()); | 801 printf("| c:%-36s | %11i |\n", i.CurrentKey(), counter->count()); |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
911 ExecuteString(String::New(buffer), name, true, true); | 920 ExecuteString(String::New(buffer), name, true, true); |
912 } | 921 } |
913 #endif // V8_SHARED | 922 #endif // V8_SHARED |
914 printf("\n"); | 923 printf("\n"); |
915 } | 924 } |
916 | 925 |
917 | 926 |
918 #ifndef V8_SHARED | 927 #ifndef V8_SHARED |
919 class ShellThread : public i::Thread { | 928 class ShellThread : public i::Thread { |
920 public: | 929 public: |
921 ShellThread(int no, i::Vector<const char> files) | 930 // Takes ownership of the underlying char array of |files|. |
931 ShellThread(int no, i::SmartArrayPointer<char> files) | |
922 : Thread("d8:ShellThread"), | 932 : Thread("d8:ShellThread"), |
923 no_(no), files_(files) { } | 933 no_(no), files_(files) { } |
924 virtual void Run(); | 934 virtual void Run(); |
925 private: | 935 private: |
926 int no_; | 936 int no_; |
927 i::Vector<const char> files_; | 937 i::SmartArrayPointer<char> files_; |
928 }; | 938 }; |
929 | 939 |
930 | 940 |
931 void ShellThread::Run() { | 941 void ShellThread::Run() { |
932 char* ptr = const_cast<char*>(files_.start()); | 942 char* ptr = *files_; |
933 while ((ptr != NULL) && (*ptr != '\0')) { | 943 while ((ptr != NULL) && (*ptr != '\0')) { |
934 // For each newline-separated line. | 944 // For each newline-separated line. |
935 char* next_line = ReadLine(ptr); | 945 char* next_line = ReadLine(ptr); |
936 | 946 |
937 if (*ptr == '#') { | 947 if (*ptr == '#') { |
938 // Skip comment lines. | 948 // Skip comment lines. |
939 ptr = next_line; | 949 ptr = next_line; |
940 continue; | 950 continue; |
941 } | 951 } |
942 | 952 |
943 // Prepare the context for this thread. | 953 // Prepare the context for this thread. |
944 Locker locker; | 954 Locker locker; |
945 HandleScope scope; | 955 HandleScope outer_scope; |
946 Persistent<Context> thread_context = Shell::CreateEvaluationContext(); | 956 Persistent<Context> thread_context = Shell::CreateEvaluationContext(); |
947 Context::Scope context_scope(thread_context); | 957 Context::Scope context_scope(thread_context); |
948 | 958 |
949 while ((ptr != NULL) && (*ptr != '\0')) { | 959 while ((ptr != NULL) && (*ptr != '\0')) { |
960 HandleScope inner_scope; | |
950 char* filename = ptr; | 961 char* filename = ptr; |
951 ptr = ReadWord(ptr); | 962 ptr = ReadWord(ptr); |
952 | 963 |
953 // Skip empty strings. | 964 // Skip empty strings. |
954 if (strlen(filename) == 0) { | 965 if (strlen(filename) == 0) { |
955 break; | 966 continue; |
956 } | 967 } |
957 | 968 |
958 Handle<String> str = Shell::ReadFile(filename); | 969 Handle<String> str = Shell::ReadFile(filename); |
959 if (str.IsEmpty()) { | 970 if (str.IsEmpty()) { |
960 printf("WARNING: %s not found\n", filename); | 971 printf("File '%s' not found\n", filename); |
961 break; | 972 Shell::Exit(1); |
962 } | 973 } |
963 | 974 |
964 Shell::ExecuteString(str, String::New(filename), false, false); | 975 Shell::ExecuteString(str, String::New(filename), false, false); |
965 } | 976 } |
966 | 977 |
967 thread_context.Dispose(); | 978 thread_context.Dispose(); |
968 ptr = next_line; | 979 ptr = next_line; |
969 } | 980 } |
970 } | 981 } |
971 #endif // V8_SHARED | 982 #endif // V8_SHARED |
972 | 983 |
973 | 984 |
974 SourceGroup::~SourceGroup() { | 985 SourceGroup::~SourceGroup() { |
975 #ifndef V8_SHARED | 986 #ifndef V8_SHARED |
976 delete next_semaphore_; | 987 delete next_semaphore_; |
977 next_semaphore_ = NULL; | 988 next_semaphore_ = NULL; |
978 delete done_semaphore_; | 989 delete done_semaphore_; |
979 done_semaphore_ = NULL; | 990 done_semaphore_ = NULL; |
980 delete thread_; | 991 delete thread_; |
981 thread_ = NULL; | 992 thread_ = NULL; |
982 #endif // V8_SHARED | 993 #endif // V8_SHARED |
983 } | 994 } |
984 | 995 |
985 | 996 |
986 void SourceGroup::ExitShell(int exit_code) { | |
987 // Use _exit instead of exit to avoid races between isolate | |
988 // threads and static destructors. | |
989 fflush(stdout); | |
990 fflush(stderr); | |
991 _exit(exit_code); | |
992 } | |
993 | |
994 | |
995 void SourceGroup::Execute() { | 997 void SourceGroup::Execute() { |
996 for (int i = begin_offset_; i < end_offset_; ++i) { | 998 for (int i = begin_offset_; i < end_offset_; ++i) { |
997 const char* arg = argv_[i]; | 999 const char* arg = argv_[i]; |
998 if (strcmp(arg, "-e") == 0 && i + 1 < end_offset_) { | 1000 if (strcmp(arg, "-e") == 0 && i + 1 < end_offset_) { |
999 // Execute argument given to -e option directly. | 1001 // Execute argument given to -e option directly. |
1000 HandleScope handle_scope; | 1002 HandleScope handle_scope; |
1001 Handle<String> file_name = String::New("unnamed"); | 1003 Handle<String> file_name = String::New("unnamed"); |
1002 Handle<String> source = String::New(argv_[i + 1]); | 1004 Handle<String> source = String::New(argv_[i + 1]); |
1003 if (!Shell::ExecuteString(source, file_name, false, true)) { | 1005 if (!Shell::ExecuteString(source, file_name, false, true)) { |
1004 ExitShell(1); | 1006 Shell::Exit(1); |
1005 return; | |
1006 } | 1007 } |
1007 ++i; | 1008 ++i; |
1008 } else if (arg[0] == '-') { | 1009 } else if (arg[0] == '-') { |
1009 // Ignore other options. They have been parsed already. | 1010 // Ignore other options. They have been parsed already. |
1010 } else { | 1011 } else { |
1011 // Use all other arguments as names of files to load and run. | 1012 // Use all other arguments as names of files to load and run. |
1012 HandleScope handle_scope; | 1013 HandleScope handle_scope; |
1013 Handle<String> file_name = String::New(arg); | 1014 Handle<String> file_name = String::New(arg); |
1014 Handle<String> source = ReadFile(arg); | 1015 Handle<String> source = ReadFile(arg); |
1015 if (source.IsEmpty()) { | 1016 if (source.IsEmpty()) { |
1016 printf("Error reading '%s'\n", arg); | 1017 printf("Error reading '%s'\n", arg); |
1017 ExitShell(1); | 1018 Shell::Exit(1); |
1018 return; | |
1019 } | 1019 } |
1020 if (!Shell::ExecuteString(source, file_name, false, true)) { | 1020 if (!Shell::ExecuteString(source, file_name, false, true)) { |
1021 ExitShell(1); | 1021 Shell::Exit(1); |
1022 return; | |
1023 } | 1022 } |
1024 } | 1023 } |
1025 } | 1024 } |
1026 } | 1025 } |
1027 | 1026 |
1028 | 1027 |
1029 Handle<String> SourceGroup::ReadFile(const char* name) { | 1028 Handle<String> SourceGroup::ReadFile(const char* name) { |
1030 int size; | 1029 int size; |
1031 const char* chars = ReadChars(name, &size); | 1030 const char* chars = ReadChars(name, &size); |
1032 if (chars == NULL) return Handle<String>(); | 1031 if (chars == NULL) return Handle<String>(); |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1083 if (thread_ == NULL) return; | 1082 if (thread_ == NULL) return; |
1084 if (Shell::options.last_run) { | 1083 if (Shell::options.last_run) { |
1085 thread_->Join(); | 1084 thread_->Join(); |
1086 } else { | 1085 } else { |
1087 done_semaphore_->Wait(); | 1086 done_semaphore_->Wait(); |
1088 } | 1087 } |
1089 } | 1088 } |
1090 #endif // V8_SHARED | 1089 #endif // V8_SHARED |
1091 | 1090 |
1092 | 1091 |
1093 ShellOptions::~ShellOptions() { | |
1094 delete[] isolate_sources; | |
1095 isolate_sources = NULL; | |
1096 #ifndef V8_SHARED | |
1097 delete parallel_files; | |
1098 parallel_files = NULL; | |
1099 #endif // V8_SHARED | |
1100 } | |
1101 | |
1102 | |
1103 bool Shell::SetOptions(int argc, char* argv[]) { | 1092 bool Shell::SetOptions(int argc, char* argv[]) { |
1104 for (int i = 0; i < argc; i++) { | 1093 for (int i = 0; i < argc; i++) { |
1105 if (strcmp(argv[i], "--stress-opt") == 0) { | 1094 if (strcmp(argv[i], "--stress-opt") == 0) { |
1106 options.stress_opt = true; | 1095 options.stress_opt = true; |
1107 argv[i] = NULL; | 1096 argv[i] = NULL; |
1108 } else if (strcmp(argv[i], "--stress-deopt") == 0) { | 1097 } else if (strcmp(argv[i], "--stress-deopt") == 0) { |
1109 options.stress_deopt = true; | 1098 options.stress_deopt = true; |
1110 argv[i] = NULL; | 1099 argv[i] = NULL; |
1111 } else if (strcmp(argv[i], "--noalways-opt") == 0) { | 1100 } else if (strcmp(argv[i], "--noalways-opt") == 0) { |
1112 // No support for stressing if we can't use --always-opt. | 1101 // No support for stressing if we can't use --always-opt. |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1158 } else if (strcmp(argv[i], "-f") == 0) { | 1147 } else if (strcmp(argv[i], "-f") == 0) { |
1159 // Ignore any -f flags for compatibility with other stand-alone | 1148 // Ignore any -f flags for compatibility with other stand-alone |
1160 // JavaScript engines. | 1149 // JavaScript engines. |
1161 continue; | 1150 continue; |
1162 } else if (strcmp(argv[i], "--isolate") == 0) { | 1151 } else if (strcmp(argv[i], "--isolate") == 0) { |
1163 #ifdef V8_SHARED | 1152 #ifdef V8_SHARED |
1164 printf("D8 with shared library does not support multi-threading\n"); | 1153 printf("D8 with shared library does not support multi-threading\n"); |
1165 return false; | 1154 return false; |
1166 #endif // V8_SHARED | 1155 #endif // V8_SHARED |
1167 options.num_isolates++; | 1156 options.num_isolates++; |
1157 } else if (strcmp(argv[i], "-p") == 0) { | |
1158 options.num_parallel_files++; | |
1159 #ifdef V8_SHARED | |
1160 printf("D8 with shared library does not support multi-threading\n"); | |
1161 return false; | |
1162 #endif // V8_SHARED | |
1168 } | 1163 } |
1169 #ifdef V8_SHARED | 1164 #ifdef V8_SHARED |
1170 else if (strcmp(argv[i], "--dump-counters") == 0) { | 1165 else if (strcmp(argv[i], "--dump-counters") == 0) { |
1171 printf("D8 with shared library does not include counters\n"); | 1166 printf("D8 with shared library does not include counters\n"); |
1172 return false; | 1167 return false; |
1173 } else if (strcmp(argv[i], "-p") == 0) { | |
1174 printf("D8 with shared library does not support multi-threading\n"); | |
1175 return false; | |
1176 } else if (strcmp(argv[i], "--debugger") == 0) { | 1168 } else if (strcmp(argv[i], "--debugger") == 0) { |
1177 printf("Javascript debugger not included\n"); | 1169 printf("Javascript debugger not included\n"); |
1178 return false; | 1170 return false; |
1179 } | 1171 } |
1180 #endif // V8_SHARED | 1172 #endif // V8_SHARED |
1181 } | 1173 } |
1182 | 1174 |
1183 #ifndef V8_SHARED | 1175 #ifndef V8_SHARED |
1184 // Run parallel threads if we are not using --isolate | 1176 // Run parallel threads if we are not using --isolate |
1177 options.parallel_files = new char*[options.num_parallel_files]; | |
1178 int parallel_files_set = 0; | |
1185 for (int i = 1; i < argc; i++) { | 1179 for (int i = 1; i < argc; i++) { |
1186 if (argv[i] == NULL) continue; | 1180 if (argv[i] == NULL) continue; |
1187 if (strcmp(argv[i], "-p") == 0 && i + 1 < argc) { | 1181 if (strcmp(argv[i], "-p") == 0 && i + 1 < argc) { |
1188 if (options.num_isolates > 1) { | 1182 if (options.num_isolates > 1) { |
1189 printf("-p is not compatible with --isolate\n"); | 1183 printf("-p is not compatible with --isolate\n"); |
1190 return false; | 1184 return false; |
1191 } | 1185 } |
1192 argv[i] = NULL; | 1186 argv[i] = NULL; |
1193 if (options.parallel_files == NULL) { | 1187 i++; |
1194 options.parallel_files = new i::List<i::Vector<const char> >(); | 1188 options.parallel_files[parallel_files_set] = argv[i]; |
1195 } | 1189 parallel_files_set++; |
1196 int size = 0; | |
1197 const char* files = ReadChars(argv[++i], &size); | |
1198 if (files == NULL) { | |
1199 printf("-p option incomplete\n"); | |
1200 return false; | |
1201 } | |
1202 argv[i] = NULL; | 1190 argv[i] = NULL; |
1203 options.parallel_files->Add(i::Vector<const char>(files, size)); | |
1204 delete[] files; | |
1205 } | 1191 } |
1206 } | 1192 } |
1193 if (parallel_files_set != options.num_parallel_files) { | |
1194 printf("-p requires a file containing a list of files as parameter\n"); | |
1195 return false; | |
1196 } | |
1207 #endif // V8_SHARED | 1197 #endif // V8_SHARED |
1208 | 1198 |
1209 v8::V8::SetFlagsFromCommandLine(&argc, argv, true); | 1199 v8::V8::SetFlagsFromCommandLine(&argc, argv, true); |
1210 | 1200 |
1211 // Set up isolated source groups. | 1201 // Set up isolated source groups. |
1212 options.isolate_sources = new SourceGroup[options.num_isolates]; | 1202 options.isolate_sources = new SourceGroup[options.num_isolates]; |
1213 SourceGroup* current = options.isolate_sources; | 1203 SourceGroup* current = options.isolate_sources; |
1214 current->Begin(argv, 1); | 1204 current->Begin(argv, 1); |
1215 for (int i = 1; i < argc; i++) { | 1205 for (int i = 1; i < argc; i++) { |
1216 const char* str = argv[i]; | 1206 const char* str = argv[i]; |
1217 if (strcmp(str, "--isolate") == 0) { | 1207 if (strcmp(str, "--isolate") == 0) { |
1218 current->End(i); | 1208 current->End(i); |
1219 current++; | 1209 current++; |
1220 current->Begin(argv, i + 1); | 1210 current->Begin(argv, i + 1); |
1221 } else if (strncmp(argv[i], "--", 2) == 0) { | 1211 } else if (strncmp(argv[i], "--", 2) == 0) { |
1222 printf("Warning: unknown flag %s.\nTry --help for options\n", argv[i]); | 1212 printf("Warning: unknown flag %s.\nTry --help for options\n", argv[i]); |
1223 } | 1213 } |
1224 } | 1214 } |
1225 current->End(argc); | 1215 current->End(argc); |
1226 | 1216 |
1227 return true; | 1217 return true; |
1228 } | 1218 } |
1229 | 1219 |
1230 | 1220 |
1231 int Shell::RunMain(int argc, char* argv[]) { | 1221 int Shell::RunMain(int argc, char* argv[]) { |
1232 #ifndef V8_SHARED | 1222 #ifndef V8_SHARED |
1233 i::List<i::Thread*> threads(1); | 1223 i::List<i::Thread*> threads(1); |
1234 if (options.parallel_files != NULL) | 1224 if (options.parallel_files != NULL) { |
1235 for (int i = 0; i < options.parallel_files->length(); i++) { | 1225 for (int i = 0; i < options.num_parallel_files; i++) { |
1236 i::Vector<const char> files = options.parallel_files->at(i); | 1226 i::SmartArrayPointer<char> files; |
Jakob Kummerow
2011/09/13 13:08:03
This will delete the contents of |files| when it g
| |
1227 { Locker lock(Isolate::GetCurrent()); | |
1228 int size = 0; | |
1229 files = i::SmartArrayPointer<char>( | |
1230 ReadChars(options.parallel_files[i], &size)); | |
1231 } | |
1232 if (files.is_empty()) { | |
1233 printf("File list '%s' not found\n", options.parallel_files[i]); | |
1234 Exit(1); | |
1235 } | |
1237 ShellThread* thread = new ShellThread(threads.length(), files); | 1236 ShellThread* thread = new ShellThread(threads.length(), files); |
1238 thread->Start(); | 1237 thread->Start(); |
1239 threads.Add(thread); | 1238 threads.Add(thread); |
1240 } | 1239 } |
1241 | 1240 } |
1242 for (int i = 1; i < options.num_isolates; ++i) { | 1241 for (int i = 1; i < options.num_isolates; ++i) { |
1243 options.isolate_sources[i].StartExecuteInThread(); | 1242 options.isolate_sources[i].StartExecuteInThread(); |
1244 } | 1243 } |
1245 #endif // V8_SHARED | 1244 #endif // V8_SHARED |
1246 { // NOLINT | 1245 { // NOLINT |
1247 Locker lock; | 1246 Locker lock; |
1248 HandleScope scope; | 1247 HandleScope scope; |
1249 Persistent<Context> context = CreateEvaluationContext(); | 1248 Persistent<Context> context = CreateEvaluationContext(); |
1250 { | 1249 { |
1251 Context::Scope cscope(context); | 1250 Context::Scope cscope(context); |
1252 options.isolate_sources[0].Execute(); | 1251 options.isolate_sources[0].Execute(); |
1253 } | 1252 } |
1254 if (options.last_run) { | 1253 if (options.last_run) { |
1255 // Keep using the same context in the interactive shell | 1254 // Keep using the same context in the interactive shell |
1256 evaluation_context_ = context; | 1255 evaluation_context_ = context; |
1257 } else { | 1256 } else { |
1258 context.Dispose(); | 1257 context.Dispose(); |
1259 } | 1258 } |
1260 | 1259 |
1261 #ifndef V8_SHARED | 1260 #ifndef V8_SHARED |
1262 // Start preemption if threads have been created and preemption is enabled. | 1261 // Start preemption if threads have been created and preemption is enabled. |
1263 if (options.parallel_files != NULL | 1262 if (threads.length() > 0 |
1264 && threads.length() > 0 | |
1265 && options.use_preemption) { | 1263 && options.use_preemption) { |
1266 Locker::StartPreemption(options.preemption_interval); | 1264 Locker::StartPreemption(options.preemption_interval); |
1267 } | 1265 } |
1268 #endif // V8_SHARED | 1266 #endif // V8_SHARED |
1269 } | 1267 } |
1270 | 1268 |
1271 #ifndef V8_SHARED | 1269 #ifndef V8_SHARED |
1272 for (int i = 1; i < options.num_isolates; ++i) { | 1270 for (int i = 1; i < options.num_isolates; ++i) { |
1273 options.isolate_sources[i].WaitForThread(); | 1271 options.isolate_sources[i].WaitForThread(); |
1274 } | 1272 } |
1275 | 1273 |
1276 if (options.parallel_files != NULL) | 1274 for (int i = 0; i < threads.length(); i++) { |
1277 for (int i = 0; i < threads.length(); i++) { | 1275 i::Thread* thread = threads[i]; |
1278 i::Thread* thread = threads[i]; | 1276 thread->Join(); |
1279 thread->Join(); | 1277 delete thread; |
1280 delete thread; | 1278 } |
1281 } | 1279 |
1280 if (threads.length() > 0 && options.use_preemption) { | |
1281 Locker lock; | |
1282 Locker::StopPreemption(); | |
1283 } | |
1282 #endif // V8_SHARED | 1284 #endif // V8_SHARED |
1283 return 0; | 1285 return 0; |
1284 } | 1286 } |
1285 | 1287 |
1286 | 1288 |
1287 int Shell::Main(int argc, char* argv[]) { | 1289 int Shell::Main(int argc, char* argv[]) { |
1288 if (!SetOptions(argc, argv)) return 1; | 1290 if (!SetOptions(argc, argv)) return 1; |
1289 Initialize(); | 1291 Initialize(); |
1290 | 1292 |
1291 int result = 0; | 1293 int result = 0; |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1338 } | 1340 } |
1339 | 1341 |
1340 } // namespace v8 | 1342 } // namespace v8 |
1341 | 1343 |
1342 | 1344 |
1343 #ifndef GOOGLE3 | 1345 #ifndef GOOGLE3 |
1344 int main(int argc, char* argv[]) { | 1346 int main(int argc, char* argv[]) { |
1345 return v8::Shell::Main(argc, argv); | 1347 return v8::Shell::Main(argc, argv); |
1346 } | 1348 } |
1347 #endif | 1349 #endif |
OLD | NEW |