def method_signature(self, TYPE, name_or_desc): # TODO: use callvirt only when strictly necessary if isinstance(TYPE, ootype.Instance): if isinstance(name_or_desc, ootype._overloaded_meth_desc): name = name_or_desc.name METH = name_or_desc.TYPE virtual = True else: name = name_or_desc owner, meth = TYPE._lookup(name) METH = meth._TYPE virtual = getattr(meth, '_virtual', True) class_name = self.db.class_name(TYPE) full_name = 'class %s::%s' % (class_name, self.escape_name(name)) returntype = self.lltype_to_cts(METH.RESULT) arg_types = [ self.lltype_to_cts(ARG).typename() for ARG in METH.ARGS if ARG is not ootype.Void ] arg_list = ', '.join(arg_types) return '%s %s(%s)' % (returntype, full_name, arg_list), virtual elif isinstance(TYPE, (ootype.BuiltinType, ootype.StaticMethod)): assert isinstance(name_or_desc, str) name = name_or_desc if isinstance(TYPE, ootype.StaticMethod): METH = TYPE else: METH = oopspec.get_method(TYPE, name) class_name = self.lltype_to_cts(TYPE) if isinstance(TYPE, ootype.Dict): KEY = TYPE._KEYTYPE VALUE = TYPE._VALUETYPE name = name_or_desc if KEY is ootype.Void and VALUE is ootype.Void and name == 'll_get_items_iterator': # ugly, ugly special case ret_type = types.dict_items_iterator.specialize( types.int32, types.int32) elif VALUE is ootype.Void and METH.RESULT is ootype.Dict.VALUETYPE_T: ret_type = types.void else: ret_type = self.lltype_to_cts(METH.RESULT) ret_type = dict_of_void_ll_copy_hack(TYPE, ret_type) else: ret_type = self.lltype_to_cts(METH.RESULT) generic_types = getattr(TYPE, '_generic_types', {}) arg_types = [self.lltype_to_cts(arg).typename() for arg in METH.ARGS if arg is not ootype.Void and \ generic_types.get(arg, arg) is not ootype.Void] arg_list = ', '.join(arg_types) return '%s %s::%s(%s)' % (ret_type, class_name, name, arg_list), False else: assert False
def method_signature(self, obj, name): # TODO: use callvirt only when strictly necessary if isinstance(obj, ootype.Instance): owner, meth = obj._lookup(name) METH = meth._TYPE return obj._name, METH.ARGS elif isinstance(obj, ootype.BuiltinType): meth = oopspec.get_method(obj, name) class_name = self.lltype_to_cts(obj) return class_name, meth.ARGS else: assert False
def method_signature(self, obj, name): # TODO: use callvirt only when strictly necessary if isinstance(obj, ootype.Instance): owner, meth = obj._lookup(name) METH = meth._TYPE return obj._name, METH.ARGS elif isinstance(obj, ootype.BuiltinType): meth = oopspec.get_method(obj, name) class_name = self.lltype_to_cts(obj) return class_name,meth.ARGS else: assert False
def method_signature(self, TYPE, name_or_desc): # TODO: use callvirt only when strictly necessary if isinstance(TYPE, ootype.Instance): if isinstance(name_or_desc, ootype._overloaded_meth_desc): name = name_or_desc.name METH = name_or_desc.TYPE virtual = True else: name = name_or_desc owner, meth = TYPE._lookup(name) METH = meth._TYPE virtual = getattr(meth, '_virtual', True) class_name = self.db.class_name(TYPE) full_name = 'class %s::%s' % (class_name, name) returntype = self.lltype_to_cts(METH.RESULT) arg_types = [self.lltype_to_cts(ARG) for ARG in METH.ARGS if ARG is not ootype.Void] arg_list = ', '.join(arg_types) return '%s %s(%s)' % (returntype, full_name, arg_list), virtual elif isinstance(TYPE, (ootype.BuiltinType, ootype.StaticMethod)): assert isinstance(name_or_desc, str) name = name_or_desc if isinstance(TYPE, ootype.StaticMethod): METH = TYPE else: METH = oopspec.get_method(TYPE, name) class_name = self.lltype_to_cts(TYPE) if isinstance(TYPE, ootype.Dict): KEY = TYPE._KEYTYPE VALUE = TYPE._VALUETYPE name = name_or_desc if KEY is ootype.Void and VALUE is ootype.Void and name == 'll_get_items_iterator': # ugly, ugly special case ret_type = 'class ' + PYPY_DICT_ITEMS_ITERATOR % ('int32', 'int32') elif VALUE is ootype.Void and METH.RESULT is ootype.Dict.VALUETYPE_T: ret_type = 'void' else: ret_type = self.lltype_to_cts(METH.RESULT) ret_type = dict_of_void_ll_copy_hack(TYPE, ret_type) else: ret_type = self.lltype_to_cts(METH.RESULT) generic_types = getattr(TYPE, '_generic_types', {}) arg_types = [self.lltype_to_cts(arg) for arg in METH.ARGS if arg is not ootype.Void and \ generic_types.get(arg, arg) is not ootype.Void] arg_list = ', '.join(arg_types) return '%s %s::%s(%s)' % (ret_type, class_name, name, arg_list), False else: assert False