src/Pure/Tools/debugger.scala
author wenzelm
Sat, 15 Aug 2015 17:38:20 +0200
changeset 60932 13ee73f57c85
parent 60912 3852e87e9b88
child 61007 eaceb601a8a2
permissions -rw-r--r--
allow to break running threads at next possible breakpoint (simplified version of former option, see f3039309702e);
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
60749
f727b99faaf7 skeleton for interactive debugger;
wenzelm
parents:
diff changeset
     1
/*  Title:      Pure/Tools/debugger.scala
f727b99faaf7 skeleton for interactive debugger;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
f727b99faaf7 skeleton for interactive debugger;
wenzelm
parents:
diff changeset
     3
f727b99faaf7 skeleton for interactive debugger;
wenzelm
parents:
diff changeset
     4
Interactive debugger for Isabelle/ML.
f727b99faaf7 skeleton for interactive debugger;
wenzelm
parents:
diff changeset
     5
*/
f727b99faaf7 skeleton for interactive debugger;
wenzelm
parents:
diff changeset
     6
f727b99faaf7 skeleton for interactive debugger;
wenzelm
parents:
diff changeset
     7
package isabelle
f727b99faaf7 skeleton for interactive debugger;
wenzelm
parents:
diff changeset
     8
f727b99faaf7 skeleton for interactive debugger;
wenzelm
parents:
diff changeset
     9
f727b99faaf7 skeleton for interactive debugger;
wenzelm
parents:
diff changeset
    10
