rbf 0.0.5 → 0.0.6

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.
Files changed (2) hide show
  1. data/lib/rbf/optimizer.rb +19 -11
  2. metadata +1 -1
data/lib/rbf/optimizer.rb CHANGED
@@ -38,10 +38,13 @@ class Optimizer
38
38
 
39
39
  def optimize (tree)
40
40
  result = tree.clone
41
+ algos = algorithms
41
42
 
42
- algorithms.each {|alg|
43
- alg.optimize(result)
44
- }
43
+ begin
44
+ changed = algos.any? {|algo|
45
+ algo.optimize(result)
46
+ }
47
+ end while changed
45
48
 
46
49
  result
47
50
  end
@@ -53,33 +56,34 @@ class Optimizer
53
56
  end
54
57
 
55
58
  optimization :useless_operations do |tree|
56
- i = 0
57
59
  changed = false
60
+ i = 0
58
61
 
59
62
  until i >= tree.length
60
63
  if tree[i].is_a?(Array) && tree[i + 1].is_a?(Array)
61
- optimize(tree[i])
62
- optimize(tree[i + 1])
64
+ changed ||= optimize(tree[i])
65
+ changed ||= optimize(tree[i + 1])
63
66
 
64
67
  i += 2
65
68
  elsif tree[i].is_a?(Array)
66
- optimize(tree[i])
69
+ changed ||= optimize(tree[i])
67
70
 
68
71
  i += 1
69
72
  elsif [[?+, ?-], [?-, ?+], [?>, ?<], [?<, ?>]].member?(tree[i ... i + 2])
70
73
  tree.slice!(i ... i + 2)
71
74
 
72
- changed = true
75
+ changed ||= true
73
76
  else
74
77
  i += 1
75
78
  end
76
79
  end
77
80
 
78
- optimize(tree) if changed
81
+ changed
79
82
  end
80
83
 
81
84
  optimization :clear_empty_loops do |tree|
82
- i = 0
85
+ changed = false
86
+ i = 0
83
87
 
84
88
  until i >= tree.length
85
89
  if !tree[i].is_a?(Array)
@@ -87,9 +91,11 @@ class Optimizer
87
91
 
88
92
  next
89
93
  else
90
- optimize(tree[i])
94
+ changed ||= optimize(tree[i])
91
95
 
92
96
  if tree[i].empty?
97
+ changed ||= true
98
+
93
99
  unless @warned
94
100
  @warned = true
95
101
  warn 'Optimizing out one or more potentially dangerous empty loops'
@@ -101,6 +107,8 @@ class Optimizer
101
107
  end
102
108
  end
103
109
  end
110
+
111
+ changed
104
112
  end
105
113
  end
106
114
 
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: rbf
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.0.5
5
+ version: 0.0.6
6
6
  platform: ruby
7
7
  authors:
8
8
  - meh.