aboutsummaryrefslogtreecommitdiff
path: root/generator.py
diff options
context:
space:
mode:
authorDustin Graves <dustin@lunarg.com>2016-03-07 17:52:14 -0700
committerDustin Graves <dustin@lunarg.com>2016-03-08 11:31:29 -0700
commit465a7bb121e37cc070c4a3a9ef899b079f762cf6 (patch)
tree4a57090eb39d535f3db547155d623db20e6ddde7 /generator.py
parentbedcff5864e963fa11ffffc1516c0f9eee0c8d8b (diff)
downloadusermoji-465a7bb121e37cc070c4a3a9ef899b079f762cf6.tar.xz
layers: Add func pointer NULL checks
Add code generated NULL checks for function pointers. This enables parameter checking for the VkAllocationCallbacks struct, with param_checker additions for the vkDestroy functions that receive VkAllocationCallbacks parameters. Change-Id: I9910c52026aa584bb013ee5015b5cb04b2d6ddcd
Diffstat (limited to 'generator.py')
-rw-r--r--generator.py9
1 files changed, 8 insertions, 1 deletions
diff --git a/generator.py b/generator.py
index 702627f3..5dc3c9a8 100644
--- a/generator.py
+++ b/generator.py
@@ -2942,6 +2942,9 @@ class ParamCheckerOutputGenerator(OutputGenerator):
paramtype = param.find('type')
if (paramtype.tail is not None) and ('*' in paramtype.tail):
ispointer = paramtype.tail.count('*')
+ elif paramtype.text[:4] == 'PFN_':
+ # Treat function pointer typedefs as a pointer to a single value
+ ispointer = 1
return ispointer
#
# Check if the parameter passed in is a static array
@@ -3133,7 +3136,11 @@ class ParamCheckerOutputGenerator(OutputGenerator):
if req == 'VK_TRUE' or cvReq == 'VK_TRUE':
checkExpr = 'skipCall |= validate_array(report_data, {}, "{ln}", {dn}, {pf}{ln}, {pf}{vn}, {}, {});\n'.format(name, cvReq, req, ln=lenParam.name, dn=valueDisplayName, vn=value.name, pf=valuePrefix)
elif not value.isoptional:
- checkExpr = 'skipCall |= validate_required_pointer(report_data, {}, {}, {}{vn});\n'.format(name, valueDisplayName, valuePrefix, vn=value.name)
+ # Function pointers need a reinterpret_cast to void*
+ if value.type[:4] == 'PFN_':
+ checkExpr = 'skipCall |= validate_required_pointer(report_data, {}, {}, reinterpret_cast<const void*>({}{vn}));\n'.format(name, valueDisplayName, valuePrefix, vn=value.name)
+ else:
+ checkExpr = 'skipCall |= validate_required_pointer(report_data, {}, {}, {}{vn});\n'.format(name, valueDisplayName, valuePrefix, vn=value.name)
#
# If this is a pointer to a struct, see if it contains members
# that need to be checked