Skip to content

Commit d9477c9

Browse files
committed
Extract into StackTableHelpers
1 parent babbd67 commit d9477c9

File tree

4 files changed

+59
-42
lines changed

4 files changed

+59
-42
lines changed

lib/vernier/parsed_profile.rb

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# frozen_string_literal: true
22

33
require "json"
4+
require_relative "stack_table_helpers"
45

56
module Vernier
67
class ParsedProfile
@@ -34,6 +35,10 @@ def initialize(thread_data)
3435

3536
attr_reader :strings
3637

38+
def stack_count = @stack_parents.length
39+
def frame_count = @frame_funcs.length
40+
def func_count = @func_names.length
41+
3742
def stack_parent_idx(idx) = @stack_parents[idx]
3843
def stack_frame_idx(idx) = @stack_frames[idx]
3944

@@ -45,6 +50,8 @@ def func_filename_idx(idx) = @func_filenames[idx]
4550
def func_name(idx) = @strings[func_name_idx(idx)]
4651
def func_filename(idx) = @strings[func_filename_idx(idx)]
4752
def func_first_lineno(idx) = @func_first_lineno[idx]
53+
54+
include StackTableHelpers
4855
end
4956

5057
class Thread

lib/vernier/stack_table.rb

Lines changed: 3 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,7 @@
1+
require_relative "stack_table_helpers"
2+
13
module Vernier
24
class StackTable
3-
def inspect
4-
"#<#{self.class.name} #{stack_count} stacks, #{frame_count} frames, #{func_count} funcs>"
5-
end
6-
7-
def to_h
8-
{
9-
stack_table: {
10-
parent: stack_count.times.map { stack_parent_idx(_1) },
11-
frame: stack_count.times.map { stack_frame_idx(_1) }
12-
},
13-
frame_table: {
14-
func: frame_count.times.map { frame_func_idx(_1) },
15-
line: frame_count.times.map { frame_line_no(_1) }
16-
},
17-
func_table: {
18-
name: func_count.times.map { func_name(_1) },
19-
filename: func_count.times.map { func_filename(_1) },
20-
first_line: func_count.times.map { func_first_lineno(_1) }
21-
}
22-
}
23-
end
24-
25-
def backtrace(stack_idx)
26-
full_stack(stack_idx).map do |stack_idx|
27-
frame_idx = stack_frame_idx(stack_idx)
28-
func_idx = frame_func_idx(frame_idx)
29-
line = frame_line_no(frame_idx)
30-
name = func_name(func_idx);
31-
filename = func_filename(func_idx);
32-
33-
"#{filename}:#{line}:in '#{name}'"
34-
end
35-
end
36-
37-
def full_stack(stack_idx)
38-
full_stack = []
39-
while stack_idx
40-
full_stack << stack_idx
41-
stack_idx = stack_parent_idx(stack_idx)
42-
end
43-
full_stack
44-
end
5+
include StackTableHelpers
456
end
467
end

lib/vernier/stack_table_helpers.rb

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
module Vernier
2+
module StackTableHelpers
3+
def inspect
4+
"#<#{self.class.name} #{stack_count} stacks, #{frame_count} frames, #{func_count} funcs>"
5+
end
6+
7+
def to_h
8+
{
9+
stack_table: {
10+
parent: stack_count.times.map { stack_parent_idx(_1) },
11+
frame: stack_count.times.map { stack_frame_idx(_1) }
12+
},
13+
frame_table: {
14+
func: frame_count.times.map { frame_func_idx(_1) },
15+
line: frame_count.times.map { frame_line_no(_1) }
16+
},
17+
func_table: {
18+
name: func_count.times.map { func_name(_1) },
19+
filename: func_count.times.map { func_filename(_1) },
20+
first_line: func_count.times.map { func_first_lineno(_1) }
21+
}
22+
}
23+
end
24+
25+
def backtrace(stack_idx)
26+
full_stack(stack_idx).map do |stack_idx|
27+
frame_idx = stack_frame_idx(stack_idx)
28+
func_idx = frame_func_idx(frame_idx)
29+
line = frame_line_no(frame_idx)
30+
name = func_name(func_idx);
31+
filename = func_filename(func_idx);
32+
33+
"#{filename}:#{line}:in '#{name}'"
34+
end
35+
end
36+
37+
def full_stack(stack_idx)
38+
full_stack = []
39+
while stack_idx
40+
full_stack << stack_idx
41+
stack_idx = stack_parent_idx(stack_idx)
42+
end
43+
full_stack
44+
end
45+
end
46+
end

test/test_parsed_profile.rb

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,8 @@ def test_gvl_sleep
88
path = File.expand_path("../fixtures/gvl_sleep.vernier.json", __FILE__)
99
parsed_profile = Vernier::ParsedProfile.read_file(path)
1010
main_thread = parsed_profile.main_thread
11+
12+
stack_table = main_thread.stack_table
13+
assert_equal "#<Vernier::ParsedProfile::StackTable 742 stacks, 385 frames, 252 funcs>", stack_table.inspect
1114
end
1215
end

0 commit comments

Comments
 (0)