| Index: ppapi/generators/idl_c_header.py
|
| diff --git a/ppapi/generators/idl_c_header.py b/ppapi/generators/idl_c_header.py
|
| index 2c3cf2cb3a2755a3d14e78ad4c7033449255de79..4ad27ba0bc63ae09519a33e0582060b0459ca0c4 100755
|
| --- a/ppapi/generators/idl_c_header.py
|
| +++ b/ppapi/generators/idl_c_header.py
|
| @@ -139,11 +139,40 @@ def GenerateHeader(out, filenode, releases):
|
| out.Write(CommentLines(['*',' @}', '']) + '\n')
|
|
|
|
|
| +def CheckTypedefs(filenode, releases):
|
| + """Checks that typedefs don't specify callbacks that take some structs.
|
| +
|
| + See http://crbug.com/233439 for details.
|
| + """
|
| + cgen = CGen()
|
| + # TODO(teravest): Fix the following callback to pass PP_Var by pointer
|
| + # instead of by value.
|
| + node_whitelist = ['PP_Ext_Alarms_OnAlarm_Func_Dev_0_1']
|
| + for node in filenode.GetListOf('Typedef'):
|
| + if node.GetName() in node_whitelist:
|
| + continue
|
| + build_list = node.GetUniqueReleases(releases)
|
| + callnode = node.GetOneOf('Callspec')
|
| + if callnode:
|
| + for param in callnode.GetListOf('Param'):
|
| + if param.GetListOf('Array'):
|
| + continue
|
| + if cgen.GetParamMode(param) != 'in':
|
| + continue
|
| + t = param.GetType(build_list[0])
|
| + while t.IsA('Typedef'):
|
| + t = t.GetType(build_list[0])
|
| + if t.IsA('Struct'):
|
| + raise Exception('%s is a struct in callback %s. '
|
| + 'See http://crbug.com/233439' %
|
| + (t.GetName(), node.GetName()))
|
| +
|
| class HGen(GeneratorByFile):
|
| def __init__(self):
|
| Generator.__init__(self, 'C Header', 'cgen', 'Generate the C headers.')
|
|
|
| def GenerateFile(self, filenode, releases, options):
|
| + CheckTypedefs(filenode, releases)
|
| savename = GetHeaderFromNode(filenode, GetOption('dstroot'))
|
| my_min, my_max = filenode.GetMinMax(releases)
|
| if my_min > releases[-1] or my_max < releases[0]:
|
|
|