rbf 0.0.5 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
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.