nitvm: SSA modules also gives all object-mechanisms sites after the computation
authorJulien Pagès <julien.projet@gmail.com>
Sun, 31 May 2015 17:28:31 +0000 (19:28 +0200)
committerJulien Pagès <julien.projet@gmail.com>
Fri, 5 Jun 2015 13:10:56 +0000 (15:10 +0200)
Signed-off-by: Julien Pagès <julien.projet@gmail.com>

src/ssa.nit

index a45ac5b..634dfa3 100644 (file)
@@ -208,6 +208,10 @@ redef class APropdef
        # Generate all basic blocks for this code
        fun generate_basic_blocks(ssa: SSA) is abstract
 
+       # Contain all AST-parts related to object mechanisms the propdef has:
+       # instantiation, method dispatch, attribute access, subtyping-test
+       var object_sites: Array[AExpr] = new Array[AExpr]
+
        # Compute the three steps of SSA-algorithm
        # `ssa` A new instance of SSA class initialized with `self`
        fun compute_ssa(ssa: SSA)
@@ -796,6 +800,8 @@ end
 redef class AIsaExpr
        redef fun generate_basic_blocks(ssa, old_block)
        do
+               ssa.propdef.object_sites.add(self)
+
                return self.n_expr.generate_basic_blocks(ssa, old_block)
        end
 end
@@ -803,6 +809,8 @@ end
 redef class AAsCastExpr
        redef fun generate_basic_blocks(ssa, old_block)
        do
+               ssa.propdef.object_sites.add(self)
+
                return self.n_expr.generate_basic_blocks(ssa, old_block)
        end
 end
@@ -834,6 +842,8 @@ redef class ASendExpr
                # A call does not finish the current block,
                # because we create intra-procedural basic blocks here
 
+               ssa.propdef.object_sites.add(self)
+
                # Recursively goes into arguments to find variables if any
                for e in self.raw_arguments do e.generate_basic_blocks(ssa, old_block)
 
@@ -846,6 +856,8 @@ redef class ASendReassignFormExpr
        do
                self.n_expr.generate_basic_blocks(ssa, old_block)
 
+               ssa.propdef.object_sites.add(self)
+
                # Recursively goes into arguments to find variables if any
                for e in self.raw_arguments do e.generate_basic_blocks(ssa, old_block)
 
@@ -868,6 +880,8 @@ redef class ANewExpr
        do
                for e in self.n_args.n_exprs do e.generate_basic_blocks(ssa, old_block)
 
+               ssa.propdef.object_sites.add(self)
+
                return old_block
        end
 end
@@ -875,6 +889,8 @@ end
 redef class AAttrExpr
        redef fun generate_basic_blocks(ssa, old_block)
        do
+               ssa.propdef.object_sites.add(self)
+
                return self.n_expr.generate_basic_blocks(ssa, old_block)
        end
 end
@@ -882,6 +898,8 @@ end
 redef class AAttrAssignExpr
        redef fun generate_basic_blocks(ssa, old_block)
        do
+               ssa.propdef.object_sites.add(self)
+
                return self.n_expr.generate_basic_blocks(ssa, old_block)
        end
 end
@@ -889,6 +907,8 @@ end
 redef class AAttrReassignExpr
        redef fun generate_basic_blocks(ssa, old_block)
        do
+               ssa.propdef.object_sites.add(self)
+
                return self.n_expr.generate_basic_blocks(ssa, old_block)
        end
 end