diff options
Diffstat (limited to 'validate.py')
-rw-r--r-- | validate.py | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/validate.py b/validate.py new file mode 100644 index 0000000..5827ddf --- /dev/null +++ b/validate.py @@ -0,0 +1,44 @@ +""" +Hooks for validating CPython extension source code +""" +def get_types(strfmt): + """ + Generate a list of C type names from a PyArg_ParseTuple format string + """ + result = [] + i = 0 + while i < len(strfmt): + c = strfmt[i] + if c == 'i': + result.append('int *') + if c in [':', ';']: + break + i += 1 + return result + +class CExtensionError(Exception): + # Base class for errors discovered by static analysis in C extension code + pass + +class WrongNumberOfVars(CExtensionError): + pass + +class NotEnoughVars(WrongNumberOfVars): + pass + +class TooManyVars(WrongNumberOfVars): + pass + +class MismatchingType(WrongNumberOfVars): + pass + +def validate_types(format_string, actual_types): + exp_types = get_types(format_string) + if len(actual_types) < len(exp_types): + raise NotEnoughVars(actual_types, exp_types) + if len(actual_types) > len(exp_types): + raise TooManyVars(actual_types, exp_types) + for exp, actual in zip(exp_types, actual_types): + if exp != actual: + raise MismatchingType(exp, actual) + |