OLD | NEW |
1 // Copyright 2016 the V8 project authors. All rights reserved. | 1 // Copyright 2016 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 #if !defined(_WIN32) && !defined(_WIN64) | 5 #if !defined(_WIN32) && !defined(_WIN64) |
6 #include <unistd.h> // NOLINT | 6 #include <unistd.h> // NOLINT |
7 #endif // !defined(_WIN32) && !defined(_WIN64) | 7 #endif // !defined(_WIN32) && !defined(_WIN64) |
8 | 8 |
9 #include <locale.h> | 9 #include <locale.h> |
10 | 10 |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
48 | 48 |
49 class UtilsExtension : public v8::Extension { | 49 class UtilsExtension : public v8::Extension { |
50 public: | 50 public: |
51 UtilsExtension() | 51 UtilsExtension() |
52 : v8::Extension("v8_inspector/utils", | 52 : v8::Extension("v8_inspector/utils", |
53 "native function print();" | 53 "native function print();" |
54 "native function quit();" | 54 "native function quit();" |
55 "native function setlocale();" | 55 "native function setlocale();" |
56 "native function load();" | 56 "native function load();" |
57 "native function compileAndRunWithOrigin();" | 57 "native function compileAndRunWithOrigin();" |
58 "native function setCurrentTimeMSForTest();") {} | 58 "native function setCurrentTimeMSForTest();" |
| 59 "native function schedulePauseOnNextStatement();" |
| 60 "native function cancelPauseOnNextStatement();") {} |
59 virtual v8::Local<v8::FunctionTemplate> GetNativeFunctionTemplate( | 61 virtual v8::Local<v8::FunctionTemplate> GetNativeFunctionTemplate( |
60 v8::Isolate* isolate, v8::Local<v8::String> name) { | 62 v8::Isolate* isolate, v8::Local<v8::String> name) { |
61 v8::Local<v8::Context> context = isolate->GetCurrentContext(); | 63 v8::Local<v8::Context> context = isolate->GetCurrentContext(); |
62 if (name->Equals(context, v8::String::NewFromUtf8( | 64 if (name->Equals(context, v8::String::NewFromUtf8( |
63 isolate, "print", v8::NewStringType::kNormal) | 65 isolate, "print", v8::NewStringType::kNormal) |
64 .ToLocalChecked()) | 66 .ToLocalChecked()) |
65 .FromJust()) { | 67 .FromJust()) { |
66 return v8::FunctionTemplate::New(isolate, UtilsExtension::Print); | 68 return v8::FunctionTemplate::New(isolate, UtilsExtension::Print); |
67 } else if (name->Equals(context, | 69 } else if (name->Equals(context, |
68 v8::String::NewFromUtf8(isolate, "quit", | 70 v8::String::NewFromUtf8(isolate, "quit", |
(...skipping 20 matching lines...) Expand all Loading... |
89 .FromJust()) { | 91 .FromJust()) { |
90 return v8::FunctionTemplate::New(isolate, | 92 return v8::FunctionTemplate::New(isolate, |
91 UtilsExtension::CompileAndRunWithOrigin); | 93 UtilsExtension::CompileAndRunWithOrigin); |
92 } else if (name->Equals(context, v8::String::NewFromUtf8( | 94 } else if (name->Equals(context, v8::String::NewFromUtf8( |
93 isolate, "setCurrentTimeMSForTest", | 95 isolate, "setCurrentTimeMSForTest", |
94 v8::NewStringType::kNormal) | 96 v8::NewStringType::kNormal) |
95 .ToLocalChecked()) | 97 .ToLocalChecked()) |
96 .FromJust()) { | 98 .FromJust()) { |
97 return v8::FunctionTemplate::New(isolate, | 99 return v8::FunctionTemplate::New(isolate, |
98 UtilsExtension::SetCurrentTimeMSForTest); | 100 UtilsExtension::SetCurrentTimeMSForTest); |
| 101 } else if (name->Equals(context, |
| 102 v8::String::NewFromUtf8( |
| 103 isolate, "schedulePauseOnNextStatement", |
| 104 v8::NewStringType::kNormal) |
| 105 .ToLocalChecked()) |
| 106 .FromJust()) { |
| 107 return v8::FunctionTemplate::New( |
| 108 isolate, UtilsExtension::SchedulePauseOnNextStatement); |
| 109 } else if (name->Equals(context, v8::String::NewFromUtf8( |
| 110 isolate, "cancelPauseOnNextStatement", |
| 111 v8::NewStringType::kNormal) |
| 112 .ToLocalChecked()) |
| 113 .FromJust()) { |
| 114 return v8::FunctionTemplate::New( |
| 115 isolate, UtilsExtension::CancelPauseOnNextStatement); |
99 } | 116 } |
100 return v8::Local<v8::FunctionTemplate>(); | 117 return v8::Local<v8::FunctionTemplate>(); |
101 } | 118 } |
102 | 119 |
103 static void set_backend_task_runner(TaskRunner* runner) { | 120 static void set_backend_task_runner(TaskRunner* runner) { |
104 backend_runner_ = runner; | 121 backend_runner_ = runner; |
105 } | 122 } |
106 | 123 |
107 static void set_inspector_client(InspectorClientImpl* client) { | 124 static void set_inspector_client(InspectorClientImpl* client) { |
108 inspector_client_ = client; | 125 inspector_client_ = client; |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
196 | 213 |
197 static void SetCurrentTimeMSForTest( | 214 static void SetCurrentTimeMSForTest( |
198 const v8::FunctionCallbackInfo<v8::Value>& args) { | 215 const v8::FunctionCallbackInfo<v8::Value>& args) { |
199 if (args.Length() != 1 || !args[0]->IsNumber()) { | 216 if (args.Length() != 1 || !args[0]->IsNumber()) { |
200 fprintf(stderr, "Internal error: setCurrentTimeMSForTest(time)."); | 217 fprintf(stderr, "Internal error: setCurrentTimeMSForTest(time)."); |
201 Exit(); | 218 Exit(); |
202 } | 219 } |
203 inspector_client_->setCurrentTimeMSForTest( | 220 inspector_client_->setCurrentTimeMSForTest( |
204 args[0].As<v8::Number>()->Value()); | 221 args[0].As<v8::Number>()->Value()); |
205 } | 222 } |
| 223 |
| 224 static void SchedulePauseOnNextStatement( |
| 225 const v8::FunctionCallbackInfo<v8::Value>& args) { |
| 226 if (args.Length() != 2 || !args[0]->IsString() || !args[1]->IsString()) { |
| 227 fprintf( |
| 228 stderr, |
| 229 "Internal error: schedulePauseOnNextStatement('reason', 'details')."); |
| 230 Exit(); |
| 231 } |
| 232 v8::internal::Vector<uint16_t> reason = ToVector(args[0].As<v8::String>()); |
| 233 v8_inspector::StringView reason_view(reason.start(), reason.length()); |
| 234 v8::internal::Vector<uint16_t> details = ToVector(args[1].As<v8::String>()); |
| 235 v8_inspector::StringView details_view(details.start(), details.length()); |
| 236 inspector_client_->session()->schedulePauseOnNextStatement(reason_view, |
| 237 details_view); |
| 238 } |
| 239 |
| 240 static void CancelPauseOnNextStatement( |
| 241 const v8::FunctionCallbackInfo<v8::Value>& args) { |
| 242 if (args.Length() != 0) { |
| 243 fprintf(stderr, "Internal error: cancelPauseOnNextStatement()."); |
| 244 Exit(); |
| 245 } |
| 246 inspector_client_->session()->cancelPauseOnNextStatement(); |
| 247 } |
206 }; | 248 }; |
207 | 249 |
208 TaskRunner* UtilsExtension::backend_runner_ = nullptr; | 250 TaskRunner* UtilsExtension::backend_runner_ = nullptr; |
209 InspectorClientImpl* UtilsExtension::inspector_client_ = nullptr; | 251 InspectorClientImpl* UtilsExtension::inspector_client_ = nullptr; |
210 | 252 |
211 class SetTimeoutTask : public AsyncTask { | 253 class SetTimeoutTask : public AsyncTask { |
212 public: | 254 public: |
213 SetTimeoutTask(v8::Isolate* isolate, v8::Local<v8::Function> function, | 255 SetTimeoutTask(v8::Isolate* isolate, v8::Local<v8::Function> function, |
214 const char* task_name, v8_inspector::V8Inspector* inspector) | 256 const char* task_name, v8_inspector::V8Inspector* inspector) |
215 : AsyncTask(task_name, inspector), function_(isolate, function) {} | 257 : AsyncTask(task_name, inspector), function_(isolate, function) {} |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
276 TaskRunner::FromContext(context)->Append(task.release()); | 318 TaskRunner::FromContext(context)->Append(task.release()); |
277 } | 319 } |
278 }; | 320 }; |
279 | 321 |
280 class InspectorExtension : public v8::Extension { | 322 class InspectorExtension : public v8::Extension { |
281 public: | 323 public: |
282 InspectorExtension() | 324 InspectorExtension() |
283 : v8::Extension("v8_inspector/inspector", | 325 : v8::Extension("v8_inspector/inspector", |
284 "native function attachInspector();" | 326 "native function attachInspector();" |
285 "native function detachInspector();" | 327 "native function detachInspector();" |
286 "native function setMaxAsyncTaskStacks();") {} | 328 "native function setMaxAsyncTaskStacks();" |
| 329 "native function breakProgram();") {} |
287 | 330 |
288 virtual v8::Local<v8::FunctionTemplate> GetNativeFunctionTemplate( | 331 virtual v8::Local<v8::FunctionTemplate> GetNativeFunctionTemplate( |
289 v8::Isolate* isolate, v8::Local<v8::String> name) { | 332 v8::Isolate* isolate, v8::Local<v8::String> name) { |
290 v8::Local<v8::Context> context = isolate->GetCurrentContext(); | 333 v8::Local<v8::Context> context = isolate->GetCurrentContext(); |
291 if (name->Equals(context, | 334 if (name->Equals(context, |
292 v8::String::NewFromUtf8(isolate, "attachInspector", | 335 v8::String::NewFromUtf8(isolate, "attachInspector", |
293 v8::NewStringType::kNormal) | 336 v8::NewStringType::kNormal) |
294 .ToLocalChecked()) | 337 .ToLocalChecked()) |
295 .FromJust()) { | 338 .FromJust()) { |
296 return v8::FunctionTemplate::New(isolate, InspectorExtension::Attach); | 339 return v8::FunctionTemplate::New(isolate, InspectorExtension::Attach); |
297 } else if (name->Equals(context, | 340 } else if (name->Equals(context, |
298 v8::String::NewFromUtf8(isolate, "detachInspector", | 341 v8::String::NewFromUtf8(isolate, "detachInspector", |
299 v8::NewStringType::kNormal) | 342 v8::NewStringType::kNormal) |
300 .ToLocalChecked()) | 343 .ToLocalChecked()) |
301 .FromJust()) { | 344 .FromJust()) { |
302 return v8::FunctionTemplate::New(isolate, InspectorExtension::Detach); | 345 return v8::FunctionTemplate::New(isolate, InspectorExtension::Detach); |
303 } else if (name->Equals(context, v8::String::NewFromUtf8( | 346 } else if (name->Equals(context, v8::String::NewFromUtf8( |
304 isolate, "setMaxAsyncTaskStacks", | 347 isolate, "setMaxAsyncTaskStacks", |
305 v8::NewStringType::kNormal) | 348 v8::NewStringType::kNormal) |
306 .ToLocalChecked()) | 349 .ToLocalChecked()) |
307 .FromJust()) { | 350 .FromJust()) { |
308 return v8::FunctionTemplate::New( | 351 return v8::FunctionTemplate::New( |
309 isolate, InspectorExtension::SetMaxAsyncTaskStacks); | 352 isolate, InspectorExtension::SetMaxAsyncTaskStacks); |
| 353 } else if (name->Equals(context, |
| 354 v8::String::NewFromUtf8(isolate, "breakProgram", |
| 355 v8::NewStringType::kNormal) |
| 356 .ToLocalChecked()) |
| 357 .FromJust()) { |
| 358 return v8::FunctionTemplate::New(isolate, |
| 359 InspectorExtension::BreakProgram); |
310 } | 360 } |
311 return v8::Local<v8::FunctionTemplate>(); | 361 return v8::Local<v8::FunctionTemplate>(); |
312 } | 362 } |
313 | 363 |
314 private: | 364 private: |
315 static void Attach(const v8::FunctionCallbackInfo<v8::Value>& args) { | 365 static void Attach(const v8::FunctionCallbackInfo<v8::Value>& args) { |
316 v8::Isolate* isolate = args.GetIsolate(); | 366 v8::Isolate* isolate = args.GetIsolate(); |
317 v8::Local<v8::Context> context = isolate->GetCurrentContext(); | 367 v8::Local<v8::Context> context = isolate->GetCurrentContext(); |
318 v8_inspector::V8Inspector* inspector = | 368 v8_inspector::V8Inspector* inspector = |
319 InspectorClientImpl::InspectorFromContext(context); | 369 InspectorClientImpl::InspectorFromContext(context); |
(...skipping 23 matching lines...) Expand all Loading... |
343 fprintf(stderr, "Internal error: setMaxAsyncTaskStacks(max)."); | 393 fprintf(stderr, "Internal error: setMaxAsyncTaskStacks(max)."); |
344 Exit(); | 394 Exit(); |
345 } | 395 } |
346 v8_inspector::V8Inspector* inspector = | 396 v8_inspector::V8Inspector* inspector = |
347 InspectorClientImpl::InspectorFromContext( | 397 InspectorClientImpl::InspectorFromContext( |
348 args.GetIsolate()->GetCurrentContext()); | 398 args.GetIsolate()->GetCurrentContext()); |
349 CHECK(inspector); | 399 CHECK(inspector); |
350 v8_inspector::SetMaxAsyncTaskStacksForTest( | 400 v8_inspector::SetMaxAsyncTaskStacksForTest( |
351 inspector, args[0].As<v8::Int32>()->Value()); | 401 inspector, args[0].As<v8::Int32>()->Value()); |
352 } | 402 } |
| 403 |
| 404 static void BreakProgram(const v8::FunctionCallbackInfo<v8::Value>& args) { |
| 405 if (args.Length() != 2 || !args[0]->IsString() || !args[1]->IsString()) { |
| 406 fprintf(stderr, "Internal error: breakProgram('reason', 'details')."); |
| 407 Exit(); |
| 408 } |
| 409 v8_inspector::V8InspectorSession* session = |
| 410 InspectorClientImpl::SessionFromContext( |
| 411 args.GetIsolate()->GetCurrentContext()); |
| 412 CHECK(session); |
| 413 |
| 414 v8::internal::Vector<uint16_t> reason = ToVector(args[0].As<v8::String>()); |
| 415 v8_inspector::StringView reason_view(reason.start(), reason.length()); |
| 416 v8::internal::Vector<uint16_t> details = ToVector(args[1].As<v8::String>()); |
| 417 v8_inspector::StringView details_view(details.start(), details.length()); |
| 418 session->breakProgram(reason_view, details_view); |
| 419 } |
353 }; | 420 }; |
354 | 421 |
355 v8::Local<v8::String> ToString(v8::Isolate* isolate, | 422 v8::Local<v8::String> ToString(v8::Isolate* isolate, |
356 const v8_inspector::StringView& string) { | 423 const v8_inspector::StringView& string) { |
357 if (string.is8Bit()) | 424 if (string.is8Bit()) |
358 return v8::String::NewFromOneByte(isolate, string.characters8(), | 425 return v8::String::NewFromOneByte(isolate, string.characters8(), |
359 v8::NewStringType::kNormal, | 426 v8::NewStringType::kNormal, |
360 static_cast<int>(string.length())) | 427 static_cast<int>(string.length())) |
361 .ToLocalChecked(); | 428 .ToLocalChecked(); |
362 else | 429 else |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
455 argv[i]); | 522 argv[i]); |
456 Exit(); | 523 Exit(); |
457 } | 524 } |
458 frontend_runner.Append(new ExecuteStringTask(chars)); | 525 frontend_runner.Append(new ExecuteStringTask(chars)); |
459 } | 526 } |
460 | 527 |
461 frontend_runner.Join(); | 528 frontend_runner.Join(); |
462 backend_runner.Join(); | 529 backend_runner.Join(); |
463 return 0; | 530 return 0; |
464 } | 531 } |
OLD | NEW |