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]: |