|
|
from __future__ import absolute_import |
|
|
|
|
|
cimport cython |
|
|
|
|
|
from .Visitor cimport CythonTransform, TreeVisitor |
|
|
|
|
|
cdef class ControlBlock: |
|
|
cdef public set children |
|
|
cdef public set parents |
|
|
cdef public set positions |
|
|
cdef public list stats |
|
|
cdef public dict gen |
|
|
cdef public set bounded |
|
|
|
|
|
|
|
|
cdef public object i_input |
|
|
cdef public object i_output |
|
|
cdef public object i_gen |
|
|
cdef public object i_kill |
|
|
cdef public object i_state |
|
|
|
|
|
cpdef bint empty(self) |
|
|
cpdef detach(self) |
|
|
cpdef add_child(self, block) |
|
|
|
|
|
cdef class ExitBlock(ControlBlock): |
|
|
cpdef bint empty(self) |
|
|
|
|
|
cdef class NameAssignment: |
|
|
cdef public bint is_arg |
|
|
cdef public bint is_deletion |
|
|
cdef public object lhs |
|
|
cdef public object rhs |
|
|
cdef public object entry |
|
|
cdef public object pos |
|
|
cdef public set refs |
|
|
cdef public object bit |
|
|
cdef public object inferred_type |
|
|
|
|
|
cdef class AssignmentList: |
|
|
cdef public object bit |
|
|
cdef public object mask |
|
|
cdef public list stats |
|
|
|
|
|
cdef class AssignmentCollector(TreeVisitor): |
|
|
cdef list assignments |
|
|
|
|
|
@cython.final |
|
|
cdef class ControlFlow: |
|
|
cdef public set blocks |
|
|
cdef public set entries |
|
|
cdef public list loops |
|
|
cdef public list exceptions |
|
|
|
|
|
cdef public ControlBlock entry_point |
|
|
cdef public ExitBlock exit_point |
|
|
cdef public ControlBlock block |
|
|
|
|
|
cdef public dict assmts |
|
|
|
|
|
cpdef newblock(self, ControlBlock parent=*) |
|
|
cpdef nextblock(self, ControlBlock parent=*) |
|
|
cpdef bint is_tracked(self, entry) |
|
|
cpdef bint is_statically_assigned(self, entry) |
|
|
cpdef mark_position(self, node) |
|
|
cpdef mark_assignment(self, lhs, rhs, entry) |
|
|
cpdef mark_argument(self, lhs, rhs, entry) |
|
|
cpdef mark_deletion(self, node, entry) |
|
|
cpdef mark_reference(self, node, entry) |
|
|
|
|
|
@cython.locals(block=ControlBlock, parent=ControlBlock, unreachable=set) |
|
|
cpdef normalize(self) |
|
|
|
|
|
@cython.locals(bit=object, assmts=AssignmentList, |
|
|
block=ControlBlock) |
|
|
cpdef initialize(self) |
|
|
|
|
|
@cython.locals(assmts=AssignmentList, assmt=NameAssignment) |
|
|
cpdef set map_one(self, istate, entry) |
|
|
|
|
|
@cython.locals(block=ControlBlock, parent=ControlBlock) |
|
|
cdef reaching_definitions(self) |
|
|
|
|
|
cdef class Uninitialized: |
|
|
pass |
|
|
|
|
|
cdef class Unknown: |
|
|
pass |
|
|
|
|
|
|
|
|
cdef class MessageCollection: |
|
|
cdef set messages |
|
|
|
|
|
|
|
|
@cython.locals(dirty=bint, block=ControlBlock, parent=ControlBlock, |
|
|
assmt=NameAssignment) |
|
|
cdef check_definitions(ControlFlow flow, dict compiler_directives) |
|
|
|
|
|
@cython.final |
|
|
cdef class ControlFlowAnalysis(CythonTransform): |
|
|
cdef object gv_ctx |
|
|
cdef object constant_folder |
|
|
cdef set reductions |
|
|
cdef list env_stack |
|
|
cdef list stack |
|
|
cdef object env |
|
|
cdef ControlFlow flow |
|
|
cdef bint in_inplace_assignment |
|
|
|
|
|
cpdef mark_assignment(self, lhs, rhs=*) |
|
|
cpdef mark_position(self, node) |
|
|
|