Author: Ronan Lamy <ronan.l...@gmail.com> Branch: llimpl Changeset: r82119:c1b013088ffd Date: 2016-02-09 02:13 +0000 http://bitbucket.org/pypy/pypy/changeset/c1b013088ffd/
Log: Compute signature eagerly in register_external() diff --git a/rpython/rtyper/extfunc.py b/rpython/rtyper/extfunc.py --- a/rpython/rtyper/extfunc.py +++ b/rpython/rtyper/extfunc.py @@ -6,31 +6,29 @@ class ExtFuncEntry(ExtRegistryEntry): safe_not_sandboxed = False - # common case: args is a list of annotation or types - def normalize_args(self, *args_s): - args = self.signature_args - signature_args = [annotation(arg, None) for arg in args] - assert len(args_s) == len(signature_args),\ + def check_args(self, *args_s): + params_s = self.signature_args + assert len(args_s) == len(params_s),\ "Argument number mismatch" - for i, expected in enumerate(signature_args): - arg = unionof(args_s[i], expected) - if not expected.contains(arg): + for i, s_param in enumerate(params_s): + arg = unionof(args_s[i], s_param) + if not s_param.contains(arg): raise SignatureError("In call to external function %r:\n" "arg %d must be %s,\n" " got %s" % ( - self.name, i+1, expected, args_s[i])) - return signature_args + self.name, i+1, s_param, args_s[i])) + return params_s def compute_result_annotation(self, *args_s): - self.normalize_args(*args_s) # check arguments + self.check_args(*args_s) return self.signature_result def specialize_call(self, hop): from rpython.rtyper.rtyper import llinterp_backend rtyper = hop.rtyper - signature_args = self.normalize_args(*hop.args_s) - args_r = [rtyper.getrepr(s_arg) for s_arg in signature_args] + signature_args = self.signature_args + args_r = [rtyper.getrepr(s_arg) for s_arg in self.signature_args] args_ll = [r_arg.lowleveltype for r_arg in args_r] s_result = hop.s_result r_result = rtyper.getrepr(s_result) @@ -83,23 +81,20 @@ if export_name is None: export_name = function.__name__ + params_s = [annotation(arg) for arg in args] + s_result = annotation(result) class FunEntry(ExtFuncEntry): _about_ = function safe_not_sandboxed = sandboxsafe - signature_args = args - signature_result = annotation(result, None) + signature_args = params_s + signature_result = s_result name = export_name if llimpl: lltypeimpl = staticmethod(llimpl) if llfakeimpl: lltypefakeimpl = staticmethod(llfakeimpl) - if export_name: - FunEntry.__name__ = export_name - else: - FunEntry.__name__ = function.func_name - def is_external(func): if hasattr(func, 'value'): func = func.value _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit