tracia 0.2.6 → 0.2.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7e8c70f863ced4e60aeeb7d6dc343f568a88df17cb67d039adc7c921fa8149a8
4
- data.tar.gz: f60c5dc69ccfe8318d5ba951dfbe546e013c87eb0d3641345aaffe96d416d524
3
+ metadata.gz: ac587bcc0c01258f1220731adda063b6c83a7f66e87fe51da334286e7f629c7a
4
+ data.tar.gz: 972cfa5242cb2570aa6e9614fc30fa43937cf8c23390af260c0685b57573d094
5
5
  SHA512:
6
- metadata.gz: 998c2b5b36a92167c085ca15a0898002c06c5419f9e484342f7b7aa0607bdb8fbdd63c08af26eb219c77d3021828e2bc9a4776cd2d893798d7e0a4d8bb5fd803
7
- data.tar.gz: 86aa94fb518e44b9498562212c3ad91dbafaadd08af53eb3580b4ae8d07452b5274369d5d99e7b87c93ab38fc9468d17a3e0280f3dca9e5622908ccd227b3978
6
+ metadata.gz: d7631de3f1aaa6cae27892e120ba4eadb9318c04f4461c8697141278642d4fd18253fc8b11abb26408a306d683c0e71f8c356f03dd8c862273fdbaf4a2c6ac36
7
+ data.tar.gz: 6410a901a160249b4dab2eebe147f7a517e2ffc5da81a99d097e12d031a59e631a3b5c4ec44dfbb6566cc34d416768725cf1dd7aa09db7713e7c72719f1a7e67
data/lib/tracia/frame.rb CHANGED
@@ -50,16 +50,7 @@ class Tracia
50
50
  "#{klass}#{call_sym}#{method_name}"
51
51
  end
52
52
 
53
- INSTANCE_METHOD_SHARP = '#'
54
-
55
53
  def source_location
56
- if @file == nil
57
- meth = call_sym == INSTANCE_METHOD_SHARP ? klass.instance_method(method_name) : klass.method(method_name)
58
- src_loc = meth.source_location
59
- @file = src_loc[0]
60
- @lineno = src_loc[1]
61
- end
62
-
63
54
  "#{GemPaths.shorten(@file)}:#{@lineno}"
64
55
  end
65
56
  end
@@ -4,9 +4,7 @@ class Tracia
4
4
  module GemPaths
5
5
  ABSTRACTS = {}
6
6
 
7
- ::YAML.load(`gem env`.gsub(/=>/, ':'))['RubyGems Environment']
8
- .detect{ |hash| hash.has_key?('GEM PATHS') }['GEM PATHS']
9
- .each_with_index { |path, i| ABSTRACTS["GemPath#{i}"] = path }
7
+ ::Gem.path.each_with_index { |path, i| ABSTRACTS["GemPath#{i}"] = path }
10
8
 
11
9
  class << self
12
10
  def shorten(location)
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class Tracia
4
- VERSION = "0.2.6"
4
+ VERSION = "0.2.9"
5
5
  end
data/lib/tracia.rb CHANGED
@@ -10,6 +10,8 @@ require "binding_of_callers"
10
10
  class Tracia
11
11
  class Error < StandardError; end
12
12
 
13
+ INSTANCE_METHOD_SHARP = '#'
14
+
13
15
  attr_accessor :level, :error, :depth
14
16
 
15
17
  class << self
@@ -88,13 +90,33 @@ class Tracia
88
90
 
89
91
  root = @stack[0]
90
92
  if root
91
- non_tail_recursion!([root]) if @non_tail_recursion
93
+ eliminate_tail_recursion!([root]) if @non_tail_recursion
92
94
  @logger.call(root)
93
95
  end
94
96
  end
95
97
 
96
98
  private
97
99
 
100
+ def eliminate_tail_recursion!(stack)
101
+ @specific_recursion =
102
+ case @non_tail_recursion
103
+ when true
104
+ -> (_) { true }
105
+ else
106
+ target_recursions = Array === @non_tail_recursion ? @non_tail_recursion : [@non_tail_recursion]
107
+ target_recursions.map!{ |h| Frame.new(h[:klass], h[:call_sym], h[:method_name], nil, nil) }
108
+ -> (current) do
109
+ target_recursions.any? do |tr|
110
+ current.klass == tr.klass &&
111
+ current.call_sym == tr.call_sym &&
112
+ current.method_name == tr.method_name
113
+ end
114
+ end
115
+ end
116
+
117
+ non_tail_recursion!(stack)
118
+ end
119
+
98
120
  def non_tail_recursion!(stack)
99
121
  current_frame = stack.last
100
122
  last_idx = current_frame.children.count - 1
@@ -103,7 +125,9 @@ class Tracia
103
125
  next unless Frame === child
104
126
  next non_tail_recursion!([child]) if last_idx != idx
105
127
 
106
- recursion_idx = stack.index{ |frame| frame.same_klass_and_method?(child) }
128
+ # pp (stack + [child]).map{|f| "#{f.send(:class_and_method)}:#{f.object_id}" }
129
+
130
+ recursion_idx = @specific_recursion[child] && stack.rindex{ |frame| frame.same_klass_and_method?(child) }
107
131
  if recursion_idx
108
132
  parent = stack[recursion_idx - 1]
109
133
  parent.children << child
@@ -140,8 +164,6 @@ class Tracia
140
164
  @frames_to_reject.any?{ |rj| rj =~ raw_frame.file }
141
165
  end
142
166
 
143
- EMPTY_SRC_LOC = []
144
-
145
167
  def convert_to_frames(callers)
146
168
  callers.map! do |c|
147
169
  _binding = c._binding
@@ -151,9 +173,8 @@ class Tracia
151
173
 
152
174
  source_location =
153
175
  if _binding.frame_type == :method
154
- # meth = call_symbol == INSTANCE_METHOD_SHARP ? klass.instance_method(frame_env) : klass.method(frame_env)
155
- # meth.source_location
156
- EMPTY_SRC_LOC
176
+ meth = call_symbol == INSTANCE_METHOD_SHARP ? klass.instance_method(frame_env) : klass.method(frame_env)
177
+ meth.source_location
157
178
  else
158
179
  _binding.source_location
159
180
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tracia
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.6
4
+ version: 0.2.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - ken
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-05-24 00:00:00.000000000 Z
11
+ date: 2022-06-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: pry
@@ -44,14 +44,14 @@ dependencies:
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: 0.1.8
47
+ version: 0.1.9
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: 0.1.8
54
+ version: 0.1.9
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: binding_of_callers
57
57
  requirement: !ruby/object:Gem::Requirement