object Debugger
f727b99faaf7 skeleton for interactive debugger;
wenzelm
parents:
diff changeset
    11
{
60834
781f1168d31e maintain debugger output messages;
wenzelm
parents: 60830
diff changeset
    12
  /* global state */
781f1168d31e maintain debugger output messages;
wenzelm
parents: 60830
diff changeset
    13
60842
5510c8444bc4 protocol support for thread debugger state;
wenzelm
parents: 60835
diff changeset
    14
  sealed case class Debug_State(
5510c8444bc4 protocol support for thread debugger state;
wenzelm
parents: 60835
diff changeset
    15
    pos: Position.T,
5510c8444bc4 protocol support for thread debugger state;
wenzelm
parents: 60835
diff changeset
    16
    function: String)
5510c8444bc4 protocol support for thread debugger state;
wenzelm
parents: 60835
diff changeset
    17
60835
6512bb0b1ff4 clarified management of (single) session;
wenzelm
parents: 60834
diff changeset
    18
  sealed case class State(
60932
13ee73f57c85 allow to break running threads at next possible breakpoint (simplified version of former option, see f3039309702e);
wenzelm
parents: 60912
diff changeset
    19
    session: Session = new Session(Resources.empty),  // implicit session
13ee73f57c85 allow to break running threads at next possible breakpoint (simplified version of former option, see f3039309702e);
wenzelm
parents: 60912
diff changeset
    20
    active: Int = 0,  // active views
13ee73f57c85 allow to break running threads at next possible breakpoint (simplified version of former option, see f3039309702e);
wenzelm
parents: 60912
diff changeset
    21
    break: Boolean = false,  // break at next possible breakpoint
13ee73f57c85 allow to break running threads at next possible breakpoint (simplified version of former option, see f3039309702e);
wenzelm
parents: 60912
diff changeset
    22
    active_breakpoints: Set[Long] = Set.empty,  // explicit breakpoint state
60875
ee23c1d21ac3 follow debugger focus;
wenzelm
parents: 60869
diff changeset
    23
    focus: Option[Position.T] = None,  // position of active GUI component
60842
5510c8444bc4 protocol support for thread debugger state;
wenzelm
parents: 60835
diff changeset
    24
    threads: Map[String, List[Debug_State]] = Map.empty,  // thread name ~> stack of debug states
60834
781f1168d31e maintain debugger output messages;
wenzelm
parents: 60830
diff changeset
    25
    output: Map[String, Command.Results] = Map.empty)  // thread name ~> output messages
781f1168d31e maintain debugger output messages;
wenzelm
parents: 60830
diff changeset
    26
  {
60842
5510c8444bc4 protocol support for thread debugger state;
wenzelm
parents: 60835
diff changeset
    27
    def set_session(new_session: Session): State =
5510c8444bc4 protocol support for thread debugger state;
wenzelm
parents: 60835
diff changeset
    28
      copy(session = new_session)
5510c8444bc4 protocol support for thread debugger state;
wenzelm
parents: 60835
diff changeset
    29
60932
13ee73f57c85 allow to break running threads at next possible breakpoint (simplified version of former option, see f3039309702e);
wenzelm
parents: 60912
diff changeset
    30
    def set_break(b: Boolean): State = copy(break = b)
13ee73f57c85 allow to break running threads at next possible breakpoint (simplified version of former option, see f3039309702e);
wenzelm
parents: 60912
diff changeset
    31
60910
79abcf48c377 clarified init/exit vs. session phase;
wenzelm
parents: 60903
diff changeset
    32
    def is_active: Boolean = active > 0 && session.is_ready
60898
a3fcde62df10 misc tuning and clarification;
wenzelm
parents: 60897
diff changeset
    33
    def inc_active: State = copy(active = active + 1)
a3fcde62df10 misc tuning and clarification;
wenzelm
parents: 60897
diff changeset
    34
    def dec_active: State = copy(active = active - 1)
60876
52edced9cce5 rendering for debugger/breakpoint active state;
wenzelm
parents: 60875
diff changeset
    35
60880
fa958e24ff24 set breakpoint state on ML side, relying on stable situation within the PIDE editing queue;
wenzelm
parents: 60878
diff changeset
    36
    def toggle_breakpoint(breakpoint: Long): (Boolean, State) =
60876
52edced9cce5 rendering for debugger/breakpoint active state;
wenzelm
parents: 60875
diff changeset
    37
    {
52edced9cce5 rendering for debugger/breakpoint active state;
wenzelm
parents: 60875
diff changeset
    38
      val active_breakpoints1 =
60880
fa958e24ff24 set breakpoint state on ML side, relying on stable situation within the PIDE editing queue;
wenzelm
parents: 60878
diff changeset
    39
        if (active_breakpoints(breakpoint)) active_breakpoints - breakpoint
fa958e24ff24 set breakpoint state on ML side, relying on stable situation within the PIDE editing queue;
wenzelm
parents: 60878
diff changeset
    40
      else active_breakpoints + breakpoint
fa958e24ff24 set breakpoint state on ML side, relying on stable situation within the PIDE editing queue;
wenzelm
parents: 60878
diff changeset
    41
      (active_breakpoints1(breakpoint), copy(active_breakpoints = active_breakpoints1))
60876
52edced9cce5 rendering for debugger/breakpoint active state;
wenzelm
parents: 60875
diff changeset
    42
    }
52edced9cce5 rendering for debugger/breakpoint active state;
wenzelm
parents: 60875
diff changeset
    43
60875
ee23c1d21ac3 follow debugger focus;
wenzelm
parents: 60869
diff changeset
    44
    def set_focus(new_focus: Option[Position.T]): State =
ee23c1d21ac3 follow debugger focus;
wenzelm
parents: 60869
diff changeset
    45
      copy(focus = new_focus)
ee23c1d21ac3 follow debugger focus;
wenzelm
parents: 60869
diff changeset
    46
60842
5510c8444bc4 protocol support for thread debugger state;
wenzelm
parents: 60835
diff changeset
    47
    def get_thread(thread_name: String): List[Debug_State] =
5510c8444bc4 protocol support for thread debugger state;
wenzelm
parents: 60835
diff changeset
    48
      threads.getOrElse(thread_name, Nil)
5510c8444bc4 protocol support for thread debugger state;
wenzelm
parents: 60835
diff changeset
    49
5510c8444bc4 protocol support for thread debugger state;
wenzelm
parents: 60835
diff changeset
    50
    def update_thread(thread_name: String, debug_states: List[Debug_State]): State =
60903
bca464396b80 suppress threads without debug state;
wenzelm
parents: 60902
diff changeset
    51
      if (debug_states.isEmpty) copy(threads = threads - thread_name)
bca464396b80 suppress threads without debug state;
wenzelm
parents: 60902
diff changeset
    52
      else copy(threads = threads + (thread_name -> debug_states))
60842
5510c8444bc4 protocol support for thread debugger state;
wenzelm
parents: 60835
diff changeset
    53
5510c8444bc4 protocol support for thread debugger state;
wenzelm
parents: 60835
diff changeset
    54
    def get_output(thread_name: String): Command.Results =
5510c8444bc4 protocol support for thread debugger state;
wenzelm
parents: 60835
diff changeset
    55
      output.getOrElse(thread_name, Command.Results.empty)
5510c8444bc4 protocol support for thread debugger state;
wenzelm
parents: 60835
diff changeset
    56
5510c8444bc4 protocol support for thread debugger state;
wenzelm
parents: 60835
diff changeset
    57
    def add_output(thread_name: String, entry: Command.Results.Entry): State =
5510c8444bc4 protocol support for thread debugger state;
wenzelm
parents: 60835
diff changeset
    58
      copy(output = output + (thread_name -> (get_output(thread_name) + entry)))
5510c8444bc4 protocol support for thread debugger state;
wenzelm
parents: 60835
diff changeset
    59
5510c8444bc4 protocol support for thread debugger state;
wenzelm
parents: 60835
diff changeset
    60
    def clear_output(thread_name: String): State =
5510c8444bc4 protocol support for thread debugger state;
wenzelm
parents: 60835
diff changeset
    61
      copy(output = output - thread_name)
60834
781f1168d31e maintain debugger output messages;
wenzelm
parents: 60830
diff changeset
    62
  }
781f1168d31e maintain debugger output messages;
wenzelm
parents: 60830
diff changeset
    63
781f1168d31e maintain debugger output messages;
wenzelm
parents: 60830
diff changeset
    64
  private val global_state = Synchronized(State())
781f1168d31e maintain debugger output messages;
wenzelm
parents: 60830
diff changeset
    65
781f1168d31e maintain debugger output messages;
wenzelm
parents: 60830
diff changeset
    66
60902
9f185acfdcb8 clarified events;
wenzelm
parents: 60901
diff changeset
    67
  /* update events */
60749
f727b99faaf7 skeleton for interactive debugger;
wenzelm
parents:
diff changeset
    68
60900
11a0f333de6f tuned signature;
wenzelm
parents: 60899
diff changeset
    69
  case object Update
60749
f727b99faaf7 skeleton for interactive debugger;
wenzelm
parents:
diff changeset
    70
60902
9f185acfdcb8 clarified events;
wenzelm
parents: 60901
diff changeset
    71
  private val delay_update =
9f185acfdcb8 clarified events;
wenzelm
parents: 60901
diff changeset
    72
    Simple_Thread.delay_first(global_state.value.session.output_delay) {
9f185acfdcb8 clarified events;
wenzelm
parents: 60901
diff changeset
    73
      global_state.value.session.debugger_updates.post(Update)
9f185acfdcb8 clarified events;
wenzelm
parents: 60901
diff changeset
    74
    }
9f185acfdcb8 clarified events;
wenzelm
parents: 60901
diff changeset
    75
9f185acfdcb8 clarified events;
wenzelm
parents: 60901
diff changeset
    76
9f185acfdcb8 clarified events;
wenzelm
parents: 60901
diff changeset
    77
  /* protocol handler */
9f185acfdcb8 clarified events;
wenzelm
parents: 60901
diff changeset
    78
60749
f727b99faaf7 skeleton for interactive debugger;
wenzelm
parents:
diff changeset
    79
  class Handler extends Session.Protocol_Handler
f727b99faaf7 skeleton for interactive debugger;
wenzelm
parents:
diff changeset
    80
  {
60842
5510c8444bc4 protocol support for thread debugger state;
wenzelm
parents: 60835
diff changeset
    81
    private def debugger_state(prover: Prover, msg: Prover.Protocol_Output): Boolean =
5510c8444bc4 protocol support for thread debugger state;
wenzelm
parents: 60835
diff changeset
    82
    {
5510c8444bc4 protocol support for thread debugger state;
wenzelm
parents: 60835
diff changeset
    83
      msg.properties match {
5510c8444bc4 protocol support for thread debugger state;
wenzelm
parents: 60835
diff changeset
    84
        case Markup.Debugger_State(thread_name) =>
60863
21d70681ec05 proper Symbol.decode/encode;
wenzelm
parents: 60857
diff changeset
    85
          val msg_body =
21d70681ec05 proper Symbol.decode/encode;
wenzelm
parents: 60857
diff changeset
    86
            YXML.parse_body_failsafe(Symbol.decode(UTF8.decode_permissive(msg.bytes)))
60842
5510c8444bc4 protocol support for thread debugger state;
wenzelm
parents: 60835
diff changeset
    87
          val debug_states =
5510c8444bc4 protocol support for thread debugger state;
wenzelm
parents: 60835
diff changeset
    88
          {
5510c8444bc4 protocol support for thread debugger state;
wenzelm
parents: 60835
diff changeset
    89
            import XML.Decode._
5510c8444bc4 protocol support for thread debugger state;
wenzelm
parents: 60835
diff changeset
    90
            list(pair(properties, Symbol.decode_string))(msg_body).map({
5510c8444bc4 protocol support for thread debugger state;
wenzelm
parents: 60835
diff changeset
    91
              case (pos, function) => Debug_State(pos, function)
5510c8444bc4 protocol support for thread debugger state;
wenzelm
parents: 60835
diff changeset
    92
            })
5510c8444bc4 protocol support for thread debugger state;
wenzelm
parents: 60835
diff changeset
    93
          }
5510c8444bc4 protocol support for thread debugger state;
wenzelm
parents: 60835
diff changeset
    94
          global_state.change(_.update_thread(thread_name, debug_states))
60900
11a0f333de6f tuned signature;
wenzelm
parents: 60899
diff changeset
    95
          delay_update.invoke()
60842
5510c8444bc4 protocol support for thread debugger state;
wenzelm
parents: 60835
diff changeset
    96
          true
5510c8444bc4 protocol support for thread debugger state;
wenzelm
parents: 60835
diff changeset
    97
        case _ => false
5510c8444bc4 protocol support for thread debugger state;
wenzelm
parents: 60835
diff changeset
    98
      }
5510c8444bc4 protocol support for thread debugger state;
wenzelm
parents: 60835
diff changeset
    99
    }
5510c8444bc4 protocol support for thread debugger state;
wenzelm
parents: 60835
diff changeset
   100
60830
f56e189350b2 separate channel for debugger output;
wenzelm
parents: 60829
diff changeset
   101
    private def debugger_output(prover: Prover, msg: Prover.Protocol_Output): Boolean =
f56e189350b2 separate channel for debugger output;
wenzelm
parents: 60829
diff changeset
   102
    {
f56e189350b2 separate channel for debugger output;
wenzelm
parents: 60829
diff changeset
   103
      msg.properties match {
60835
6512bb0b1ff4 clarified management of (single) session;
wenzelm
parents: 60834
diff changeset
   104
        case Markup.Debugger_Output(thread_name) =>
60834
781f1168d31e maintain debugger output messages;
wenzelm
parents: 60830
diff changeset
   105
          val msg_body =
781f1168d31e maintain debugger output messages;
wenzelm
parents: 60830
diff changeset
   106
            prover.xml_cache.body(
60863
21d70681ec05 proper Symbol.decode/encode;
wenzelm
parents: 60857
diff changeset
   107
              YXML.parse_body_failsafe(Symbol.decode(UTF8.decode_permissive(msg.bytes))))
60834
781f1168d31e maintain debugger output messages;
wenzelm
parents: 60830
diff changeset
   108
          msg_body match {
781f1168d31e maintain debugger output messages;
wenzelm
parents: 60830
diff changeset
   109
            case List(XML.Elem(Markup(name, props @ Markup.Serial(i)), body)) =>
781f1168d31e maintain debugger output messages;
wenzelm
parents: 60830
diff changeset
   110
              val message = XML.Elem(Markup(Markup.message(name), props), body)
60835
6512bb0b1ff4 clarified management of (single) session;
wenzelm
parents: 60834
diff changeset
   111
              global_state.change(_.add_output(thread_name, i -> message))
60900
11a0f333de6f tuned signature;
wenzelm
parents: 60899
diff changeset
   112
              delay_update.invoke()
60834
781f1168d31e maintain debugger output messages;
wenzelm
parents: 60830
diff changeset
   113
              true
781f1168d31e maintain debugger output messages;
wenzelm
parents: 60830
diff changeset
   114
            case _ => false
781f1168d31e maintain debugger output messages;
wenzelm
parents: 60830
diff changeset
   115
          }
60830
f56e189350b2 separate channel for debugger output;
wenzelm
parents: 60829
diff changeset
   116
        case _ => false
f56e189350b2 separate channel for debugger output;
wenzelm
parents: 60829
diff changeset
   117
      }
f56e189350b2 separate channel for debugger output;
wenzelm
parents: 60829
diff changeset
   118
    }
f56e189350b2 separate channel for debugger output;
wenzelm
parents: 60829
diff changeset
   119
f56e189350b2 separate channel for debugger output;
wenzelm
parents: 60829
diff changeset
   120
    val functions =
60842
5510c8444bc4 protocol support for thread debugger state;
wenzelm
parents: 60835
diff changeset
   121
      Map(
5510c8444bc4 protocol support for thread debugger state;
wenzelm
parents: 60835
diff changeset
   122
        Markup.DEBUGGER_STATE -> debugger_state _,
5510c8444bc4 protocol support for thread debugger state;
wenzelm
parents: 60835
diff changeset
   123
        Markup.DEBUGGER_OUTPUT -> debugger_output _)
60749
f727b99faaf7 skeleton for interactive debugger;
wenzelm
parents:
diff changeset
   124
  }
60765
e43e71a75838 support for ML debugger;
wenzelm
parents: 60749
diff changeset
   125
e43e71a75838 support for ML debugger;
wenzelm
parents: 60749
diff changeset
   126
e43e71a75838 support for ML debugger;
wenzelm
parents: 60749
diff changeset
   127
  /* protocol commands */
e43e71a75838 support for ML debugger;
wenzelm
parents: 60749
diff changeset
   128
60898
a3fcde62df10 misc tuning and clarification;
wenzelm
parents: 60897
diff changeset
   129
  def is_active(): Boolean = global_state.value.is_active
60889
7f210887cc4e init/exit depending on active debugger panels;
wenzelm
parents: 60888
diff changeset
   130
60910
79abcf48c377 clarified init/exit vs. session phase;
wenzelm
parents: 60903
diff changeset
   131
  def init_session(session: Session)
79abcf48c377 clarified init/exit vs. session phase;
wenzelm
parents: 60903
diff changeset
   132
  {
79abcf48c377 clarified init/exit vs. session phase;
wenzelm
parents: 60903
diff changeset
   133
    global_state.change(state =>
79abcf48c377 clarified init/exit vs. session phase;
wenzelm
parents: 60903
diff changeset
   134
    {
79abcf48c377 clarified init/exit vs. session phase;
wenzelm
parents: 60903
diff changeset
   135
      val state1 = state.set_session(session)
79abcf48c377 clarified init/exit vs. session phase;
wenzelm
parents: 60903
diff changeset
   136
      if (!state.session.is_ready && state1.session.is_ready && state1.is_active)
79abcf48c377 clarified init/exit vs. session phase;
wenzelm
parents: 60903
diff changeset
   137
        state1.session.protocol_command("Debugger.init")
79abcf48c377 clarified init/exit vs. session phase;
wenzelm
parents: 60903
diff changeset
   138
      state1
79abcf48c377 clarified init/exit vs. session phase;
wenzelm
parents: 60903
diff changeset
   139
    })
79abcf48c377 clarified init/exit vs. session phase;
wenzelm
parents: 60903
diff changeset
   140
  }
79abcf48c377 clarified init/exit vs. session phase;
wenzelm
parents: 60903
diff changeset
   141
79abcf48c377 clarified init/exit vs. session phase;
wenzelm
parents: 60903
diff changeset
   142
  def init(): Unit =
60889
7f210887cc4e init/exit depending on active debugger panels;
wenzelm
parents: 60888
diff changeset
   143
    global_state.change(state =>
7f210887cc4e init/exit depending on active debugger panels;
wenzelm
parents: 60888
diff changeset
   144
    {
60898
a3fcde62df10 misc tuning and clarification;
wenzelm
parents: 60897
diff changeset
   145
      val state1 = state.inc_active
a3fcde62df10 misc tuning and clarification;
wenzelm
parents: 60897
diff changeset
   146
      if (!state.is_active && state1.is_active)
a3fcde62df10 misc tuning and clarification;
wenzelm
parents: 60897
diff changeset
   147
        state1.session.protocol_command("Debugger.init")
60889
7f210887cc4e init/exit depending on active debugger panels;
wenzelm
parents: 60888
diff changeset
   148
      state1
7f210887cc4e init/exit depending on active debugger panels;
wenzelm
parents: 60888
diff changeset
   149
    })
7f210887cc4e init/exit depending on active debugger panels;
wenzelm
parents: 60888
diff changeset
   150
60910
79abcf48c377 clarified init/exit vs. session phase;
wenzelm
parents: 60903
diff changeset
   151
  def exit(): Unit =
60889
7f210887cc4e init/exit depending on active debugger panels;
wenzelm
parents: 60888
diff changeset
   152
    global_state.change(state =>
7f210887cc4e init/exit depending on active debugger panels;
wenzelm
parents: 60888
diff changeset
   153
    {
60898
a3fcde62df10 misc tuning and clarification;
wenzelm
parents: 60897
diff changeset
   154
      val state1 = state.dec_active
a3fcde62df10 misc tuning and clarification;
wenzelm
parents: 60897
diff changeset
   155
      if (state.is_active && !state1.is_active)
a3fcde62df10 misc tuning and clarification;
wenzelm
parents: 60897
diff changeset
   156
        state1.session.protocol_command("Debugger.exit")
60889
7f210887cc4e init/exit depending on active debugger panels;
wenzelm
parents: 60888
diff changeset
   157
      state1
7f210887cc4e init/exit depending on active debugger panels;
wenzelm
parents: 60888
diff changeset
   158
    })
60876
52edced9cce5 rendering for debugger/breakpoint active state;
wenzelm
parents: 60875
diff changeset
   159
60932
13ee73f57c85 allow to break running threads at next possible breakpoint (simplified version of former option, see f3039309702e);
wenzelm
parents: 60912
diff changeset
   160
  def is_break(): Boolean = global_state.value.break
13ee73f57c85 allow to break running threads at next possible breakpoint (simplified version of former option, see f3039309702e);
wenzelm
parents: 60912
diff changeset
   161
  def set_break(b: Boolean)
13ee73f57c85 allow to break running threads at next possible breakpoint (simplified version of former option, see f3039309702e);
wenzelm
parents: 60912
diff changeset
   162
  {
13ee73f57c85 allow to break running threads at next possible breakpoint (simplified version of former option, see f3039309702e);
wenzelm
parents: 60912
diff changeset
   163
    global_state.change(state => {
13ee73f57c85 allow to break running threads at next possible breakpoint (simplified version of former option, see f3039309702e);
wenzelm
parents: 60912
diff changeset
   164
      val state1 = state.set_break(b)
13ee73f57c85 allow to break running threads at next possible breakpoint (simplified version of former option, see f3039309702e);
wenzelm
parents: 60912
diff changeset
   165
      state1.session.protocol_command("Debugger.break", b.toString)
13ee73f57c85 allow to break running threads at next possible breakpoint (simplified version of former option, see f3039309702e);
wenzelm
parents: 60912
diff changeset
   166
      state1
13ee73f57c85 allow to break running threads at next possible breakpoint (simplified version of former option, see f3039309702e);
wenzelm
parents: 60912
diff changeset
   167
    })
13ee73f57c85 allow to break running threads at next possible breakpoint (simplified version of former option, see f3039309702e);
wenzelm
parents: 60912
diff changeset
   168
    delay_update.invoke()
13ee73f57c85 allow to break running threads at next possible breakpoint (simplified version of former option, see f3039309702e);
wenzelm
parents: 60912
diff changeset
   169
  }
13ee73f57c85 allow to break running threads at next possible breakpoint (simplified version of former option, see f3039309702e);
wenzelm
parents: 60912
diff changeset
   170
60882
45bfd18835f1 tuned signature;
wenzelm
parents: 60880
diff changeset
   171
  def active_breakpoint_state(breakpoint: Long): Option[Boolean] =
60876
52edced9cce5 rendering for debugger/breakpoint active state;
wenzelm
parents: 60875
diff changeset
   172
  {
60898
a3fcde62df10 misc tuning and clarification;
wenzelm
parents: 60897
diff changeset
   173
    val state = global_state.value
60912
3852e87e9b88 clarified;
wenzelm
parents: 60910
diff changeset
   174
    if (state.is_active) Some(state.active_breakpoints(breakpoint)) else None
60876
52edced9cce5 rendering for debugger/breakpoint active state;
wenzelm
parents: 60875
diff changeset
   175
  }
52edced9cce5 rendering for debugger/breakpoint active state;
wenzelm
parents: 60875
diff changeset
   176
60882
45bfd18835f1 tuned signature;
wenzelm
parents: 60880
diff changeset
   177
  def breakpoint_state(breakpoint: Long): Boolean =
60898
a3fcde62df10 misc tuning and clarification;
wenzelm
parents: 60897
diff changeset
   178
    global_state.value.active_breakpoints(breakpoint)
60882
45bfd18835f1 tuned signature;
wenzelm
parents: 60880
diff changeset
   179
60880
fa958e24ff24 set breakpoint state on ML side, relying on stable situation within the PIDE editing queue;
wenzelm
parents: 60878
diff changeset
   180
  def toggle_breakpoint(command: Command, breakpoint: Long)
60878
1f0d2bbcf38b added action to toggle breakpoints (on editor side);
wenzelm
parents: 60876
diff changeset
   181
  {
1f0d2bbcf38b added action to toggle breakpoints (on editor side);
wenzelm
parents: 60876
diff changeset
   182
    global_state.change(state =>
1f0d2bbcf38b added action to toggle breakpoints (on editor side);
wenzelm
parents: 60876
diff changeset
   183
    {
60880
fa958e24ff24 set breakpoint state on ML side, relying on stable situation within the PIDE editing queue;
wenzelm
parents: 60878
diff changeset
   184
      val (breakpoint_state, state1) = state.toggle_breakpoint(breakpoint)
60878
1f0d2bbcf38b added action to toggle breakpoints (on editor side);
wenzelm
parents: 60876
diff changeset
   185
      state1.session.protocol_command(
60880
fa958e24ff24 set breakpoint state on ML side, relying on stable situation within the PIDE editing queue;
wenzelm
parents: 60878
diff changeset
   186
        "Debugger.breakpoint",
fa958e24ff24 set breakpoint state on ML side, relying on stable situation within the PIDE editing queue;
wenzelm
parents: 60878
diff changeset
   187
        Symbol.encode(command.node_name.node),
fa958e24ff24 set breakpoint state on ML side, relying on stable situation within the PIDE editing queue;
wenzelm
parents: 60878
diff changeset
   188
        Document_ID(command.id),
fa958e24ff24 set breakpoint state on ML side, relying on stable situation within the PIDE editing queue;
wenzelm
parents: 60878
diff changeset
   189
        Properties.Value.Long(breakpoint),
fa958e24ff24 set breakpoint state on ML side, relying on stable situation within the PIDE editing queue;
wenzelm
parents: 60878
diff changeset
   190
        Properties.Value.Boolean(breakpoint_state))
60878
1f0d2bbcf38b added action to toggle breakpoints (on editor side);
wenzelm
parents: 60876
diff changeset
   191
      state1
1f0d2bbcf38b added action to toggle breakpoints (on editor side);
wenzelm
parents: 60876
diff changeset
   192
    })
1f0d2bbcf38b added action to toggle breakpoints (on editor side);
wenzelm
parents: 60876
diff changeset
   193
  }
60876
52edced9cce5 rendering for debugger/breakpoint active state;
wenzelm
parents: 60875
diff changeset
   194
60875
ee23c1d21ac3 follow debugger focus;
wenzelm
parents: 60869
diff changeset
   195
  def focus(new_focus: Option[Position.T]): Boolean =
ee23c1d21ac3 follow debugger focus;
wenzelm
parents: 60869
diff changeset
   196
    global_state.change_result(state => (state.focus != new_focus, state.set_focus(new_focus)))
ee23c1d21ac3 follow debugger focus;
wenzelm
parents: 60869
diff changeset
   197
60898
a3fcde62df10 misc tuning and clarification;
wenzelm
parents: 60897
diff changeset
   198
  def threads(): Map[String, List[Debug_State]] = global_state.value.threads
a3fcde62df10 misc tuning and clarification;
wenzelm
parents: 60897
diff changeset
   199
a3fcde62df10 misc tuning and clarification;
wenzelm
parents: 60897
diff changeset
   200
  def output(): Map[String, Command.Results] = global_state.value.output
a3fcde62df10 misc tuning and clarification;
wenzelm
parents: 60897
diff changeset
   201
60854
8f45dd297357 more controls;
wenzelm
parents: 60842
diff changeset
   202
  def input(thread_name: String, msg: String*): Unit =
60898
a3fcde62df10 misc tuning and clarification;
wenzelm
parents: 60897
diff changeset
   203
    global_state.value.session.protocol_command("Debugger.input", (thread_name :: msg.toList):_*)
60854
8f45dd297357 more controls;
wenzelm
parents: 60842
diff changeset
   204
60899
wenzelm
parents: 60898
diff changeset
   205
  def continue(thread_name: String): Unit = input(thread_name, "continue")
60869
878e32cf3131 more single stepping;
wenzelm
parents: 60863
diff changeset
   206
  def step(thread_name: String): Unit = input(thread_name, "step")
878e32cf3131 more single stepping;
wenzelm
parents: 60863
diff changeset
   207
  def step_over(thread_name: String): Unit = input(thread_name, "step_over")
878e32cf3131 more single stepping;
wenzelm
parents: 60863
diff changeset
   208
  def step_out(thread_name: String): Unit = input(thread_name, "step_out")
60856
eb21ae05ec43 clarified thread state;
wenzelm
parents: 60854
diff changeset
   209
60901
ce8abd005c5d clarified GUI event handling;
wenzelm
parents: 60900
diff changeset
   210
  def clear_output(thread_name: String)
ce8abd005c5d clarified GUI event handling;
wenzelm
parents: 60900
diff changeset
   211
  {
ce8abd005c5d clarified GUI event handling;
wenzelm
parents: 60900
diff changeset
   212
    global_state.change(_.clear_output(thread_name))
60902
9f185acfdcb8 clarified events;
wenzelm
parents: 60901
diff changeset
   213
    delay_update.invoke()
60901
ce8abd005c5d clarified GUI event handling;
wenzelm
parents: 60900
diff changeset
   214
  }
ce8abd005c5d clarified GUI event handling;
wenzelm
parents: 60900
diff changeset
   215
60896
625f2c8307da clarified output;
wenzelm
parents: 60889
diff changeset
   216
  def eval(thread_name: String, index: Int, SML: Boolean, context: String, expression: String)
60856
eb21ae05ec43 clarified thread state;
wenzelm
parents: 60854
diff changeset
   217
  {
60896
625f2c8307da clarified output;
wenzelm
parents: 60889
diff changeset
   218
    global_state.change(state => {
625f2c8307da clarified output;
wenzelm
parents: 60889
diff changeset
   219
      input(thread_name, "eval",
625f2c8307da clarified output;
wenzelm
parents: 60889
diff changeset
   220
        index.toString, SML.toString, Symbol.encode(context), Symbol.encode(expression))
625f2c8307da clarified output;
wenzelm
parents: 60889
diff changeset
   221
      state.clear_output(thread_name)
625f2c8307da clarified output;
wenzelm
parents: 60889
diff changeset
   222
    })
60902
9f185acfdcb8 clarified events;
wenzelm
parents: 60901
diff changeset
   223
    delay_update.invoke()
60856
eb21ae05ec43 clarified thread state;
wenzelm
parents: 60854
diff changeset
   224
  }
60897
7aad4be8a48e print values for stack entry;
wenzelm
parents: 60896
diff changeset
   225
7aad4be8a48e print values for stack entry;
wenzelm
parents: 60896
diff changeset
   226
  def print_vals(thread_name: String, index: Int, SML: Boolean, context: String)
7aad4be8a48e print values for stack entry;
wenzelm
parents: 60896
diff changeset
   227
  {
7aad4be8a48e print values for stack entry;
wenzelm
parents: 60896
diff changeset
   228
    global_state.change(state => {
7aad4be8a48e print values for stack entry;
wenzelm
parents: 60896
diff changeset
   229
      input(thread_name, "print_vals", index.toString, SML.toString, Symbol.encode(context))
7aad4be8a48e print values for stack entry;
wenzelm
parents: 60896
diff changeset
   230
      state.clear_output(thread_name)
7aad4be8a48e print values for stack entry;
wenzelm
parents: 60896
diff changeset
   231
    })
60902
9f185acfdcb8 clarified events;
wenzelm
parents: 60901
diff changeset
   232
    delay_update.invoke()
60897
7aad4be8a48e print values for stack entry;
wenzelm
parents: 60896
diff changeset
   233
  }
60749
f727b99faaf7 skeleton for interactive debugger;
wenzelm
parents:
diff changeset
   234
}