Chromium Code Reviews| 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..eab18c57ed2a72854b60afd3fcb76bb2e3484081 100755 |
| --- a/ppapi/generators/idl_c_header.py |
| +++ b/ppapi/generators/idl_c_header.py |
| @@ -139,11 +139,42 @@ 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): Allow PP_Var structs to be passed as callback parameters. |
|
Mark Seaborn
2013/04/23 15:08:47
We don't want to allow PP_Var to be passed by valu
|
| + node_whitelist = ('PP_Ext_Alarms_OnAlarm_Func_Dev_0_1',) |
|
Mark Seaborn
2013/04/23 15:08:47
Nit: '[]' lists are a little neater than '(,)' tup
|
| + 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]) |
| + if t.IsA('Struct'): |
|
Mark Seaborn
2013/04/23 15:08:47
How about:
while t.IsA('Typedef'):
t = t.GetTyp
|
| + raise Exception('%s is a struct in callback %s. ' |
| + 'See http://crbug.com/233439' % |
| + (t.GetName(), node.GetName())) |
| + elif t.IsA('Typedef'): |
| + if t.GetType(build_list[0]).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]: |