OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 | 5 |
6 // Defined when linking against shared lib on Windows. | 6 // Defined when linking against shared lib on Windows. |
7 #if defined(USING_V8_SHARED) && !defined(V8_SHARED) | 7 #if defined(USING_V8_SHARED) && !defined(V8_SHARED) |
8 #define V8_SHARED | 8 #define V8_SHARED |
9 #endif | 9 #endif |
10 | 10 |
(...skipping 454 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
465 Handle<String> Shell::ReadFromStdin(Isolate* isolate) { | 465 Handle<String> Shell::ReadFromStdin(Isolate* isolate) { |
466 static const int kBufferSize = 256; | 466 static const int kBufferSize = 256; |
467 char buffer[kBufferSize]; | 467 char buffer[kBufferSize]; |
468 Handle<String> accumulator = String::NewFromUtf8(isolate, ""); | 468 Handle<String> accumulator = String::NewFromUtf8(isolate, ""); |
469 int length; | 469 int length; |
470 while (true) { | 470 while (true) { |
471 // Continue reading if the line ends with an escape '\\' or the line has | 471 // Continue reading if the line ends with an escape '\\' or the line has |
472 // not been fully read into the buffer yet (does not end with '\n'). | 472 // not been fully read into the buffer yet (does not end with '\n'). |
473 // If fgets gets an error, just give up. | 473 // If fgets gets an error, just give up. |
474 char* input = NULL; | 474 char* input = NULL; |
475 { // Release lock for blocking input. | 475 input = fgets(buffer, kBufferSize, stdin); |
476 Unlocker unlock(isolate); | |
477 input = fgets(buffer, kBufferSize, stdin); | |
478 } | |
479 if (input == NULL) return Handle<String>(); | 476 if (input == NULL) return Handle<String>(); |
480 length = static_cast<int>(strlen(buffer)); | 477 length = static_cast<int>(strlen(buffer)); |
481 if (length == 0) { | 478 if (length == 0) { |
482 return accumulator; | 479 return accumulator; |
483 } else if (buffer[length-1] != '\n') { | 480 } else if (buffer[length-1] != '\n') { |
484 accumulator = String::Concat( | 481 accumulator = String::Concat( |
485 accumulator, | 482 accumulator, |
486 String::NewFromUtf8(isolate, buffer, String::kNormalString, length)); | 483 String::NewFromUtf8(isolate, buffer, String::kNormalString, length)); |
487 } else if (length > 1 && buffer[length-2] == '\\') { | 484 } else if (length > 1 && buffer[length-2] == '\\') { |
488 buffer[length-2] = '\n'; | 485 buffer[length-2] = '\n'; |
(...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
730 } | 727 } |
731 | 728 |
732 | 729 |
733 void Shell::AddHistogramSample(void* histogram, int sample) { | 730 void Shell::AddHistogramSample(void* histogram, int sample) { |
734 Counter* counter = reinterpret_cast<Counter*>(histogram); | 731 Counter* counter = reinterpret_cast<Counter*>(histogram); |
735 counter->AddSample(sample); | 732 counter->AddSample(sample); |
736 } | 733 } |
737 | 734 |
738 | 735 |
739 void Shell::InstallUtilityScript(Isolate* isolate) { | 736 void Shell::InstallUtilityScript(Isolate* isolate) { |
740 Locker lock(isolate); | |
741 HandleScope scope(isolate); | 737 HandleScope scope(isolate); |
742 // If we use the utility context, we have to set the security tokens so that | 738 // If we use the utility context, we have to set the security tokens so that |
743 // utility, evaluation and debug context can all access each other. | 739 // utility, evaluation and debug context can all access each other. |
744 v8::Local<v8::Context> utility_context = | 740 v8::Local<v8::Context> utility_context = |
745 v8::Local<v8::Context>::New(isolate, utility_context_); | 741 v8::Local<v8::Context>::New(isolate, utility_context_); |
746 v8::Local<v8::Context> evaluation_context = | 742 v8::Local<v8::Context> evaluation_context = |
747 v8::Local<v8::Context>::New(isolate, evaluation_context_); | 743 v8::Local<v8::Context>::New(isolate, evaluation_context_); |
748 utility_context->SetSecurityToken(Undefined(isolate)); | 744 utility_context->SetSecurityToken(Undefined(isolate)); |
749 evaluation_context->SetSecurityToken(Undefined(isolate)); | 745 evaluation_context->SetSecurityToken(Undefined(isolate)); |
750 v8::Context::Scope context_scope(utility_context); | 746 v8::Context::Scope context_scope(utility_context); |
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
897 V8::SetCreateHistogramFunction(CreateHistogram); | 893 V8::SetCreateHistogramFunction(CreateHistogram); |
898 V8::SetAddHistogramSampleFunction(AddHistogramSample); | 894 V8::SetAddHistogramSampleFunction(AddHistogramSample); |
899 } | 895 } |
900 #endif // !V8_SHARED | 896 #endif // !V8_SHARED |
901 } | 897 } |
902 | 898 |
903 | 899 |
904 void Shell::InitializeDebugger(Isolate* isolate) { | 900 void Shell::InitializeDebugger(Isolate* isolate) { |
905 if (options.test_shell) return; | 901 if (options.test_shell) return; |
906 #ifndef V8_SHARED | 902 #ifndef V8_SHARED |
907 Locker lock(isolate); | |
908 HandleScope scope(isolate); | 903 HandleScope scope(isolate); |
909 Handle<ObjectTemplate> global_template = CreateGlobalTemplate(isolate); | 904 Handle<ObjectTemplate> global_template = CreateGlobalTemplate(isolate); |
910 utility_context_.Reset(isolate, | 905 utility_context_.Reset(isolate, |
911 Context::New(isolate, NULL, global_template)); | 906 Context::New(isolate, NULL, global_template)); |
912 #endif // !V8_SHARED | 907 #endif // !V8_SHARED |
913 } | 908 } |
914 | 909 |
915 | 910 |
916 Local<Context> Shell::CreateEvaluationContext(Isolate* isolate) { | 911 Local<Context> Shell::CreateEvaluationContext(Isolate* isolate) { |
917 #ifndef V8_SHARED | 912 #ifndef V8_SHARED |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1024 if (fstat(fileno(file), &file_stat) != 0) return NULL; | 1019 if (fstat(fileno(file), &file_stat) != 0) return NULL; |
1025 bool is_regular_file = ((file_stat.st_mode & S_IFREG) != 0); | 1020 bool is_regular_file = ((file_stat.st_mode & S_IFREG) != 0); |
1026 if (is_regular_file) return file; | 1021 if (is_regular_file) return file; |
1027 fclose(file); | 1022 fclose(file); |
1028 return NULL; | 1023 return NULL; |
1029 #endif | 1024 #endif |
1030 } | 1025 } |
1031 | 1026 |
1032 | 1027 |
1033 static char* ReadChars(Isolate* isolate, const char* name, int* size_out) { | 1028 static char* ReadChars(Isolate* isolate, const char* name, int* size_out) { |
1034 // Release the V8 lock while reading files. | |
1035 v8::Unlocker unlocker(isolate); | |
1036 FILE* file = FOpen(name, "rb"); | 1029 FILE* file = FOpen(name, "rb"); |
1037 if (file == NULL) return NULL; | 1030 if (file == NULL) return NULL; |
1038 | 1031 |
1039 fseek(file, 0, SEEK_END); | 1032 fseek(file, 0, SEEK_END); |
1040 int size = ftell(file); | 1033 int size = ftell(file); |
1041 rewind(file); | 1034 rewind(file); |
1042 | 1035 |
1043 char* chars = new char[size + 1]; | 1036 char* chars = new char[size + 1]; |
1044 chars[size] = '\0'; | 1037 chars[size] = '\0'; |
1045 for (int i = 0; i < size;) { | 1038 for (int i = 0; i < size;) { |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1105 char* chars = ReadChars(isolate, name, &size); | 1098 char* chars = ReadChars(isolate, name, &size); |
1106 if (chars == NULL) return Handle<String>(); | 1099 if (chars == NULL) return Handle<String>(); |
1107 Handle<String> result = | 1100 Handle<String> result = |
1108 String::NewFromUtf8(isolate, chars, String::kNormalString, size); | 1101 String::NewFromUtf8(isolate, chars, String::kNormalString, size); |
1109 delete[] chars; | 1102 delete[] chars; |
1110 return result; | 1103 return result; |
1111 } | 1104 } |
1112 | 1105 |
1113 | 1106 |
1114 void Shell::RunShell(Isolate* isolate) { | 1107 void Shell::RunShell(Isolate* isolate) { |
1115 Locker locker(isolate); | |
1116 HandleScope outer_scope(isolate); | 1108 HandleScope outer_scope(isolate); |
1117 v8::Local<v8::Context> context = | 1109 v8::Local<v8::Context> context = |
1118 v8::Local<v8::Context>::New(isolate, evaluation_context_); | 1110 v8::Local<v8::Context>::New(isolate, evaluation_context_); |
1119 v8::Context::Scope context_scope(context); | 1111 v8::Context::Scope context_scope(context); |
1120 PerIsolateData::RealmScope realm_scope(PerIsolateData::Get(isolate)); | 1112 PerIsolateData::RealmScope realm_scope(PerIsolateData::Get(isolate)); |
1121 Handle<String> name = String::NewFromUtf8(isolate, "(d8)"); | 1113 Handle<String> name = String::NewFromUtf8(isolate, "(d8)"); |
1122 LineEditor* console = LineEditor::Get(); | 1114 LineEditor* console = LineEditor::Get(); |
1123 printf("V8 version %s [console: %s]\n", V8::GetVersion(), console->name()); | 1115 printf("V8 version %s [console: %s]\n", V8::GetVersion(), console->name()); |
1124 console->Open(isolate); | 1116 console->Open(isolate); |
1125 while (true) { | 1117 while (true) { |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1197 return i::Thread::Options("IsolateThread", 2 * MB); | 1189 return i::Thread::Options("IsolateThread", 2 * MB); |
1198 } | 1190 } |
1199 | 1191 |
1200 | 1192 |
1201 void SourceGroup::ExecuteInThread() { | 1193 void SourceGroup::ExecuteInThread() { |
1202 Isolate* isolate = Isolate::New(); | 1194 Isolate* isolate = Isolate::New(); |
1203 do { | 1195 do { |
1204 next_semaphore_.Wait(); | 1196 next_semaphore_.Wait(); |
1205 { | 1197 { |
1206 Isolate::Scope iscope(isolate); | 1198 Isolate::Scope iscope(isolate); |
1207 Locker lock(isolate); | |
1208 { | 1199 { |
1209 HandleScope scope(isolate); | 1200 HandleScope scope(isolate); |
1210 PerIsolateData data(isolate); | 1201 PerIsolateData data(isolate); |
1211 Local<Context> context = Shell::CreateEvaluationContext(isolate); | 1202 Local<Context> context = Shell::CreateEvaluationContext(isolate); |
1212 { | 1203 { |
1213 Context::Scope cscope(context); | 1204 Context::Scope cscope(context); |
1214 PerIsolateData::RealmScope realm_scope(PerIsolateData::Get(isolate)); | 1205 PerIsolateData::RealmScope realm_scope(PerIsolateData::Get(isolate)); |
1215 Execute(isolate); | 1206 Execute(isolate); |
1216 } | 1207 } |
1217 } | 1208 } |
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1344 return true; | 1335 return true; |
1345 } | 1336 } |
1346 | 1337 |
1347 | 1338 |
1348 int Shell::RunMain(Isolate* isolate, int argc, char* argv[]) { | 1339 int Shell::RunMain(Isolate* isolate, int argc, char* argv[]) { |
1349 #ifndef V8_SHARED | 1340 #ifndef V8_SHARED |
1350 for (int i = 1; i < options.num_isolates; ++i) { | 1341 for (int i = 1; i < options.num_isolates; ++i) { |
1351 options.isolate_sources[i].StartExecuteInThread(); | 1342 options.isolate_sources[i].StartExecuteInThread(); |
1352 } | 1343 } |
1353 #endif // !V8_SHARED | 1344 #endif // !V8_SHARED |
1354 { // NOLINT | 1345 { |
1355 Locker lock(isolate); | 1346 HandleScope scope(isolate); |
| 1347 Local<Context> context = CreateEvaluationContext(isolate); |
| 1348 if (options.last_run) { |
| 1349 // Keep using the same context in the interactive shell. |
| 1350 evaluation_context_.Reset(isolate, context); |
| 1351 #ifndef V8_SHARED |
| 1352 // If the interactive debugger is enabled make sure to activate |
| 1353 // it before running the files passed on the command line. |
| 1354 if (i::FLAG_debugger) { |
| 1355 InstallUtilityScript(isolate); |
| 1356 } |
| 1357 #endif // !V8_SHARED |
| 1358 } |
1356 { | 1359 { |
1357 HandleScope scope(isolate); | 1360 Context::Scope cscope(context); |
1358 Local<Context> context = CreateEvaluationContext(isolate); | 1361 PerIsolateData::RealmScope realm_scope(PerIsolateData::Get(isolate)); |
1359 if (options.last_run) { | 1362 options.isolate_sources[0].Execute(isolate); |
1360 // Keep using the same context in the interactive shell. | |
1361 evaluation_context_.Reset(isolate, context); | |
1362 #ifndef V8_SHARED | |
1363 // If the interactive debugger is enabled make sure to activate | |
1364 // it before running the files passed on the command line. | |
1365 if (i::FLAG_debugger) { | |
1366 InstallUtilityScript(isolate); | |
1367 } | |
1368 #endif // !V8_SHARED | |
1369 } | |
1370 { | |
1371 Context::Scope cscope(context); | |
1372 PerIsolateData::RealmScope realm_scope(PerIsolateData::Get(isolate)); | |
1373 options.isolate_sources[0].Execute(isolate); | |
1374 } | |
1375 } | 1363 } |
1376 if (!options.last_run) { | 1364 } |
1377 if (options.send_idle_notification) { | 1365 if (!options.last_run) { |
1378 const int kLongIdlePauseInMs = 1000; | 1366 if (options.send_idle_notification) { |
1379 V8::ContextDisposedNotification(); | 1367 const int kLongIdlePauseInMs = 1000; |
1380 V8::IdleNotification(kLongIdlePauseInMs); | 1368 V8::ContextDisposedNotification(); |
1381 } | 1369 V8::IdleNotification(kLongIdlePauseInMs); |
1382 } | 1370 } |
1383 } | 1371 } |
1384 | 1372 |
1385 #ifndef V8_SHARED | 1373 #ifndef V8_SHARED |
1386 for (int i = 1; i < options.num_isolates; ++i) { | 1374 for (int i = 1; i < options.num_isolates; ++i) { |
1387 options.isolate_sources[i].WaitForThread(); | 1375 options.isolate_sources[i].WaitForThread(); |
1388 } | 1376 } |
1389 #endif // !V8_SHARED | 1377 #endif // !V8_SHARED |
1390 return 0; | 1378 return 0; |
1391 } | 1379 } |
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1557 } | 1545 } |
1558 | 1546 |
1559 } // namespace v8 | 1547 } // namespace v8 |
1560 | 1548 |
1561 | 1549 |
1562 #ifndef GOOGLE3 | 1550 #ifndef GOOGLE3 |
1563 int main(int argc, char* argv[]) { | 1551 int main(int argc, char* argv[]) { |
1564 return v8::Shell::Main(argc, argv); | 1552 return v8::Shell::Main(argc, argv); |
1565 } | 1553 } |
1566 #endif | 1554 #endif |
OLD | NEW |