forked from M-Labs/artiq
Fix Python default argument fiasco.
This commit is contained in:
parent
7c52910dc5
commit
7c9afcce85
|
@ -29,7 +29,7 @@ class Value:
|
||||||
:ivar uses: (list of :class:`Value`) values that use this value
|
:ivar uses: (list of :class:`Value`) values that use this value
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, typ=builtins.TNone()):
|
def __init__(self, typ):
|
||||||
self.uses, self.type = set(), typ
|
self.uses, self.type = set(), typ
|
||||||
|
|
||||||
def replace_all_uses_with(self, value):
|
def replace_all_uses_with(self, value):
|
||||||
|
@ -44,7 +44,7 @@ class NamedValue(Value):
|
||||||
:ivar function: (:class:`Function`) function containing this value
|
:ivar function: (:class:`Function`) function containing this value
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, typ=builtins.TNone(), name=""):
|
def __init__(self, typ, name):
|
||||||
super().__init__(typ)
|
super().__init__(typ)
|
||||||
self.name, self.function = name, None
|
self.name, self.function = name, None
|
||||||
|
|
||||||
|
@ -77,9 +77,10 @@ class User(NamedValue):
|
||||||
:ivar operands: (list of :class:`Value`) operands of this value
|
:ivar operands: (list of :class:`Value`) operands of this value
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, typ=builtins.TNone(), name="", operands=[]):
|
def __init__(self, operands, typ, name):
|
||||||
super().__init__(typ, name)
|
super().__init__(typ, name)
|
||||||
self.operands = []
|
self.operands = []
|
||||||
|
if operands is not None:
|
||||||
self.set_operands(operands)
|
self.set_operands(operands)
|
||||||
|
|
||||||
def set_operands(self, new_operands):
|
def set_operands(self, new_operands):
|
||||||
|
@ -107,8 +108,8 @@ class Instruction(User):
|
||||||
An SSA instruction.
|
An SSA instruction.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, typ=builtins.TNone(), name="", operands=[]):
|
def __init__(self, operands, typ, name=""):
|
||||||
super().__init__(typ, name, operands)
|
super().__init__(operands, typ, name)
|
||||||
self.basic_block = None
|
self.basic_block = None
|
||||||
|
|
||||||
def set_basic_block(self, new_basic_block):
|
def set_basic_block(self, new_basic_block):
|
||||||
|
@ -157,8 +158,14 @@ class Instruction(User):
|
||||||
class Phi(Instruction):
|
class Phi(Instruction):
|
||||||
"""
|
"""
|
||||||
An SSA instruction that joins data flow.
|
An SSA instruction that joins data flow.
|
||||||
|
|
||||||
|
Use :meth:`incoming` and :meth:`add_incoming` instead of
|
||||||
|
directly reading :attr:`operands` or calling :meth:`set_operands`.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
def __init__(self, typ, name=""):
|
||||||
|
super().__init__(typ, name)
|
||||||
|
|
||||||
def opcode(self):
|
def opcode(self):
|
||||||
return "phi"
|
return "phi"
|
||||||
|
|
||||||
|
@ -202,20 +209,27 @@ class Terminator(Instruction):
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def successors(self):
|
def successors(self):
|
||||||
[operand for operand in self.operands if isinstance(operand, BasicBlock)]
|
return [operand for operand in self.operands if isinstance(operand, BasicBlock)]
|
||||||
|
|
||||||
class BasicBlock(NamedValue):
|
class BasicBlock(NamedValue):
|
||||||
"""
|
"""
|
||||||
A block of instructions with no control flow inside it.
|
A block of instructions with no control flow inside it.
|
||||||
|
|
||||||
:ivar instructions: (list of :)
|
:ivar instructions: (list of :class:`Instruction`)
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, name="", instructions=[]):
|
def __init__(self, instructions, name=""):
|
||||||
super().__init__(TSSABasicBlock(), name)
|
super().__init__(TSSABasicBlock(), name)
|
||||||
self.instructions = []
|
self.instructions = []
|
||||||
self.set_instructions(instructions)
|
self.set_instructions(instructions)
|
||||||
|
|
||||||
|
def set_instructions(self, new_insns):
|
||||||
|
for insn in self.instructions:
|
||||||
|
insn.detach()
|
||||||
|
self.instructions = new_insns
|
||||||
|
for insn in self.instructions:
|
||||||
|
insn.set_basic_block(self)
|
||||||
|
|
||||||
def remove_from_parent(self):
|
def remove_from_parent(self):
|
||||||
if self.function is not None:
|
if self.function is not None:
|
||||||
self.function.remove(self)
|
self.function.remove(self)
|
||||||
|
@ -274,10 +288,11 @@ class Function(Value):
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, typ, name, arguments):
|
def __init__(self, typ, name, arguments):
|
||||||
self.type, self.name, self.arguments = typ, name, []
|
self.type, self.name = typ, name
|
||||||
self.set_arguments(arguments)
|
self.arguments = []
|
||||||
self.basic_blocks = set()
|
self.basic_blocks = set()
|
||||||
self.names = set()
|
self.names = set()
|
||||||
|
self.set_arguments(arguments)
|
||||||
|
|
||||||
def _remove_name(self, name):
|
def _remove_name(self, name):
|
||||||
self.names.remove(name)
|
self.names.remove(name)
|
||||||
|
|
Loading…
Reference in New Issue