OLD | NEW |
1 #!/usr/bin/python | 1 #!/usr/bin/python |
2 # | 2 # |
3 # Copyright (c) 2009 The Chromium Authors. All rights reserved. | 3 # Copyright (c) 2009 The Chromium Authors. All rights reserved. |
4 # Use of this source code is governed by a BSD-style license that can be | 4 # Use of this source code is governed by a BSD-style license that can be |
5 # found in the LICENSE file. | 5 # found in the LICENSE file. |
6 | 6 |
7 """Creates windows and posix stub files for a given set of signatures. | 7 """Creates windows and posix stub files for a given set of signatures. |
8 | 8 |
9 For libraries that need to be loaded outside of the standard executable startup | 9 For libraries that need to be loaded outside of the standard executable startup |
10 path mechanism, stub files need to be generated for the wanted functions. In | 10 path mechanism, stub files need to be generated for the wanted functions. In |
(...skipping 359 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
370 A string with the declaration of the function pointer for the signature. | 370 A string with the declaration of the function pointer for the signature. |
371 """ | 371 """ |
372 return 'static %s (*%s_ptr)(%s) = NULL;' % (signature['return_type'], | 372 return 'static %s (*%s_ptr)(%s) = NULL;' % (signature['return_type'], |
373 signature['name'], | 373 signature['name'], |
374 ', '.join(signature['params'])) | 374 ', '.join(signature['params'])) |
375 | 375 |
376 @classmethod | 376 @classmethod |
377 def StubFunction(cls, signature): | 377 def StubFunction(cls, signature): |
378 """Generates a stub function definition for the given signature. | 378 """Generates a stub function definition for the given signature. |
379 | 379 |
| 380 The function definitions are created with __attribute__((weak)) so that |
| 381 they may be overridden by a real static link or mock versions to be used |
| 382 when testing. |
| 383 |
380 Args: | 384 Args: |
381 signature: The hash representing the function signature. | 385 signature: The hash representing the function signature. |
382 | 386 |
383 Returns: | 387 Returns: |
384 A string with the stub function definition. | 388 A string with the stub function definition. |
385 """ | 389 """ |
386 # Generate the return statement prefix if this is not a void function. | 390 # Generate the return statement prefix if this is not a void function. |
387 return_prefix = '' | 391 return_prefix = '' |
388 if signature['return_type'] != 'void': | 392 if signature['return_type'] != 'void': |
389 return_prefix = 'return ' | 393 return_prefix = 'return ' |
390 | 394 |
391 # Generate the argument list. | 395 # Generate the argument list. |
392 arguments = [re.split('[\*& ]', arg)[-1].strip() for arg in | 396 arguments = [re.split('[\*& ]', arg)[-1].strip() for arg in |
393 signature['params']] | 397 signature['params']] |
394 arg_list = ', '.join(arguments) | 398 arg_list = ', '.join(arguments) |
395 if arg_list == 'void': | 399 if arg_list == 'void': |
396 arg_list = '' | 400 arg_list = '' |
397 | 401 |
398 return """%(return_type)s %(name)s(%(params)s) { | 402 return """extern %(return_type)s %(name)s(%(params)s) __attribute__((weak)); |
| 403 %(return_type)s %(name)s(%(params)s) { |
399 %(return_prefix)s%(name)s_ptr(%(arg_list)s); | 404 %(return_prefix)s%(name)s_ptr(%(arg_list)s); |
400 }""" % {'return_type': signature['return_type'], | 405 }""" % {'return_type': signature['return_type'], |
401 'name': signature['name'], | 406 'name': signature['name'], |
402 'params': ', '.join(signature['params']), | 407 'params': ', '.join(signature['params']), |
403 'return_prefix': return_prefix, | 408 'return_prefix': return_prefix, |
404 'arg_list': arg_list} | 409 'arg_list': arg_list} |
405 | 410 |
406 @classmethod | 411 @classmethod |
407 def WriteImplementationPreamble(cls, header_path, outfile): | 412 def WriteImplementationPreamble(cls, header_path, outfile): |
408 """Write the necessary includes for the implementation file. | 413 """Write the necessary includes for the implementation file. |
(...skipping 438 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
847 finally: | 852 finally: |
848 if header_file is not None: | 853 if header_file is not None: |
849 header_file.close() | 854 header_file.close() |
850 | 855 |
851 else: | 856 else: |
852 raise Error('Should not reach here') | 857 raise Error('Should not reach here') |
853 | 858 |
854 | 859 |
855 if __name__ == '__main__': | 860 if __name__ == '__main__': |
856 main() | 861 main() |
OLD | NEW |