def __init__(self, operatorsymbol, arity, specialnames=None, **extras): """NOT_RPYTHON: cannot create new multimethods dynamically. """ MultiMethodTable.__init__(self, arity, W_ANY, argnames_before = ['space']) self.operatorsymbol = operatorsymbol if specialnames is None: specialnames = [operatorsymbol] self.specialnames = specialnames # e.g. ['__xxx__', '__rxxx__'] self.extras = extras # transform '+' => 'add' etc. for line in ObjSpace.MethodTable: realname, symbolname = line[:2] if symbolname == operatorsymbol: self.name = realname break else: self.name = operatorsymbol if extras.get('general__args__', False): self.argnames_after = ['__args__'] if extras.get('w_varargs', False): self.argnames_after = ['w_args'] if extras.get('varargs_w', False): self.argnames_after = ['args_w'] self.argnames_after += extras.get('extra_args', [])
def __init__(self, operatorsymbol, arity, specialnames=None, **extras): """NOT_RPYTHON: cannot create new multimethods dynamically. """ MultiMethodTable.__init__(self, arity, W_ANY, argnames_before = ['space']) self.operatorsymbol = operatorsymbol if specialnames is None: specialnames = [operatorsymbol] self.specialnames = specialnames # e.g. ['__xxx__', '__rxxx__'] self.extras = extras # transform '+' => 'add' etc. for line in ObjSpace.MethodTable: realname, symbolname = line[:2] if symbolname == operatorsymbol: self.name = realname break else: self.name = operatorsymbol if extras.get('general__args__', False): self.argnames_after = ['__args__'] if extras.get('w_varargs', False): self.argnames_after = ['w_args'] if extras.get('varargs_w', False): self.argnames_after = ['args_w'] self.argnames_after += extras.get('extra_args', [])
def setup(self, name): self.name = name arity = max([len(mm) for mm in self.modes]) if arity == 0: encoder = generate_function([], self.modes[()]) else: table = MultiMethodTable(arity, root_class=OPERAND, argnames_before=['builder']) for mm, opcodes in self.modes.items(): sig = list(mm) + [MISSING] * (arity - len(mm)) for cls in sig: assert issubclass(cls, OPERAND) encoder1 = generate_function(sig, opcodes) table.register(encoder1, *sig) # always use the InstallerVersion2, including for testing, # because it produces code that is more sensitive to # registration errors encoder = table.install('__encode' + name, [type_order] * arity, installercls = InstallerVersion2) mmmin = min([len(mm) for mm in self.modes]) if mmmin < arity: encoder.func_defaults = (missing,) * (arity - mmmin) setattr(I386CodeBuilder, name, encoder)
def setup(self, name): self.name = name arity = max([len(mm) for mm in self.modes]) if arity == 0: encoder = generate_function([], self.modes[()]) else: table = MultiMethodTable(arity, root_class=OPERAND, argnames_before=['builder']) for mm, opcodes in self.modes.items(): sig = list(mm) + [MISSING] * (arity - len(mm)) for cls in sig: assert issubclass(cls, OPERAND) encoder1 = generate_function(sig, opcodes) table.register(encoder1, *sig) # always use the InstallerVersion2, including for testing, # because it produces code that is more sensitive to # registration errors encoder = table.install('__encode' + name, [type_order] * arity, installercls = InstallerVersion2) mmmin = min([len(mm) for mm in self.modes]) if mmmin < arity: encoder.func_defaults = (missing,) * (arity - mmmin) setattr(I386CodeBuilder, name, encoder)