15f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)cimport cython 25f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 35f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)from Cython.Compiler.Visitor cimport CythonTransform, TreeVisitor 45f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 55f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)cdef class ControlBlock: 65f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) cdef public set children 75f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) cdef public set parents 85f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) cdef public set positions 95f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) cdef public list stats 105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) cdef public dict gen 115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) cdef public set bounded 125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) cdef public dict input 135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) cdef public dict output 145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) # Big integer it bitsets 165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) cdef public object i_input 175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) cdef public object i_output 185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) cdef public object i_gen 195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) cdef public object i_kill 205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) cdef public object i_state 215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) cpdef bint empty(self) 235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) cpdef detach(self) 245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) cpdef add_child(self, block) 255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)cdef class ExitBlock(ControlBlock): 275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) cpdef bint empty(self) 285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)cdef class NameAssignment: 305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) cdef public bint is_arg 315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) cdef public bint is_deletion 325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) cdef public object lhs 335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) cdef public object rhs 345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) cdef public object entry 355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) cdef public object pos 365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) cdef public set refs 375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) cdef public object bit 385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) cdef public object inferred_type 395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)cdef class AssignmentList: 415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) cdef public object bit 425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) cdef public object mask 435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) cdef public list stats 445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)cdef class AssignmentCollector(TreeVisitor): 465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) cdef list assignments 475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)@cython.final 495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)cdef class ControlFlow: 505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) cdef public set blocks 515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) cdef public set entries 525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) cdef public list loops 535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) cdef public list exceptions 545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) cdef public ControlBlock entry_point 565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) cdef public ExitBlock exit_point 575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) cdef public ControlBlock block 585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) cdef public dict assmts 605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) cpdef newblock(self, ControlBlock parent=*) 625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) cpdef nextblock(self, ControlBlock parent=*) 635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) cpdef bint is_tracked(self, entry) 645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) cpdef bint is_statically_assigned(self, entry) 655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) cpdef mark_position(self, node) 665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) cpdef mark_assignment(self, lhs, rhs, entry) 675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) cpdef mark_argument(self, lhs, rhs, entry) 685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) cpdef mark_deletion(self, node, entry) 695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) cpdef mark_reference(self, node, entry) 705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) @cython.locals(block=ControlBlock, parent=ControlBlock, unreachable=set) 725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) cpdef normalize(self) 735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) @cython.locals(bit=object, assmts=AssignmentList, 755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) block=ControlBlock) 765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) cpdef initialize(self) 775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) @cython.locals(assmts=AssignmentList, assmt=NameAssignment) 795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) cpdef set map_one(self, istate, entry) 805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) @cython.locals(block=ControlBlock, parent=ControlBlock) 825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) cdef reaching_definitions(self) 835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)cdef class Uninitialized: 855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) pass 865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)cdef class Unknown: 885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) pass 895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)@cython.locals(dirty=bint, block=ControlBlock, parent=ControlBlock, 915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) assmt=NameAssignment) 925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)cdef check_definitions(ControlFlow flow, dict compiler_directives) 935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)@cython.final 955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)cdef class ControlFlowAnalysis(CythonTransform): 965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) cdef object gv_ctx 975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) cdef set reductions 985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) cdef list env_stack 995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) cdef list stack 1005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) cdef object env 1015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) cdef ControlFlow flow 1025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) cdef bint in_inplace_assignment 1035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) cpdef mark_assignment(self, lhs, rhs=*) 1055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) cpdef mark_position(self, node) 106