Beispiel #1
0
 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', [])
Beispiel #2
0
 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', [])
Beispiel #3
0
 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)
Beispiel #4
0
 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)