src/Pure/Tools/debugger.scala
author wenzelm
Thu, 30 Jul 2015 14:02:19 +0200
changeset 60835 6512bb0b1ff4
parent 60834 781f1168d31e
child 60842 5510c8444bc4
permissions -rw-r--r--
clarified management of (single) session; proper Debugger.Update events;
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
60835
6512bb0b1ff4 clarified management of (single) session;
wenzelm
parents: 60834
diff changeset
    14
  sealed case class State(
6512bb0b1ff4 clarified management of (single) session;
wenzelm
parents: 60834
diff changeset
    15
    session: Session = new Session(Resources.empty),
60834
781f1168d31e maintain debugger output messages;
wenzelm
parents: 60830
diff changeset
    16
    output: Map[String, Command.Results] = Map.empty)  // thread name ~> output messages
781f1168d31e maintain debugger output messages;
wenzelm
parents: 60830
diff changeset
    17
  {
781f1168d31e maintain debugger output messages;
wenzelm
parents: 60830
diff changeset
    18
    def add_output(name: String, entry: Command.Results.Entry): State =
781f1168d31e maintain debugger output messages;
wenzelm
parents: 60830
diff changeset
    19
      copy(output = output + (name -> (output.getOrElse(name, Command.Results.empty) + entry)))
781f1168d31e maintain debugger output messages;
wenzelm
parents: 60830
diff changeset
    20
  }
781f1168d31e maintain debugger output messages;
wenzelm
parents: 60830
diff changeset
    21
781f1168d31e maintain debugger output messages;
wenzelm
parents: 60830
diff changeset
    22
  private val global_state = Synchronized(State())
781f1168d31e maintain debugger output messages;
wenzelm
parents: 60830
diff changeset
    23
  def current_state(): State = global_state.value
781f1168d31e maintain debugger output messages;
wenzelm
parents: 60830
diff changeset
    24
781f1168d31e maintain debugger output messages;
wenzelm
parents: 60830
diff changeset
    25
60835
6512bb0b1ff4 clarified management of (single) session;
wenzelm
parents: 60834
diff changeset
    26
  /* protocol handler */
60749
f727b99faaf7 skeleton for interactive debugger;
wenzelm
parents:
diff changeset
    27
60835
6512bb0b1ff4 clarified management of (single) session;
wenzelm
parents: 60834
diff changeset
    28
  sealed case class Update(thread_names: Set[String])
60749
f727b99faaf7 skeleton for interactive debugger;
wenzelm
parents:
diff changeset
    29
f727b99faaf7 skeleton for interactive debugger;
wenzelm
parents:
diff changeset
    30
  class Handler extends Session.Protocol_Handler
