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