Fix Python default argument fiasco.

This commit is contained in:
whitequark 2015-07-13 20:52:48 +03:00
parent 7c52910dc5
commit 7c9afcce85
1 changed files with 26 additions and 11 deletions

View File

@ -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)