f727b99faaf7 skeleton for interactive debugger;
wenzelm
parents:
diff changeset
    31
  {
60835
6512bb0b1ff4 clarified management of (single) session;
wenzelm
parents: 60834
diff changeset
    32
    private var updated = Set.empty[String]
6512bb0b1ff4 clarified management of (single) session;
wenzelm
parents: 60834
diff changeset
    33
    private val delay_update =
6512bb0b1ff4 clarified management of (single) session;
wenzelm
parents: 60834
diff changeset
    34
      Simple_Thread.delay_first(current_state().session.output_delay) {
6512bb0b1ff4 clarified management of (single) session;
wenzelm
parents: 60834
diff changeset
    35
        current_state().session.debugger_updates.post(Update(updated))
6512bb0b1ff4 clarified management of (single) session;
wenzelm
parents: 60834
diff changeset
    36
        updated = Set.empty
6512bb0b1ff4 clarified management of (single) session;
wenzelm
parents: 60834
diff changeset
    37
      }
6512bb0b1ff4 clarified management of (single) session;
wenzelm
parents: 60834
diff changeset
    38
    private def update(name: String)
6512bb0b1ff4 clarified management of (single) session;
wenzelm
parents: 60834
diff changeset
    39
    {
6512bb0b1ff4 clarified management of (single) session;
wenzelm
parents: 60834
diff changeset
    40
      updated += name
6512bb0b1ff4 clarified management of (single) session;
wenzelm
parents: 60834
diff changeset
    41
      delay_update.invoke()
6512bb0b1ff4 clarified management of (single) session;
wenzelm
parents: 60834
diff changeset
    42
    }
6512bb0b1ff4 clarified management of (single) session;
wenzelm
parents: 60834
diff changeset
    43
60830
f56e189350b2 separate channel for debugger output;
wenzelm
parents: 60829
diff changeset
    44
    private def debugger_output(prover: Prover, msg: Prover.Protocol_Output): Boolean =
f56e189350b2 separate channel for debugger output;
wenzelm
parents: 60829
diff changeset
    45
    {
f56e189350b2 separate channel for debugger output;
wenzelm
parents: 60829
diff changeset
    46
      msg.properties match {
60835
6512bb0b1ff4 clarified management of (single) session;
wenzelm
parents: 60834
diff changeset
    47
        case Markup.Debugger_Output(thread_name) =>
60834
781f1168d31e maintain debugger output messages;
wenzelm
parents: 60830
diff changeset
    48
          val msg_body =
781f1168d31e maintain debugger output messages;
wenzelm
parents: 60830
diff changeset
    49
            prover.xml_cache.body(
781f1168d31e maintain debugger output messages;
wenzelm
parents: 60830
diff changeset
    50
              YXML.parse_body_failsafe(UTF8.decode_permissive(msg.bytes)))
781f1168d31e maintain debugger output messages;
wenzelm
parents: 60830
diff changeset
    51
          msg_body match {
781f1168d31e maintain debugger output messages;
wenzelm
parents: 60830
diff changeset
    52
            case List(XML.Elem(Markup(name, props @ Markup.Serial(i)), body)) =>
781f1168d31e maintain debugger output messages;
wenzelm
parents: 60830
diff changeset
    53
              val message = XML.Elem(Markup(Markup.message(name), props), body)
60835
6512bb0b1ff4 clarified management of (single) session;
wenzelm
parents: 60834
diff changeset
    54
              global_state.change(_.add_output(thread_name, i -> message))
6512bb0b1ff4 clarified management of (single) session;
wenzelm
parents: 60834
diff changeset
    55
              update(thread_name)
60834
781f1168d31e maintain debugger output messages;
wenzelm
parents: 60830
diff changeset
    56
              true
781f1168d31e maintain debugger output messages;
wenzelm
parents: 60830
diff changeset
    57
            case _ => false
781f1168d31e maintain debugger output messages;
wenzelm
parents: 60830
diff changeset
    58
          }
60830
f56e189350b2 separate channel for debugger output;
wenzelm
parents: 60829
diff changeset
    59
        case _ => false
f56e189350b2 separate channel for debugger output;
wenzelm
parents: 60829
diff changeset
    60
      }
f56e189350b2 separate channel for debugger output;
wenzelm
parents: 60829
diff changeset
    61
    }
f56e189350b2 separate channel for debugger output;
wenzelm
parents: 60829
diff changeset
    62
f56e189350b2 separate channel for debugger output;
wenzelm
parents: 60829
diff changeset
    63
    val functions =
f56e189350b2 separate channel for debugger output;
wenzelm
parents: 60829
diff changeset
    64
      Map(Markup.DEBUGGER_OUTPUT -> debugger_output _)
60749
f727b99faaf7 skeleton for interactive debugger;
wenzelm
parents:
diff changeset
    65
  }
60765
e43e71a75838 support for ML debugger;
wenzelm
parents: 60749
diff changeset
    66
e43e71a75838 support for ML debugger;
wenzelm
parents: 60749
diff changeset
    67
e43e71a75838 support for ML debugger;
wenzelm
parents: 60749
diff changeset
    68
  /* protocol commands */
e43e71a75838 support for ML debugger;
wenzelm
parents: 60749
diff changeset
    69
60835
6512bb0b1ff4 clarified management of (single) session;
wenzelm
parents: 60834
diff changeset
    70
  def init(new_session: Session)
6512bb0b1ff4 clarified management of (single) session;
wenzelm
parents: 60834
diff changeset
    71
  {
6512bb0b1ff4 clarified management of (single) session;
wenzelm
parents: 60834
diff changeset
    72
    global_state.change(_.copy(session = new_session))
6512bb0b1ff4 clarified management of (single) session;
wenzelm
parents: 60834
diff changeset
    73
    current_state().session.protocol_command("Debugger.init")
6512bb0b1ff4 clarified management of (single) session;
wenzelm
parents: 60834
diff changeset
    74
  }
60765
e43e71a75838 support for ML debugger;
wenzelm
parents: 60749
diff changeset
    75
60835
6512bb0b1ff4 clarified management of (single) session;
wenzelm
parents: 60834
diff changeset
    76
  def cancel(name: String): Unit =
6512bb0b1ff4 clarified management of (single) session;
wenzelm
parents: 60834
diff changeset
    77
    current_state().session.protocol_command("Debugger.cancel", name)
60765
e43e71a75838 support for ML debugger;
wenzelm
parents: 60749
diff changeset
    78
60835
6512bb0b1ff4 clarified management of (single) session;
wenzelm
parents: 60834
diff changeset
    79
  def input(name: String, msg: String*): Unit =
6512bb0b1ff4 clarified management of (single) session;
wenzelm
parents: 60834
diff changeset
    80
    current_state().session.protocol_command("Debugger.input", (name :: msg.toList):_*)
60749
f727b99faaf7 skeleton for interactive debugger;
wenzelm
parents:
diff changeset
    81
}