1 ##########################################################################
3 # Copyright 2008-2009 VMware, Inc.
6 # Permission is hereby granted, free of charge, to any person obtaining a copy
7 # of this software and associated documentation files (the "Software"), to deal
8 # in the Software without restriction, including without limitation the rights
9 # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 # copies of the Software, and to permit persons to whom the Software is
11 # furnished to do so, subject to the following conditions:
13 # The above copyright notice and this permission notice shall be included in
14 # all copies or substantial portions of the Software.
16 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24 ##########################################################################/
38 def __init__(self, expr, id = ''):
42 assert char.isalnum() or char in '_ '
44 id = id.replace(' ', '_')
50 assert id not in all_types
67 def dump(self, instance):
68 raise NotImplementedError
70 def wrap_instance(self, instance):
73 def unwrap_instance(self, instance):
80 Type.__init__(self, "void")
88 print 'static void Dump%s(const %s &value);' % (self.id, self.expr)
91 print 'static void Dump%s(const %s &value) {' % (self.id, self.expr)
96 def _dump(self, instance):
97 raise NotImplementedError
99 def dump(self, instance):
100 print ' Dump%s(%s);' % (self.id, instance)
103 class Intrinsic(Concrete):
105 def __init__(self, expr, format):
106 Concrete.__init__(self, expr)
109 def _dump(self, instance):
110 print ' Log::TextF("%s", %s);' % (self.format, instance)
115 def __init__(self, type):
117 if isinstance(type, Pointer):
118 expr = type.expr + " const"
120 expr = "const " + type.expr
122 Type.__init__(self, expr, 'C' + type.id)
126 def dump(self, instance):
127 self.type.dump(instance)
132 def __init__(self, type):
133 Type.__init__(self, type.expr + " *", 'P' + type.id)
136 def dump(self, instance):
137 print ' if(%s) {' % instance
138 print ' Log::BeginReference("%s", %s);' % (self.type, instance)
140 self.type.dump("*" + instance)
141 except NotImplementedError:
143 print ' Log::EndReference();'
146 print ' Log::Text("NULL");'
148 def wrap_instance(self, instance):
149 self.type.wrap_instance("*" + instance)
151 def unwrap_instance(self, instance):
152 self.type.wrap_instance("*" + instance)
155 def ConstPointer(type):
156 return Pointer(Const(type))
159 class OutPointer(Pointer):
165 class Enum(Concrete):
167 def __init__(self, name, values):
168 Concrete.__init__(self, name)
171 def _dump(self, instance):
172 print ' switch(%s) {' % instance
173 for value in self.values:
174 print ' case %s:' % value
175 print ' Log::Text("%s");' % value
178 print ' Log::TextF("%%i", %s);' % instance
183 class FakeEnum(Enum):
185 def __init__(self, type, values):
186 Enum.__init__(self, type.expr, values)
190 class Flags(Concrete):
192 def __init__(self, type, values):
193 Concrete.__init__(self, type.expr)
197 def _dump(self, instance):
198 print ' bool l_First = true;'
199 print ' %s l_Value = %s;' % (self.type, instance)
200 for value in self.values:
201 print ' if((l_Value & %s) == %s) {' % (value, value)
202 print ' if(!l_First)'
203 print ' Log::Text(" | ");'
204 print ' Log::Text("%s");' % value
205 print ' l_Value &= ~%s;' % value
206 print ' l_First = false;'
208 print ' if(l_Value || l_First) {'
209 print ' if(!l_First)'
210 print ' Log::Text(" | ");'
211 self.type.dump("l_Value");
217 def __init__(self, type, length):
218 Type.__init__(self, type.expr + " *", 'P' + type.id)
222 def dump(self, instance):
223 index = '__i' + self.type.id
224 print ' for (int %s = 0; %s < %s; ++%s) {' % (index, index, self.length, index)
225 print ' Log::BeginElement("%s");' % (self.type,)
226 self.type.dump('(%s)[%s]' % (instance, index))
227 print ' Log::EndElement();'
230 def wrap_instance(self, instance):
231 self.type.wrap_instance("*" + instance)
233 def unwrap_instance(self, instance):
234 self.type.wrap_instance("*" + instance)
237 class OutArray(Array):
243 class Struct(Concrete):
245 def __init__(self, name, members):
246 Concrete.__init__(self, name)
247 self.members = members
249 def _dump(self, instance):
250 for type, name in self.members:
251 print ' Log::BeginElement("%s", "%s");' % (type, name)
252 type.dump('(%s).%s' % (instance, name))
253 print ' Log::EndElement();'
258 def __init__(self, name, type):
259 Type.__init__(self, name)
262 def dump(self, instance):
263 self.type.dump(instance)
268 def __init__(self, type):
269 Type.__init__(self, type.expr)
281 def dump(self, instance):
282 self.type.dump(instance)
284 def wrap_instance(self, instance):
285 self.type.wrap_instance(instance)
287 def unwrap_instance(self, instance):
288 self.type.unwrap_instance(instance)
293 def __init__(self, type, name, args, call = '__stdcall', fail = None):
300 def prototype(self, name=None):
307 s = self.call + ' ' + s
308 if name.startswith('*'):
310 s = self.type.expr + ' ' + s
313 s += ", ".join(["%s %s" % (type, name) for type, name in self.args])
319 def pointer_type(self):
320 return 'P' + self.name
322 def pointer_value(self):
323 return 'p' + self.name
326 ptype = self.pointer_type()
327 pvalue = self.pointer_value()
328 print 'typedef ' + self.prototype('* %s' % ptype) + ';'
329 print 'static %s %s = NULL;' % (ptype, pvalue)
332 def get_true_pointer(self):
333 raise NotImplementedError
336 print ' ExitProcess(0);'
339 if self.fail is not None:
340 if self.type is Void:
341 assert self.fail == ''
344 assert self.fail != ''
345 print ' return %s;' % self.fail
350 pvalue = self.pointer_value()
351 print self.prototype() + ' {'
352 if self.type is Void:
355 print ' %s result;' % self.type
357 self.get_true_pointer()
358 print ' Log::BeginCall("%s");' % (self.name)
359 for type, name in self.args:
360 if not type.isoutput():
361 type.unwrap_instance(name)
362 print ' Log::BeginArg("%s", "%s");' % (type, name)
364 print ' Log::EndArg();'
365 print ' %s%s(%s);' % (result, pvalue, ', '.join([str(name) for type, name in self.args]))
366 for type, name in self.args:
368 print ' Log::BeginArg("%s", "%s");' % (type, name)
370 print ' Log::EndArg();'
371 type.wrap_instance(name)
372 if self.type is not Void:
373 print ' Log::BeginReturn("%s");' % self.type
374 self.type.dump("result")
375 print ' Log::EndReturn();'
376 self.type.wrap_instance('result')
377 print ' Log::EndCall();'
378 self.post_call_impl()
379 if self.type is not Void:
380 print ' return result;'
384 def post_call_impl(self):
388 class Interface(Type):
390 def __init__(self, name, base=None):
391 Type.__init__(self, name)
396 def itermethods(self):
397 if self.base is not None:
398 for method in self.base.itermethods():
400 for method in self.methods:
405 return "Wrap" + self.expr
407 def wrap_pre_decl(self):
408 print "class %s;" % self.wrap_name()
411 print "class %s : public %s " % (self.wrap_name(), self.name)
414 print " %s(%s * pInstance);" % (self.wrap_name(), self.name)
415 print " virtual ~%s();" % self.wrap_name()
417 for method in self.itermethods():
418 print " " + method.prototype() + ";"
421 print " %s * m_pInstance;" % (self.name,)
426 print '%s::%s(%s * pInstance) {' % (self.wrap_name(), self.wrap_name(), self.name)
427 print ' m_pInstance = pInstance;'
430 print '%s::~%s() {' % (self.wrap_name(), self.wrap_name())
433 for method in self.itermethods():
434 print method.prototype(self.wrap_name() + '::' + method.name) + ' {'
435 if method.type is Void:
438 print ' %s result;' % method.type
440 print ' Log::BeginCall("%s");' % (self.name + '::' + method.name)
441 print ' Log::BeginArg("%s *", "this");' % self.name
442 print ' Log::BeginReference("%s", m_pInstance);' % self.name
443 print ' Log::EndReference();'
444 print ' Log::EndArg();'
445 for type, name in method.args:
446 if not type.isoutput():
447 type.unwrap_instance(name)
448 print ' Log::BeginArg("%s", "%s");' % (type, name)
450 print ' Log::EndArg();'
451 print ' %sm_pInstance->%s(%s);' % (result, method.name, ', '.join([str(name) for type, name in method.args]))
452 for type, name in method.args:
454 print ' Log::BeginArg("%s", "%s");' % (type, name)
456 print ' Log::EndArg();'
457 type.wrap_instance(name)
458 if method.type is not Void:
459 print ' Log::BeginReturn("%s");' % method.type
460 method.type.dump("result")
461 print ' Log::EndReturn();'
462 method.type.wrap_instance('result')
463 print ' Log::EndCall();'
464 if method.name == 'QueryInterface':
465 print ' if(*ppvObj == m_pInstance)'
466 print ' *ppvObj = this;'
467 if method.name == 'Release':
468 assert method.type is not Void
470 print ' delete this;'
471 if method.type is not Void:
472 print ' return result;'
478 class Method(Function):
480 def __init__(self, type, name, args):
481 Function.__init__(self, type, name, args)
486 class WrapPointer(Pointer):
488 def __init__(self, type):
489 Pointer.__init__(self, type)
490 if type not in towrap:
493 def wrap_instance(self, instance):
494 print " if(%s)" % instance
495 print " %s = new %s(%s);" % (instance, self.type.wrap_name(), instance)
497 def unwrap_instance(self, instance):
498 print " if(%s)" % instance
499 print " %s = static_cast<%s *>(%s)->m_pInstance;" % (instance, self.type.wrap_name(), instance)
505 Type.__init__(self, "char *")
507 def dump(self, instance):
508 print ' Log::DumpString((const char *)%s);' % instance
512 class _WString(Type):
515 Type.__init__(self, "wchar_t *")
517 def dump(self, instance):
518 print ' Log::DumpWString(%s);' % instance
523 SChar = Intrinsic("signed char", "%i")
524 UChar = Intrinsic("unsigned char", "%u")
525 Short = Intrinsic("short", "%i")
526 Int = Intrinsic("int", "%i")
527 Long = Intrinsic("long", "%li")
528 UShort = Intrinsic("unsigned short", "%u")
529 UInt = Intrinsic("unsigned int", "%u")
530 ULong = Intrinsic("unsigned long", "%lu")
531 Float = Intrinsic("float", "%f")
532 Double = Intrinsic("double", "%f")
533 SizeT = Intrinsic("size_t", "%lu")
537 for type in all_types.itervalues():
540 for type in all_types.itervalues():