Wed, 31 Dec 2014 06:09:35 +0100
Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.
1 #!/usr/bin/env python
2 #
3 # This Source Code Form is subject to the terms of the Mozilla Public
4 # License, v. 2.0. If a copy of the MPL was not distributed with this
5 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
7 import sys, os, xpidl, makeutils
9 def findIDL(includePath, interfaceFileName):
10 for d in includePath:
11 # Not os.path.join: we need a forward slash even on Windows because
12 # this filename ends up in makedepend output.
13 path = d + '/' + interfaceFileName
14 if os.path.exists(path):
15 return path
16 raise BaseException("No IDL file found for interface %s "
17 "in include path %r"
18 % (interfaceFileName, includePath))
20 def loadEventIDL(parser, includePath, eventname):
21 eventidl = ("nsIAccessible%s.idl" % eventname)
22 idlFile = findIDL(includePath, eventidl)
23 if not idlFile in makeutils.dependencies:
24 makeutils.dependencies.append(idlFile)
25 idl = p.parse(open(idlFile).read(), idlFile)
26 idl.resolve(includePath, p)
27 return idl
29 class Configuration:
30 def __init__(self, filename):
31 config = {}
32 execfile(filename, config)
33 self.simple_events = config.get('simple_events', [])
35 def readConfigFile(filename):
36 return Configuration(filename)
38 def firstCap(str):
39 return str[0].upper() + str[1:]
41 def writeAttributeParams(a):
42 return ("%s a%s" % (a.realtype.nativeType('in'), firstCap(a.name)))
44 def print_header_file(fd, conf):
45 fd.write("/* THIS FILE IS AUTOGENERATED - DO NOT EDIT */\n")
46 fd.write("#ifndef _mozilla_a11y_generated_AccEvents_h_\n"
47 "#define _mozilla_a11y_generated_AccEvents_h_\n\n")
48 fd.write("#include \"nscore.h\"\n")
49 fd.write("#include \"nsCOMPtr.h\"\n")
50 fd.write("#include \"nsCycleCollectionParticipant.h\"\n")
51 fd.write("#include \"nsString.h\"\n")
52 for e in conf.simple_events:
53 fd.write("#include \"nsIAccessible%s.h\"\n" % e)
54 for e in conf.simple_events:
55 idl = loadEventIDL(p, options.incdirs, e)
56 for iface in filter(lambda p: p.kind == "interface", idl.productions):
57 classname = ("xpcAcc%s" % e)
58 baseinterfaces = interfaces(iface)
60 fd.write("\nclass %s MOZ_FINAL : public %s\n" % (classname, iface.name))
61 fd.write("{\n")
62 fd.write("public:\n")
64 attributes = allAttributes(iface)
65 args = map(writeAttributeParams, attributes)
66 fd.write(" %s(%s) :\n" % (classname, ", ".join(args)))
68 initializers = []
69 for a in attributes:
70 initializers.append("m%s(a%s)" % (firstCap(a.name), firstCap(a.name)))
71 fd.write(" %s\n {}\n" % ", ".join(initializers))
72 fd.write(" ~%s() {}\n\n" % classname)
73 fd.write(" NS_DECL_CYCLE_COLLECTING_ISUPPORTS\n")
74 fd.write(" NS_DECL_CYCLE_COLLECTION_CLASS(%s)\n" % (classname))
76 for iface in filter(lambda i: i.name != "nsISupports", baseinterfaces):
77 fd.write(" NS_DECL_%s\n" % iface.name.upper())
79 fd.write("private:\n")
80 for a in attributes:
81 fd.write(" %s\n" % attributeVariableTypeAndName(a))
82 fd.write("};\n\n")
84 fd.write("#endif\n")
86 def interfaceAttributeTypes(idl):
87 ifaces = filter(lambda p: p.kind == "interface", idl.productions)
88 attributes = []
89 for i in ifaces:
90 ifaceAttributes = allAttributes(i)
91 attributes.extend(ifaceAttributes)
92 ifaceAttrs = filter(lambda a: a.realtype.nativeType("in").endswith("*"), attributes)
93 return map(lambda a: a.realtype.nativeType("in").strip(" *"), ifaceAttrs)
95 def print_cpp(idl, fd, conf, eventname):
96 for p in idl.productions:
97 if p.kind == 'interface':
98 write_cpp(eventname, p, fd)
100 def print_cpp_file(fd, conf):
101 fd.write("/* THIS FILE IS AUTOGENERATED - DO NOT EDIT */\n\n")
102 fd.write('#include "xpcAccEvents.h"\n')
104 includes = []
105 for e in conf.simple_events:
106 if not e in includes:
107 includes.append(("nsIAccessible%s" % e))
109 types = []
110 for e in conf.simple_events:
111 idl = loadEventIDL(p, options.incdirs, e)
112 types.extend(interfaceAttributeTypes(idl))
114 for c in types:
115 fd.write("#include \"%s.h\"\n" % c)
117 fd.write("\n")
118 for e in conf.simple_events:
119 print_cpp(loadEventIDL(p, options.incdirs, e), fd, conf, e)
121 def attributeVariableTypeAndName(a):
122 if a.realtype.nativeType('in').endswith('*'):
123 l = ["nsCOMPtr<%s> m%s;" % (a.realtype.nativeType('in').strip('* '),
124 firstCap(a.name))]
125 elif a.realtype.nativeType('in').count("nsAString"):
126 l = ["nsString m%s;" % firstCap(a.name)]
127 elif a.realtype.nativeType('in').count("nsACString"):
128 l = ["nsCString m%s;" % firstCap(a.name)]
129 else:
130 l = ["%sm%s;" % (a.realtype.nativeType('in'),
131 firstCap(a.name))]
132 return ", ".join(l)
134 def writeAttributeGetter(fd, classname, a):
135 fd.write("NS_IMETHODIMP\n")
136 fd.write("%s::Get%s(" % (classname, firstCap(a.name)))
137 if a.realtype.nativeType('in').endswith('*'):
138 fd.write("%s** a%s" % (a.realtype.nativeType('in').strip('* '), firstCap(a.name)))
139 elif a.realtype.nativeType('in').count("nsAString"):
140 fd.write("nsAString& a%s" % firstCap(a.name))
141 elif a.realtype.nativeType('in').count("nsACString"):
142 fd.write("nsACString& a%s" % firstCap(a.name))
143 else:
144 fd.write("%s*a%s" % (a.realtype.nativeType('in'), firstCap(a.name)))
145 fd.write(")\n");
146 fd.write("{\n");
147 if a.realtype.nativeType('in').endswith('*'):
148 fd.write(" NS_IF_ADDREF(*a%s = m%s);\n" % (firstCap(a.name), firstCap(a.name)))
149 elif a.realtype.nativeType('in').count("nsAString"):
150 fd.write(" a%s = m%s;\n" % (firstCap(a.name), firstCap(a.name)))
151 elif a.realtype.nativeType('in').count("nsACString"):
152 fd.write(" a%s = m%s;\n" % (firstCap(a.name), firstCap(a.name)))
153 else:
154 fd.write(" *a%s = m%s;\n" % (firstCap(a.name), firstCap(a.name)))
155 fd.write(" return NS_OK;\n");
156 fd.write("}\n\n");
158 def interfaces(iface):
159 interfaces = []
160 while iface.base:
161 interfaces.append(iface)
162 iface = iface.idl.getName(iface.base, iface.location)
163 interfaces.append(iface)
164 interfaces.reverse()
165 return interfaces
167 def allAttributes(iface):
168 attributes = []
169 for i in interfaces(iface):
170 attrs = filter(lambda m: isinstance(m, xpidl.Attribute), i.members)
171 attributes.extend(attrs)
173 return attributes
175 def write_cpp(eventname, iface, fd):
176 classname = "xpcAcc%s" % eventname
177 attributes = allAttributes(iface)
178 ccattributes = filter(lambda m: m.realtype.nativeType('in').endswith('*'), attributes)
179 fd.write("NS_IMPL_CYCLE_COLLECTION(%s" % classname)
180 for c in ccattributes:
181 fd.write(", m%s" % firstCap(c.name))
182 fd.write(")\n\n");
184 fd.write("NS_IMPL_CYCLE_COLLECTING_ADDREF(%s)\n" % classname)
185 fd.write("NS_IMPL_CYCLE_COLLECTING_RELEASE(%s)\n\n" % classname)
187 fd.write("NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(%s)\n" % classname)
188 for baseiface in interfaces(iface):
189 fd.write(" NS_INTERFACE_MAP_ENTRY(%s)\n" % baseiface.name)
190 fd.write("NS_INTERFACE_MAP_END\n\n")
192 for a in attributes:
193 writeAttributeGetter(fd, classname, a)
196 def main():
197 from optparse import OptionParser
198 o = OptionParser(usage="usage: %prog [options] configfile")
199 o.add_option('-I', action='append', dest='incdirs', default=['.'],
200 help="Directory to search for imported files")
201 o.add_option('-o', "--stub-output",
202 type='string', dest='stub_output', default=None,
203 help="C++ source output file", metavar="FILE")
204 o.add_option('--header-output', type='string', default=None,
205 help="Quick stub header output file", metavar="FILE")
206 o.add_option('--makedepend-output', type='string', default=None,
207 help="gnumake dependencies output file", metavar="FILE")
208 o.add_option('--cachedir', dest='cachedir', default=None,
209 help="Directory in which to cache lex/parse tables.")
210 global options
211 (options, filenames) = o.parse_args()
212 if len(filenames) != 1:
213 o.error("Exactly one config filename is needed.")
214 filename = filenames[0]
216 if options.cachedir is not None:
217 if not os.path.isdir(options.cachedir):
218 os.mkdir(options.cachedir)
219 sys.path.append(options.cachedir)
221 # Instantiate the parser.
222 global p
223 p = xpidl.IDLParser(outputdir=options.cachedir)
225 conf = readConfigFile(filename)
227 if options.stub_output is not None:
228 makeutils.targets.append(options.stub_output)
229 outfd = open(options.stub_output, 'w')
230 print_cpp_file(outfd, conf)
231 outfd.close()
232 if options.makedepend_output is not None:
233 makeutils.writeMakeDependOutput(options.makedepend_output)
234 if options.header_output is not None:
235 outfd = open(options.header_output, 'w')
236 print_header_file(outfd, conf)
237 outfd.close()
239 if __name__ == '__main__':
240 main()