summaryrefslogtreecommitdiffstats
path: root/validate.py
diff options
context:
space:
mode:
Diffstat (limited to 'validate.py')
-rw-r--r--validate.py44
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)
+