File: thread.rb

package info (click to toggle)
ruby-byebug 12.0.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 1,304 kB
  • sloc: ruby: 9,013; ansic: 1,678; sh: 5; makefile: 4
file content (67 lines) | stat: -rw-r--r-- 1,606 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# frozen_string_literal: true

module Byebug
  module Helpers
    #
    # Utilities for thread subcommands
    #
    module ThreadHelper
      def display_context(ctx)
        puts pr("thread.context", thread_arguments(ctx))
      end

      def thread_arguments(ctx)
        {
          status_flag: status_flag(ctx),
          debug_flag: debug_flag(ctx),
          id: ctx.thnum,
          thread: ctx.thread.inspect,
          file_line: location(ctx),
          pid: Process.pid,
          status: ctx.thread.status,
          current: current_thread?(ctx)
        }
      end

      def current_thread?(ctx)
        ctx.thread == Thread.current
      end

      def context_from_thread(thnum)
        ctx = Byebug.contexts.find { |c| c.thnum.to_s == thnum }

        err = if ctx.nil?
                pr("thread.errors.no_thread")
              elsif ctx == context
                pr("thread.errors.current_thread")
              elsif ctx.ignored?
                pr("thread.errors.ignored", arg: thnum)
              end

        [ctx, err]
      end

      private

      # @todo Check whether it is Byebug.current_context or context
      def location(ctx)
        return context.location if ctx == Byebug.current_context

        backtrace = ctx.thread.backtrace_locations
        return "" unless backtrace && backtrace[0]

        "#{backtrace[0].path}:#{backtrace[0].lineno}"
      end

      def status_flag(ctx)
        return "$" if ctx.suspended?

        current_thread?(ctx) ? "+" : " "
      end

      def debug_flag(ctx)
        ctx.ignored? ? "!" : " "
      end
    end
  end
end