| 1 | #!/usr/bin/env python2
 | 
| 2 | from __future__ import print_function
 | 
| 3 | """
 | 
| 4 | opcode_gen.py
 | 
| 5 | """
 | 
| 6 | 
 | 
| 7 | import sys
 | 
| 8 | 
 | 
| 9 | from lib import opcode
 | 
| 10 | 
 | 
| 11 | 
 | 
| 12 | def log(msg, *args):
 | 
| 13 |   if args:
 | 
| 14 |     msg = msg % args
 | 
| 15 |   print(msg, file=sys.stderr)
 | 
| 16 | 
 | 
| 17 | 
 | 
| 18 | def main(argv):
 | 
| 19 |   opcode_nums = set(opcode.opmap.itervalues())
 | 
| 20 | 
 | 
| 21 |   # Print opcodes in numerical order.  They're not contiguous integers.
 | 
| 22 |   for num in sorted(opcode_nums):
 | 
| 23 |     # SLICE+1 -> SLICE_1
 | 
| 24 |     name = opcode.opname[num].replace('+', '_')
 | 
| 25 |     print('#define %s %d' % (name, num))
 | 
| 26 | 
 | 
| 27 |   print('')
 | 
| 28 |   print('#define HAVE_ARGUMENT %d' % opcode.HAVE_ARGUMENT)
 | 
| 29 | 
 | 
| 30 |   #log('%s', opcode.opname)
 | 
| 31 | 
 | 
| 32 |   print('')
 | 
| 33 |   print('const char* const kOpcodeNames[] = {')
 | 
| 34 |   n = max(opcode_nums)
 | 
| 35 |   for i in xrange(n+1):
 | 
| 36 |     if i in opcode_nums:
 | 
| 37 |       print('"%s",' % opcode.opname[i])
 | 
| 38 |     else:
 | 
| 39 |       print('"",')  # empty value
 | 
| 40 |   print('};')
 | 
| 41 | 
 | 
| 42 | 
 | 
| 43 | if __name__ == '__main__':
 | 
| 44 |   try:
 | 
| 45 |     main(sys.argv)
 | 
| 46 |   except RuntimeError as e:
 | 
| 47 |     print('FATAL: %s' % e, file=sys.stderr)
 | 
| 48 |     sys.exit(1)
 |