OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
86 V(buffer, "buffer") \ | 86 V(buffer, "buffer") \ |
87 V(byteLength, "byteLength") \ | 87 V(byteLength, "byteLength") \ |
88 V(byteOffset, "byteOffset") \ | 88 V(byteOffset, "byteOffset") \ |
89 V(BYTES_PER_ELEMENT, "BYTES_PER_ELEMENT") \ | 89 V(BYTES_PER_ELEMENT, "BYTES_PER_ELEMENT") \ |
90 V(length, "length") | 90 V(length, "length") |
91 | 91 |
92 | 92 |
93 class Symbols { | 93 class Symbols { |
94 public: | 94 public: |
95 explicit Symbols(Isolate* isolate) : isolate_(isolate) { | 95 explicit Symbols(Isolate* isolate) : isolate_(isolate) { |
96 HandleScope scope; | 96 HandleScope scope(isolate); |
97 #define INIT_SYMBOL(name, value) \ | 97 #define INIT_SYMBOL(name, value) \ |
98 name##_ = Persistent<String>::New(isolate, String::NewSymbol(value)); | 98 name##_ = Persistent<String>::New(isolate, String::NewSymbol(value)); |
99 FOR_EACH_SYMBOL(INIT_SYMBOL) | 99 FOR_EACH_SYMBOL(INIT_SYMBOL) |
100 #undef INIT_SYMBOL | 100 #undef INIT_SYMBOL |
101 isolate->SetData(this); | 101 isolate->SetData(this); |
102 } | 102 } |
103 | 103 |
104 ~Symbols() { | 104 ~Symbols() { |
105 #define DISPOSE_SYMBOL(name, value) name##_.Dispose(isolate_); | 105 #define DISPOSE_SYMBOL(name, value) name##_.Dispose(isolate_); |
106 FOR_EACH_SYMBOL(DISPOSE_SYMBOL) | 106 FOR_EACH_SYMBOL(DISPOSE_SYMBOL) |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
174 #endif // V8_SHARED | 174 #endif // V8_SHARED |
175 | 175 |
176 | 176 |
177 // Converts a V8 value to a C string. | 177 // Converts a V8 value to a C string. |
178 const char* Shell::ToCString(const v8::String::Utf8Value& value) { | 178 const char* Shell::ToCString(const v8::String::Utf8Value& value) { |
179 return *value ? *value : "<string conversion failed>"; | 179 return *value ? *value : "<string conversion failed>"; |
180 } | 180 } |
181 | 181 |
182 | 182 |
183 // Executes a string within the current v8 context. | 183 // Executes a string within the current v8 context. |
184 bool Shell::ExecuteString(Handle<String> source, | 184 bool Shell::ExecuteString(Isolate* isolate, |
| 185 Handle<String> source, |
185 Handle<Value> name, | 186 Handle<Value> name, |
186 bool print_result, | 187 bool print_result, |
187 bool report_exceptions) { | 188 bool report_exceptions) { |
188 #if !defined(V8_SHARED) && defined(ENABLE_DEBUGGER_SUPPORT) | 189 #if !defined(V8_SHARED) && defined(ENABLE_DEBUGGER_SUPPORT) |
189 bool FLAG_debugger = i::FLAG_debugger; | 190 bool FLAG_debugger = i::FLAG_debugger; |
190 #else | 191 #else |
191 bool FLAG_debugger = false; | 192 bool FLAG_debugger = false; |
192 #endif // !V8_SHARED && ENABLE_DEBUGGER_SUPPORT | 193 #endif // !V8_SHARED && ENABLE_DEBUGGER_SUPPORT |
193 HandleScope handle_scope; | 194 HandleScope handle_scope(isolate); |
194 TryCatch try_catch; | 195 TryCatch try_catch; |
195 options.script_executed = true; | 196 options.script_executed = true; |
196 if (FLAG_debugger) { | 197 if (FLAG_debugger) { |
197 // When debugging make exceptions appear to be uncaught. | 198 // When debugging make exceptions appear to be uncaught. |
198 try_catch.SetVerbose(true); | 199 try_catch.SetVerbose(true); |
199 } | 200 } |
200 Handle<Script> script = Script::Compile(source, name); | 201 Handle<Script> script = Script::Compile(source, name); |
201 if (script.IsEmpty()) { | 202 if (script.IsEmpty()) { |
202 // Print errors that happened during compilation. | 203 // Print errors that happened during compilation. |
203 if (report_exceptions && !FLAG_debugger) | 204 if (report_exceptions && !FLAG_debugger) |
204 ReportException(&try_catch); | 205 ReportException(isolate, &try_catch); |
205 return false; | 206 return false; |
206 } else { | 207 } else { |
207 Handle<Value> result = script->Run(); | 208 Handle<Value> result = script->Run(); |
208 if (result.IsEmpty()) { | 209 if (result.IsEmpty()) { |
209 ASSERT(try_catch.HasCaught()); | 210 ASSERT(try_catch.HasCaught()); |
210 // Print errors that happened during execution. | 211 // Print errors that happened during execution. |
211 if (report_exceptions && !FLAG_debugger) | 212 if (report_exceptions && !FLAG_debugger) |
212 ReportException(&try_catch); | 213 ReportException(isolate, &try_catch); |
213 return false; | 214 return false; |
214 } else { | 215 } else { |
215 ASSERT(!try_catch.HasCaught()); | 216 ASSERT(!try_catch.HasCaught()); |
216 if (print_result && !result->IsUndefined()) { | 217 if (print_result && !result->IsUndefined()) { |
217 // If all went well and the result wasn't undefined then print | 218 // If all went well and the result wasn't undefined then print |
218 // the returned value. | 219 // the returned value. |
219 v8::String::Utf8Value str(result); | 220 v8::String::Utf8Value str(result); |
220 size_t count = fwrite(*str, sizeof(**str), str.length(), stdout); | 221 size_t count = fwrite(*str, sizeof(**str), str.length(), stdout); |
221 (void) count; // Silence GCC-4.5.x "unused result" warning. | 222 (void) count; // Silence GCC-4.5.x "unused result" warning. |
222 printf("\n"); | 223 printf("\n"); |
223 } | 224 } |
224 return true; | 225 return true; |
225 } | 226 } |
226 } | 227 } |
227 } | 228 } |
228 | 229 |
229 | 230 |
230 Handle<Value> Shell::Print(const Arguments& args) { | 231 Handle<Value> Shell::Print(const Arguments& args) { |
231 Handle<Value> val = Write(args); | 232 Handle<Value> val = Write(args); |
232 printf("\n"); | 233 printf("\n"); |
233 fflush(stdout); | 234 fflush(stdout); |
234 return val; | 235 return val; |
235 } | 236 } |
236 | 237 |
237 | 238 |
238 Handle<Value> Shell::Write(const Arguments& args) { | 239 Handle<Value> Shell::Write(const Arguments& args) { |
239 for (int i = 0; i < args.Length(); i++) { | 240 for (int i = 0; i < args.Length(); i++) { |
240 HandleScope handle_scope; | 241 HandleScope handle_scope(args.GetIsolate()); |
241 if (i != 0) { | 242 if (i != 0) { |
242 printf(" "); | 243 printf(" "); |
243 } | 244 } |
244 | 245 |
245 // Explicitly catch potential exceptions in toString(). | 246 // Explicitly catch potential exceptions in toString(). |
246 v8::TryCatch try_catch; | 247 v8::TryCatch try_catch; |
247 Handle<String> str_obj = args[i]->ToString(); | 248 Handle<String> str_obj = args[i]->ToString(); |
248 if (try_catch.HasCaught()) return try_catch.ReThrow(); | 249 if (try_catch.HasCaught()) return try_catch.ReThrow(); |
249 | 250 |
250 v8::String::Utf8Value str(str_obj); | 251 v8::String::Utf8Value str(str_obj); |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
308 accumulator = String::Concat(accumulator, String::New(buffer, length-1)); | 309 accumulator = String::Concat(accumulator, String::New(buffer, length-1)); |
309 } else { | 310 } else { |
310 return String::Concat(accumulator, String::New(buffer, length-1)); | 311 return String::Concat(accumulator, String::New(buffer, length-1)); |
311 } | 312 } |
312 } | 313 } |
313 } | 314 } |
314 | 315 |
315 | 316 |
316 Handle<Value> Shell::Load(const Arguments& args) { | 317 Handle<Value> Shell::Load(const Arguments& args) { |
317 for (int i = 0; i < args.Length(); i++) { | 318 for (int i = 0; i < args.Length(); i++) { |
318 HandleScope handle_scope; | 319 HandleScope handle_scope(args.GetIsolate()); |
319 String::Utf8Value file(args[i]); | 320 String::Utf8Value file(args[i]); |
320 if (*file == NULL) { | 321 if (*file == NULL) { |
321 return Throw("Error loading file"); | 322 return Throw("Error loading file"); |
322 } | 323 } |
323 Handle<String> source = ReadFile(args.GetIsolate(), *file); | 324 Handle<String> source = ReadFile(args.GetIsolate(), *file); |
324 if (source.IsEmpty()) { | 325 if (source.IsEmpty()) { |
325 return Throw("Error loading file"); | 326 return Throw("Error loading file"); |
326 } | 327 } |
327 if (!ExecuteString(source, String::New(*file), false, true)) { | 328 if (!ExecuteString(args.GetIsolate(), |
| 329 source, |
| 330 String::New(*file), |
| 331 false, |
| 332 true)) { |
328 return Throw("Error executing file"); | 333 return Throw("Error executing file"); |
329 } | 334 } |
330 } | 335 } |
331 return Undefined(args.GetIsolate()); | 336 return Undefined(args.GetIsolate()); |
332 } | 337 } |
333 | 338 |
334 static int32_t convertToInt(Local<Value> value_in, TryCatch* try_catch) { | 339 static int32_t convertToInt(Local<Value> value_in, TryCatch* try_catch) { |
335 if (value_in->IsInt32()) { | 340 if (value_in->IsInt32()) { |
336 return value_in->Int32Value(); | 341 return value_in->Int32Value(); |
337 } | 342 } |
(...skipping 482 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
820 } | 825 } |
821 } | 826 } |
822 | 827 |
823 return Undefined(args.GetIsolate()); | 828 return Undefined(args.GetIsolate()); |
824 } | 829 } |
825 | 830 |
826 | 831 |
827 void Shell::ExternalArrayWeakCallback(v8::Isolate* isolate, | 832 void Shell::ExternalArrayWeakCallback(v8::Isolate* isolate, |
828 Persistent<Value> object, | 833 Persistent<Value> object, |
829 void* data) { | 834 void* data) { |
830 HandleScope scope; | 835 HandleScope scope(isolate); |
831 int32_t length = | 836 int32_t length = |
832 object->ToObject()->Get(Symbols::byteLength(isolate))->Uint32Value(); | 837 object->ToObject()->Get(Symbols::byteLength(isolate))->Uint32Value(); |
833 V8::AdjustAmountOfExternalAllocatedMemory(-length); | 838 V8::AdjustAmountOfExternalAllocatedMemory(-length); |
834 delete[] static_cast<uint8_t*>(data); | 839 delete[] static_cast<uint8_t*>(data); |
835 object.Dispose(isolate); | 840 object.Dispose(isolate); |
836 } | 841 } |
837 | 842 |
838 | 843 |
839 Handle<Value> Shell::Int8Array(const Arguments& args) { | 844 Handle<Value> Shell::Int8Array(const Arguments& args) { |
840 return CreateExternalArray(args, v8::kExternalByteArray, sizeof(int8_t)); | 845 return CreateExternalArray(args, v8::kExternalByteArray, sizeof(int8_t)); |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
896 exit(exit_code); | 901 exit(exit_code); |
897 return Undefined(args.GetIsolate()); | 902 return Undefined(args.GetIsolate()); |
898 } | 903 } |
899 | 904 |
900 | 905 |
901 Handle<Value> Shell::Version(const Arguments& args) { | 906 Handle<Value> Shell::Version(const Arguments& args) { |
902 return String::New(V8::GetVersion()); | 907 return String::New(V8::GetVersion()); |
903 } | 908 } |
904 | 909 |
905 | 910 |
906 void Shell::ReportException(v8::TryCatch* try_catch) { | 911 void Shell::ReportException(Isolate* isolate, v8::TryCatch* try_catch) { |
907 HandleScope handle_scope; | 912 HandleScope handle_scope(isolate); |
908 #if !defined(V8_SHARED) && defined(ENABLE_DEBUGGER_SUPPORT) | 913 #if !defined(V8_SHARED) && defined(ENABLE_DEBUGGER_SUPPORT) |
909 bool enter_context = !Context::InContext(); | 914 bool enter_context = !Context::InContext(); |
910 if (enter_context) utility_context_->Enter(); | 915 if (enter_context) utility_context_->Enter(); |
911 #endif // !V8_SHARED && ENABLE_DEBUGGER_SUPPORT | 916 #endif // !V8_SHARED && ENABLE_DEBUGGER_SUPPORT |
912 v8::String::Utf8Value exception(try_catch->Exception()); | 917 v8::String::Utf8Value exception(try_catch->Exception()); |
913 const char* exception_string = ToCString(exception); | 918 const char* exception_string = ToCString(exception); |
914 Handle<Message> message = try_catch->Message(); | 919 Handle<Message> message = try_catch->Message(); |
915 if (message.IsEmpty()) { | 920 if (message.IsEmpty()) { |
916 // V8 didn't provide any extra information about this error; just | 921 // V8 didn't provide any extra information about this error; just |
917 // print the exception. | 922 // print the exception. |
(...skipping 25 matching lines...) Expand all Loading... |
943 } | 948 } |
944 } | 949 } |
945 printf("\n"); | 950 printf("\n"); |
946 #if !defined(V8_SHARED) && defined(ENABLE_DEBUGGER_SUPPORT) | 951 #if !defined(V8_SHARED) && defined(ENABLE_DEBUGGER_SUPPORT) |
947 if (enter_context) utility_context_->Exit(); | 952 if (enter_context) utility_context_->Exit(); |
948 #endif // !V8_SHARED && ENABLE_DEBUGGER_SUPPORT | 953 #endif // !V8_SHARED && ENABLE_DEBUGGER_SUPPORT |
949 } | 954 } |
950 | 955 |
951 | 956 |
952 #ifndef V8_SHARED | 957 #ifndef V8_SHARED |
953 Handle<Array> Shell::GetCompletions(Handle<String> text, Handle<String> full) { | 958 Handle<Array> Shell::GetCompletions(Isolate* isolate, |
954 HandleScope handle_scope; | 959 Handle<String> text, |
| 960 Handle<String> full) { |
| 961 HandleScope handle_scope(isolate); |
955 Context::Scope context_scope(utility_context_); | 962 Context::Scope context_scope(utility_context_); |
956 Handle<Object> global = utility_context_->Global(); | 963 Handle<Object> global = utility_context_->Global(); |
957 Handle<Value> fun = global->Get(String::New("GetCompletions")); | 964 Handle<Value> fun = global->Get(String::New("GetCompletions")); |
958 static const int kArgc = 3; | 965 static const int kArgc = 3; |
959 Handle<Value> argv[kArgc] = { evaluation_context_->Global(), text, full }; | 966 Handle<Value> argv[kArgc] = { evaluation_context_->Global(), text, full }; |
960 Handle<Value> val = Handle<Function>::Cast(fun)->Call(global, kArgc, argv); | 967 Handle<Value> val = Handle<Function>::Cast(fun)->Call(global, kArgc, argv); |
961 return handle_scope.Close(Handle<Array>::Cast(val)); | 968 return handle_scope.Close(Handle<Array>::Cast(val)); |
962 } | 969 } |
963 | 970 |
964 | 971 |
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1087 | 1094 |
1088 | 1095 |
1089 void Shell::AddHistogramSample(void* histogram, int sample) { | 1096 void Shell::AddHistogramSample(void* histogram, int sample) { |
1090 Counter* counter = reinterpret_cast<Counter*>(histogram); | 1097 Counter* counter = reinterpret_cast<Counter*>(histogram); |
1091 counter->AddSample(sample); | 1098 counter->AddSample(sample); |
1092 } | 1099 } |
1093 | 1100 |
1094 | 1101 |
1095 void Shell::InstallUtilityScript(Isolate* isolate) { | 1102 void Shell::InstallUtilityScript(Isolate* isolate) { |
1096 Locker lock(isolate); | 1103 Locker lock(isolate); |
1097 HandleScope scope; | 1104 HandleScope scope(isolate); |
1098 // If we use the utility context, we have to set the security tokens so that | 1105 // If we use the utility context, we have to set the security tokens so that |
1099 // utility, evaluation and debug context can all access each other. | 1106 // utility, evaluation and debug context can all access each other. |
1100 utility_context_->SetSecurityToken(Undefined(isolate)); | 1107 utility_context_->SetSecurityToken(Undefined(isolate)); |
1101 evaluation_context_->SetSecurityToken(Undefined(isolate)); | 1108 evaluation_context_->SetSecurityToken(Undefined(isolate)); |
1102 Context::Scope utility_scope(utility_context_); | 1109 Context::Scope utility_scope(utility_context_); |
1103 | 1110 |
1104 #ifdef ENABLE_DEBUGGER_SUPPORT | 1111 #ifdef ENABLE_DEBUGGER_SUPPORT |
1105 if (i::FLAG_debugger) printf("JavaScript debugger enabled\n"); | 1112 if (i::FLAG_debugger) printf("JavaScript debugger enabled\n"); |
1106 // Install the debugger object in the utility scope | 1113 // Install the debugger object in the utility scope |
1107 i::Debug* debug = i::Isolate::Current()->debug(); | 1114 i::Debug* debug = i::Isolate::Current()->debug(); |
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1265 V8::SetAddHistogramSampleFunction(AddHistogramSample); | 1272 V8::SetAddHistogramSampleFunction(AddHistogramSample); |
1266 } | 1273 } |
1267 #endif // V8_SHARED | 1274 #endif // V8_SHARED |
1268 } | 1275 } |
1269 | 1276 |
1270 | 1277 |
1271 void Shell::InitializeDebugger(Isolate* isolate) { | 1278 void Shell::InitializeDebugger(Isolate* isolate) { |
1272 if (options.test_shell) return; | 1279 if (options.test_shell) return; |
1273 #ifndef V8_SHARED | 1280 #ifndef V8_SHARED |
1274 Locker lock(isolate); | 1281 Locker lock(isolate); |
1275 HandleScope scope; | 1282 HandleScope scope(isolate); |
1276 Handle<ObjectTemplate> global_template = CreateGlobalTemplate(isolate); | 1283 Handle<ObjectTemplate> global_template = CreateGlobalTemplate(isolate); |
1277 utility_context_ = Context::New(NULL, global_template); | 1284 utility_context_ = Context::New(NULL, global_template); |
1278 | 1285 |
1279 #ifdef ENABLE_DEBUGGER_SUPPORT | 1286 #ifdef ENABLE_DEBUGGER_SUPPORT |
1280 // Start the debugger agent if requested. | 1287 // Start the debugger agent if requested. |
1281 if (i::FLAG_debugger_agent) { | 1288 if (i::FLAG_debugger_agent) { |
1282 v8::Debug::EnableAgent("d8 shell", i::FLAG_debugger_port, true); | 1289 v8::Debug::EnableAgent("d8 shell", i::FLAG_debugger_port, true); |
1283 v8::Debug::SetDebugMessageDispatchHandler(DispatchDebugMessages, true); | 1290 v8::Debug::SetDebugMessageDispatchHandler(DispatchDebugMessages, true); |
1284 } | 1291 } |
1285 #endif // ENABLE_DEBUGGER_SUPPORT | 1292 #endif // ENABLE_DEBUGGER_SUPPORT |
(...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1486 if (chars == NULL) return Handle<String>(); | 1493 if (chars == NULL) return Handle<String>(); |
1487 Handle<String> result = String::New(chars, size); | 1494 Handle<String> result = String::New(chars, size); |
1488 delete[] chars; | 1495 delete[] chars; |
1489 return result; | 1496 return result; |
1490 } | 1497 } |
1491 | 1498 |
1492 | 1499 |
1493 void Shell::RunShell(Isolate* isolate) { | 1500 void Shell::RunShell(Isolate* isolate) { |
1494 Locker locker(isolate); | 1501 Locker locker(isolate); |
1495 Context::Scope context_scope(evaluation_context_); | 1502 Context::Scope context_scope(evaluation_context_); |
1496 HandleScope outer_scope; | 1503 HandleScope outer_scope(isolate); |
1497 Handle<String> name = String::New("(d8)"); | 1504 Handle<String> name = String::New("(d8)"); |
1498 LineEditor* console = LineEditor::Get(); | 1505 LineEditor* console = LineEditor::Get(); |
1499 printf("V8 version %s [console: %s]\n", V8::GetVersion(), console->name()); | 1506 printf("V8 version %s [console: %s]\n", V8::GetVersion(), console->name()); |
1500 console->Open(isolate); | 1507 console->Open(isolate); |
1501 while (true) { | 1508 while (true) { |
1502 HandleScope inner_scope; | 1509 HandleScope inner_scope(isolate); |
1503 Handle<String> input = console->Prompt(Shell::kPrompt); | 1510 Handle<String> input = console->Prompt(Shell::kPrompt); |
1504 if (input.IsEmpty()) break; | 1511 if (input.IsEmpty()) break; |
1505 ExecuteString(input, name, true, true); | 1512 ExecuteString(isolate, input, name, true, true); |
1506 } | 1513 } |
1507 printf("\n"); | 1514 printf("\n"); |
1508 } | 1515 } |
1509 | 1516 |
1510 | 1517 |
1511 #ifndef V8_SHARED | 1518 #ifndef V8_SHARED |
1512 class ShellThread : public i::Thread { | 1519 class ShellThread : public i::Thread { |
1513 public: | 1520 public: |
1514 // Takes ownership of the underlying char array of |files|. | 1521 // Takes ownership of the underlying char array of |files|. |
1515 ShellThread(Isolate* isolate, char* files) | 1522 ShellThread(Isolate* isolate, char* files) |
(...skipping 18 matching lines...) Expand all Loading... |
1534 char* next_line = ReadLine(ptr); | 1541 char* next_line = ReadLine(ptr); |
1535 | 1542 |
1536 if (*ptr == '#') { | 1543 if (*ptr == '#') { |
1537 // Skip comment lines. | 1544 // Skip comment lines. |
1538 ptr = next_line; | 1545 ptr = next_line; |
1539 continue; | 1546 continue; |
1540 } | 1547 } |
1541 | 1548 |
1542 // Prepare the context for this thread. | 1549 // Prepare the context for this thread. |
1543 Locker locker(isolate_); | 1550 Locker locker(isolate_); |
1544 HandleScope outer_scope; | 1551 HandleScope outer_scope(isolate_); |
1545 Persistent<Context> thread_context = | 1552 Persistent<Context> thread_context = |
1546 Shell::CreateEvaluationContext(isolate_); | 1553 Shell::CreateEvaluationContext(isolate_); |
1547 Context::Scope context_scope(thread_context); | 1554 Context::Scope context_scope(thread_context); |
1548 | 1555 |
1549 while ((ptr != NULL) && (*ptr != '\0')) { | 1556 while ((ptr != NULL) && (*ptr != '\0')) { |
1550 HandleScope inner_scope; | 1557 HandleScope inner_scope(isolate_); |
1551 char* filename = ptr; | 1558 char* filename = ptr; |
1552 ptr = ReadWord(ptr); | 1559 ptr = ReadWord(ptr); |
1553 | 1560 |
1554 // Skip empty strings. | 1561 // Skip empty strings. |
1555 if (strlen(filename) == 0) { | 1562 if (strlen(filename) == 0) { |
1556 continue; | 1563 continue; |
1557 } | 1564 } |
1558 | 1565 |
1559 Handle<String> str = Shell::ReadFile(isolate_, filename); | 1566 Handle<String> str = Shell::ReadFile(isolate_, filename); |
1560 if (str.IsEmpty()) { | 1567 if (str.IsEmpty()) { |
1561 printf("File '%s' not found\n", filename); | 1568 printf("File '%s' not found\n", filename); |
1562 Shell::Exit(1); | 1569 Shell::Exit(1); |
1563 } | 1570 } |
1564 | 1571 |
1565 Shell::ExecuteString(str, String::New(filename), false, false); | 1572 Shell::ExecuteString(isolate_, str, String::New(filename), false, false); |
1566 } | 1573 } |
1567 | 1574 |
1568 thread_context.Dispose(thread_context->GetIsolate()); | 1575 thread_context.Dispose(thread_context->GetIsolate()); |
1569 ptr = next_line; | 1576 ptr = next_line; |
1570 } | 1577 } |
1571 } | 1578 } |
1572 #endif // V8_SHARED | 1579 #endif // V8_SHARED |
1573 | 1580 |
1574 | 1581 |
1575 SourceGroup::~SourceGroup() { | 1582 SourceGroup::~SourceGroup() { |
1576 #ifndef V8_SHARED | 1583 #ifndef V8_SHARED |
1577 delete next_semaphore_; | 1584 delete next_semaphore_; |
1578 next_semaphore_ = NULL; | 1585 next_semaphore_ = NULL; |
1579 delete done_semaphore_; | 1586 delete done_semaphore_; |
1580 done_semaphore_ = NULL; | 1587 done_semaphore_ = NULL; |
1581 delete thread_; | 1588 delete thread_; |
1582 thread_ = NULL; | 1589 thread_ = NULL; |
1583 #endif // V8_SHARED | 1590 #endif // V8_SHARED |
1584 } | 1591 } |
1585 | 1592 |
1586 | 1593 |
1587 void SourceGroup::Execute(Isolate* isolate) { | 1594 void SourceGroup::Execute(Isolate* isolate) { |
1588 for (int i = begin_offset_; i < end_offset_; ++i) { | 1595 for (int i = begin_offset_; i < end_offset_; ++i) { |
1589 const char* arg = argv_[i]; | 1596 const char* arg = argv_[i]; |
1590 if (strcmp(arg, "-e") == 0 && i + 1 < end_offset_) { | 1597 if (strcmp(arg, "-e") == 0 && i + 1 < end_offset_) { |
1591 // Execute argument given to -e option directly. | 1598 // Execute argument given to -e option directly. |
1592 HandleScope handle_scope; | 1599 HandleScope handle_scope(isolate); |
1593 Handle<String> file_name = String::New("unnamed"); | 1600 Handle<String> file_name = String::New("unnamed"); |
1594 Handle<String> source = String::New(argv_[i + 1]); | 1601 Handle<String> source = String::New(argv_[i + 1]); |
1595 if (!Shell::ExecuteString(source, file_name, false, true)) { | 1602 if (!Shell::ExecuteString(isolate, source, file_name, false, true)) { |
1596 Shell::Exit(1); | 1603 Shell::Exit(1); |
1597 } | 1604 } |
1598 ++i; | 1605 ++i; |
1599 } else if (arg[0] == '-') { | 1606 } else if (arg[0] == '-') { |
1600 // Ignore other options. They have been parsed already. | 1607 // Ignore other options. They have been parsed already. |
1601 } else { | 1608 } else { |
1602 // Use all other arguments as names of files to load and run. | 1609 // Use all other arguments as names of files to load and run. |
1603 HandleScope handle_scope; | 1610 HandleScope handle_scope(isolate); |
1604 Handle<String> file_name = String::New(arg); | 1611 Handle<String> file_name = String::New(arg); |
1605 Handle<String> source = ReadFile(isolate, arg); | 1612 Handle<String> source = ReadFile(isolate, arg); |
1606 if (source.IsEmpty()) { | 1613 if (source.IsEmpty()) { |
1607 printf("Error reading '%s'\n", arg); | 1614 printf("Error reading '%s'\n", arg); |
1608 Shell::Exit(1); | 1615 Shell::Exit(1); |
1609 } | 1616 } |
1610 if (!Shell::ExecuteString(source, file_name, false, true)) { | 1617 if (!Shell::ExecuteString(isolate, source, file_name, false, true)) { |
1611 Shell::Exit(1); | 1618 Shell::Exit(1); |
1612 } | 1619 } |
1613 } | 1620 } |
1614 } | 1621 } |
1615 } | 1622 } |
1616 | 1623 |
1617 | 1624 |
1618 Handle<String> SourceGroup::ReadFile(Isolate* isolate, const char* name) { | 1625 Handle<String> SourceGroup::ReadFile(Isolate* isolate, const char* name) { |
1619 int size; | 1626 int size; |
1620 char* chars = ReadChars(isolate, name, &size); | 1627 char* chars = ReadChars(isolate, name, &size); |
(...skipping 14 matching lines...) Expand all Loading... |
1635 } | 1642 } |
1636 | 1643 |
1637 | 1644 |
1638 void SourceGroup::ExecuteInThread() { | 1645 void SourceGroup::ExecuteInThread() { |
1639 Isolate* isolate = Isolate::New(); | 1646 Isolate* isolate = Isolate::New(); |
1640 do { | 1647 do { |
1641 if (next_semaphore_ != NULL) next_semaphore_->Wait(); | 1648 if (next_semaphore_ != NULL) next_semaphore_->Wait(); |
1642 { | 1649 { |
1643 Isolate::Scope iscope(isolate); | 1650 Isolate::Scope iscope(isolate); |
1644 Locker lock(isolate); | 1651 Locker lock(isolate); |
1645 HandleScope scope; | 1652 HandleScope scope(isolate); |
1646 Symbols symbols(isolate); | 1653 Symbols symbols(isolate); |
1647 Persistent<Context> context = Shell::CreateEvaluationContext(isolate); | 1654 Persistent<Context> context = Shell::CreateEvaluationContext(isolate); |
1648 { | 1655 { |
1649 Context::Scope cscope(context); | 1656 Context::Scope cscope(context); |
1650 Execute(isolate); | 1657 Execute(isolate); |
1651 } | 1658 } |
1652 context.Dispose(isolate); | 1659 context.Dispose(isolate); |
1653 if (Shell::options.send_idle_notification) { | 1660 if (Shell::options.send_idle_notification) { |
1654 const int kLongIdlePauseInMs = 1000; | 1661 const int kLongIdlePauseInMs = 1000; |
1655 V8::ContextDisposedNotification(); | 1662 V8::ContextDisposedNotification(); |
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1833 thread->Start(); | 1840 thread->Start(); |
1834 threads.Add(thread); | 1841 threads.Add(thread); |
1835 } | 1842 } |
1836 } | 1843 } |
1837 for (int i = 1; i < options.num_isolates; ++i) { | 1844 for (int i = 1; i < options.num_isolates; ++i) { |
1838 options.isolate_sources[i].StartExecuteInThread(); | 1845 options.isolate_sources[i].StartExecuteInThread(); |
1839 } | 1846 } |
1840 #endif // V8_SHARED | 1847 #endif // V8_SHARED |
1841 { // NOLINT | 1848 { // NOLINT |
1842 Locker lock(isolate); | 1849 Locker lock(isolate); |
1843 HandleScope scope; | 1850 HandleScope scope(isolate); |
1844 Persistent<Context> context = CreateEvaluationContext(isolate); | 1851 Persistent<Context> context = CreateEvaluationContext(isolate); |
1845 if (options.last_run) { | 1852 if (options.last_run) { |
1846 // Keep using the same context in the interactive shell. | 1853 // Keep using the same context in the interactive shell. |
1847 evaluation_context_ = context; | 1854 evaluation_context_ = context; |
1848 #if !defined(V8_SHARED) && defined(ENABLE_DEBUGGER_SUPPORT) | 1855 #if !defined(V8_SHARED) && defined(ENABLE_DEBUGGER_SUPPORT) |
1849 // If the interactive debugger is enabled make sure to activate | 1856 // If the interactive debugger is enabled make sure to activate |
1850 // it before running the files passed on the command line. | 1857 // it before running the files passed on the command line. |
1851 if (i::FLAG_debugger) { | 1858 if (i::FLAG_debugger) { |
1852 InstallUtilityScript(isolate); | 1859 InstallUtilityScript(isolate); |
1853 } | 1860 } |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1929 #endif | 1936 #endif |
1930 } else { | 1937 } else { |
1931 result = RunMain(isolate, argc, argv); | 1938 result = RunMain(isolate, argc, argv); |
1932 } | 1939 } |
1933 | 1940 |
1934 | 1941 |
1935 #if !defined(V8_SHARED) && defined(ENABLE_DEBUGGER_SUPPORT) | 1942 #if !defined(V8_SHARED) && defined(ENABLE_DEBUGGER_SUPPORT) |
1936 // Run remote debugger if requested, but never on --test | 1943 // Run remote debugger if requested, but never on --test |
1937 if (i::FLAG_remote_debugger && !options.test_shell) { | 1944 if (i::FLAG_remote_debugger && !options.test_shell) { |
1938 InstallUtilityScript(isolate); | 1945 InstallUtilityScript(isolate); |
1939 RunRemoteDebugger(i::FLAG_debugger_port); | 1946 RunRemoteDebugger(isolate, i::FLAG_debugger_port); |
1940 return 0; | 1947 return 0; |
1941 } | 1948 } |
1942 #endif // !V8_SHARED && ENABLE_DEBUGGER_SUPPORT | 1949 #endif // !V8_SHARED && ENABLE_DEBUGGER_SUPPORT |
1943 | 1950 |
1944 // Run interactive shell if explicitly requested or if no script has been | 1951 // Run interactive shell if explicitly requested or if no script has been |
1945 // executed, but never on --test | 1952 // executed, but never on --test |
1946 | 1953 |
1947 if (( options.interactive_shell || !options.script_executed ) | 1954 if (( options.interactive_shell || !options.script_executed ) |
1948 && !options.test_shell ) { | 1955 && !options.test_shell ) { |
1949 #if !defined(V8_SHARED) && defined(ENABLE_DEBUGGER_SUPPORT) | 1956 #if !defined(V8_SHARED) && defined(ENABLE_DEBUGGER_SUPPORT) |
(...skipping 12 matching lines...) Expand all Loading... |
1962 } | 1969 } |
1963 | 1970 |
1964 } // namespace v8 | 1971 } // namespace v8 |
1965 | 1972 |
1966 | 1973 |
1967 #ifndef GOOGLE3 | 1974 #ifndef GOOGLE3 |
1968 int main(int argc, char* argv[]) { | 1975 int main(int argc, char* argv[]) { |
1969 return v8::Shell::Main(argc, argv); | 1976 return v8::Shell::Main(argc, argv); |
1970 } | 1977 } |
1971 #endif | 1978 #endif |
OLD | NEW |