OLD | NEW |
1 // Copyright 2006-2008 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2008 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 379 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
390 // Code object for debug break return entry code. | 390 // Code object for debug break return entry code. |
391 static Code* debug_break_return_entry_; | 391 static Code* debug_break_return_entry_; |
392 | 392 |
393 // Code to call for handling debug break on return. | 393 // Code to call for handling debug break on return. |
394 static Code* debug_break_return_; | 394 static Code* debug_break_return_; |
395 | 395 |
396 DISALLOW_COPY_AND_ASSIGN(Debug); | 396 DISALLOW_COPY_AND_ASSIGN(Debug); |
397 }; | 397 }; |
398 | 398 |
399 | 399 |
| 400 // Message send by user to v8 debugger or debugger output message. |
| 401 // In addition to command text it may contain a pointer to some user data |
| 402 // which are expected to be passed along with the command reponse to message |
| 403 // handler. |
| 404 class Message { |
| 405 public: |
| 406 static Message NewCommand(const Vector<uint16_t>& command, |
| 407 v8::Debug::ClientData* data); |
| 408 static Message NewHostDispatch(v8::Debug::ClientData* dispatch); |
| 409 static Message NewOutput(v8::Handle<v8::String> output, |
| 410 v8::Debug::ClientData* data); |
| 411 static Message NewEmptyMessage(); |
| 412 Message(); |
| 413 ~Message(); |
| 414 |
| 415 // Deletes user data and disposes of the text. |
| 416 void Dispose(); |
| 417 bool IsHostDispatch() const; |
| 418 Vector<uint16_t> text() const { return text_; } |
| 419 v8::Debug::ClientData* client_data() const { return client_data_; } |
| 420 private: |
| 421 Message(const Vector<uint16_t>& text, |
| 422 v8::Debug::ClientData* data, |
| 423 bool is_host_dispatch); |
| 424 |
| 425 Vector<uint16_t> text_; |
| 426 v8::Debug::ClientData* client_data_; |
| 427 bool is_host_dispatch_; |
| 428 }; |
| 429 |
400 // A Queue of Vector<uint16_t> objects. A thread-safe version is | 430 // A Queue of Vector<uint16_t> objects. A thread-safe version is |
401 // LockingMessageQueue, based on this class. | 431 // LockingMessageQueue, based on this class. |
402 class MessageQueue BASE_EMBEDDED { | 432 class MessageQueue BASE_EMBEDDED { |
403 public: | 433 public: |
404 explicit MessageQueue(int size); | 434 explicit MessageQueue(int size); |
405 ~MessageQueue(); | 435 ~MessageQueue(); |
406 bool IsEmpty() const { return start_ == end_; } | 436 bool IsEmpty() const { return start_ == end_; } |
407 Vector<uint16_t> Get(); | 437 Message Get(); |
408 void Put(const Vector<uint16_t>& message); | 438 void Put(const Message& message); |
409 void Clear() { start_ = end_ = 0; } // Queue is empty after Clear(). | 439 void Clear() { start_ = end_ = 0; } // Queue is empty after Clear(). |
410 private: | 440 private: |
411 // Doubles the size of the message queue, and copies the messages. | 441 // Doubles the size of the message queue, and copies the messages. |
412 void Expand(); | 442 void Expand(); |
413 | 443 |
414 Vector<uint16_t>* messages_; | 444 Message* messages_; |
415 int start_; | 445 int start_; |
416 int end_; | 446 int end_; |
417 int size_; // The size of the queue buffer. Queue can hold size-1 messages. | 447 int size_; // The size of the queue buffer. Queue can hold size-1 messages. |
418 }; | 448 }; |
419 | 449 |
420 | 450 |
421 // LockingMessageQueue is a thread-safe circular buffer of Vector<uint16_t> | 451 // LockingMessageQueue is a thread-safe circular buffer of Vector<uint16_t> |
422 // messages. The message data is not managed by LockingMessageQueue. | 452 // messages. The message data is not managed by LockingMessageQueue. |
423 // Pointers to the data are passed in and out. Implemented by adding a | 453 // Pointers to the data are passed in and out. Implemented by adding a |
424 // Mutex to MessageQueue. Includes logging of all puts and gets. | 454 // Mutex to MessageQueue. Includes logging of all puts and gets. |
425 class LockingMessageQueue BASE_EMBEDDED { | 455 class LockingMessageQueue BASE_EMBEDDED { |
426 public: | 456 public: |
427 explicit LockingMessageQueue(int size); | 457 explicit LockingMessageQueue(int size); |
428 ~LockingMessageQueue(); | 458 ~LockingMessageQueue(); |
429 bool IsEmpty() const; | 459 bool IsEmpty() const; |
430 Vector<uint16_t> Get(); | 460 Message Get(); |
431 void Put(const Vector<uint16_t>& message); | 461 void Put(const Message& message); |
432 void Clear(); | 462 void Clear(); |
433 private: | 463 private: |
434 MessageQueue queue_; | 464 MessageQueue queue_; |
435 Mutex* lock_; | 465 Mutex* lock_; |
436 DISALLOW_COPY_AND_ASSIGN(LockingMessageQueue); | 466 DISALLOW_COPY_AND_ASSIGN(LockingMessageQueue); |
437 }; | 467 }; |
438 | 468 |
439 | 469 |
440 class DebugMessageThread; | 470 class DebugMessageThread; |
441 | 471 |
(...skipping 24 matching lines...) Expand all Loading... |
466 Handle<JSFunction> fun); | 496 Handle<JSFunction> fun); |
467 static void OnNewFunction(Handle<JSFunction> fun); | 497 static void OnNewFunction(Handle<JSFunction> fun); |
468 static void ProcessDebugEvent(v8::DebugEvent event, | 498 static void ProcessDebugEvent(v8::DebugEvent event, |
469 Handle<Object> event_data, | 499 Handle<Object> event_data, |
470 bool auto_continue); | 500 bool auto_continue); |
471 static void NotifyMessageHandler(v8::DebugEvent event, | 501 static void NotifyMessageHandler(v8::DebugEvent event, |
472 Handle<Object> exec_state, | 502 Handle<Object> exec_state, |
473 Handle<Object> event_data, | 503 Handle<Object> event_data, |
474 bool auto_continue); | 504 bool auto_continue); |
475 static void SetEventListener(Handle<Object> callback, Handle<Object> data); | 505 static void SetEventListener(Handle<Object> callback, Handle<Object> data); |
476 static void SetMessageHandler(v8::DebugMessageHandler handler, void* data, | 506 static void SetMessageHandler(v8::Debug::MessageHandler handler, |
477 bool message_handler_thread); | 507 bool message_handler_thread); |
478 static void TearDown(); | 508 static void TearDown(); |
479 static void SetHostDispatchHandler(v8::DebugHostDispatchHandler handler, | 509 static void SetHostDispatchHandler(v8::Debug::HostDispatchHandler handler); |
480 void* data); | |
481 | 510 |
482 // Invoke the message handler function. | 511 // Invoke the message handler function. |
483 static void InvokeMessageHandler(Vector< uint16_t> message); | 512 static void InvokeMessageHandler(Message message); |
484 | 513 |
485 // Send a message to the message handler eiher through the message thread or | 514 // Send a message to the message handler eiher through the message thread or |
486 // directly. | 515 // directly. |
487 static void SendMessage(Vector<uint16_t> message); | 516 static void SendMessage(Message message); |
488 | 517 |
489 // Send the JSON message for a debug event. | 518 // Send the JSON message for a debug event. |
490 static bool SendEventMessage(Handle<Object> event_data); | 519 static bool SendEventMessage(Handle<Object> event_data); |
491 | 520 |
492 // Add a debugger command to the command queue. | 521 // Add a debugger command to the command queue. |
493 static void ProcessCommand(Vector<const uint16_t> command); | 522 static void ProcessCommand(Vector<const uint16_t> command, |
| 523 v8::Debug::ClientData* client_data = NULL); |
494 | 524 |
495 // Check whether there are commands in the command queue. | 525 // Check whether there are commands in the command queue. |
496 static bool HasCommands(); | 526 static bool HasCommands(); |
497 | 527 |
498 static void ProcessHostDispatch(void* dispatch); | 528 static void ProcessHostDispatch(v8::Debug::ClientData* dispatch); |
499 static Handle<Object> Call(Handle<JSFunction> fun, | 529 static Handle<Object> Call(Handle<JSFunction> fun, |
500 Handle<Object> data, | 530 Handle<Object> data, |
501 bool* pending_exception); | 531 bool* pending_exception); |
502 | 532 |
503 // Start the debugger agent listening on the provided port. | 533 // Start the debugger agent listening on the provided port. |
504 static bool StartAgent(const char* name, int port); | 534 static bool StartAgent(const char* name, int port); |
505 | 535 |
506 // Stop the debugger agent. | 536 // Stop the debugger agent. |
507 static void StopAgent(); | 537 static void StopAgent(); |
508 | 538 |
(...skipping 23 matching lines...) Expand all Loading... |
532 private: | 562 private: |
533 static bool IsDebuggerActive(); | 563 static bool IsDebuggerActive(); |
534 | 564 |
535 static Mutex* debugger_access_; // Mutex guarding debugger variables. | 565 static Mutex* debugger_access_; // Mutex guarding debugger variables. |
536 static Handle<Object> event_listener_; // Global handle to listener. | 566 static Handle<Object> event_listener_; // Global handle to listener. |
537 static Handle<Object> event_listener_data_; | 567 static Handle<Object> event_listener_data_; |
538 static bool compiling_natives_; // Are we compiling natives? | 568 static bool compiling_natives_; // Are we compiling natives? |
539 static bool is_loading_debugger_; // Are we loading the debugger? | 569 static bool is_loading_debugger_; // Are we loading the debugger? |
540 static bool never_unload_debugger_; // Can we unload the debugger? | 570 static bool never_unload_debugger_; // Can we unload the debugger? |
541 static DebugMessageThread* message_thread_; | 571 static DebugMessageThread* message_thread_; |
542 static v8::DebugMessageHandler message_handler_; | 572 static v8::Debug::MessageHandler message_handler_; |
543 static bool message_handler_cleared_; // Was message handler cleared? | 573 static bool message_handler_cleared_; // Was message handler cleared? |
544 static void* message_handler_data_; | 574 static v8::Debug::HostDispatchHandler host_dispatch_handler_; |
545 static v8::DebugHostDispatchHandler host_dispatch_handler_; | |
546 static void* host_dispatch_handler_data_; | |
547 | 575 |
548 static DebuggerAgent* agent_; | 576 static DebuggerAgent* agent_; |
549 | 577 |
550 static const int kQueueInitialSize = 4; | 578 static const int kQueueInitialSize = 4; |
551 static LockingMessageQueue command_queue_; | 579 static LockingMessageQueue command_queue_; |
552 static LockingMessageQueue message_queue_; | 580 static LockingMessageQueue message_queue_; |
553 static Semaphore* command_received_; // Signaled for each command received. | 581 static Semaphore* command_received_; // Signaled for each command received. |
554 static Semaphore* message_received_; // Signalled for each message send. | 582 static Semaphore* message_received_; // Signalled for each message send. |
555 | 583 |
556 friend class EnterDebugger; | 584 friend class EnterDebugger; |
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
716 Debug::AddressId id_; | 744 Debug::AddressId id_; |
717 int reg_; | 745 int reg_; |
718 }; | 746 }; |
719 | 747 |
720 | 748 |
721 } } // namespace v8::internal | 749 } } // namespace v8::internal |
722 | 750 |
723 #endif // ENABLE_DEBUGGER_SUPPORT | 751 #endif // ENABLE_DEBUGGER_SUPPORT |
724 | 752 |
725 #endif // V8_V8_DEBUG_H_ | 753 #endif // V8_V8_DEBUG_H_ |
OLD | NEW |