metamodel: rename 'universal' to 'enum'
[nit.git] / src / analysis / remove_out_of_init_get_test.nit
index 0e8b46d..0685777 100644 (file)
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-# This package introduces an optimization that removes 'get' tests when
+# This module introduces an optimization that removes 'get' tests when
 # not reachable from an initializer
 package remove_out_of_init_get_test
 
 import reachable_from_init_method_analysis
 
 redef class Program
+       readable var _nb_optimized_isset: Int = 0
+
        # Calling this method will remove all 'isset' that were generated automaticaly
        # before a attribute read if this attribute read is done in a method that
        # cannot be reached by a initializer
@@ -29,24 +31,58 @@ redef class Program
                        if not rfima.is_iroutine_reachable_from_init(i) then
                                var remover = new GetterTestRemover
                                remover.visit_iroutine(i)
+                               _nb_optimized_isset = nb_optimized_isset + remover.nb_optimized_isset
                        end
                end
        end
+
+       # This method will create a file and output informations about this optimization
+       fun dump_out_of_init_information(directory_name: String) do
+               var f = new OFStream.open("{directory_name}/{main_module.name}.out_of_init_opt.log")
+               var nb_not_optimized = 0
+
+               with_each_iroutines !action(i,m) do
+                       var counter = new IssetCounter
+                       counter.visit_iroutine(i)
+                       nb_not_optimized = nb_not_optimized + counter.nb_isset
+               end
+
+               f.write("Nb. optimized isset: {nb_optimized_isset}\n")
+               f.write("Nb. not optimized: {nb_not_optimized}\n")
+
+               f.close
+       end
+end
+
+class IssetCounter
+       super ICodeVisitor
+       readable var _nb_isset: Int = 0
+
+       redef fun visit_icode(ic)
+       do
+               if ic isa IAttrIsset then
+                       _nb_isset = nb_isset + 1
+               end
+
+               super
+       end
 end
 
 class GetterTestRemover
-special ICodeVisitor
+       super ICodeVisitor
+       readable var _nb_optimized_isset: Int = 0
+
        redef fun visit_icode(ic)
        do
                # Replace 'x = isset(y)' by 'x = true'
                if ic isa IAttrIsset then
                        var result = ic.result
                        assert result != null
-                       var e =  new INative("TAG_Bool(true)", null)
-                       e.is_pure = true
+                       var e =  new IBoolValue(true)
                        e.result = result
                        current_icode.insert_before(e)
                        current_icode.delete
+                       _nb_optimized_isset = nb_optimized_isset + 1
                end
 
                super