112 lines
2.9 KiB
Cython
112 lines
2.9 KiB
Cython
# cython: language_level=3
|
|
|
|
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
|
|
|
|
# Big integer bitsets
|
|
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 public object rhs_scope
|
|
|
|
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
|
|
|
|
cdef public Py_ssize_t in_try_block
|
|
|
|
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, rhs_scope=*)
|
|
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 stack # a stack of (env, flow) tuples
|
|
cdef object env
|
|
cdef ControlFlow flow
|
|
cdef object object_expr
|
|
cdef bint in_inplace_assignment
|
|
|
|
cpdef mark_assignment(self, lhs, rhs=*, rhs_scope=*)
|
|
cpdef mark_position(self, node)
|