| 1 | #!/usr/bin/env python2
 | 
| 2 | """
 | 
| 3 | meta_ysh.py - Builtins for introspection
 | 
| 4 | """
 | 
| 5 | from __future__ import print_function
 | 
| 6 | 
 | 
| 7 | from _devbuild.gen.runtime_asdl import cmd_value
 | 
| 8 | from core import error
 | 
| 9 | from core.error import e_usage
 | 
| 10 | from core import vm
 | 
| 11 | from frontend import flag_spec
 | 
| 12 | from frontend import match
 | 
| 13 | from frontend import typed_args
 | 
| 14 | from mycpp import mylib
 | 
| 15 | from mycpp.mylib import log
 | 
| 16 | 
 | 
| 17 | _ = log
 | 
| 18 | 
 | 
| 19 | from typing import TYPE_CHECKING
 | 
| 20 | if TYPE_CHECKING:
 | 
| 21 |     from core import state
 | 
| 22 |     from core import ui
 | 
| 23 | 
 | 
| 24 | 
 | 
| 25 | class Shvm(vm._Builtin):
 | 
| 26 |     """
 | 
| 27 |     shvm cell x      - move pp cell x here
 | 
| 28 |     shvm gc-stats    - like OILS_GC_STATS
 | 
| 29 |     shvm guts (x+y)  - ASDL pretty printing
 | 
| 30 |                      - similar to = x+y, but not stable
 | 
| 31 | 
 | 
| 32 |     Related:
 | 
| 33 |       _vm->heapId(obj) - a heap ID that can be used to detect cycles for
 | 
| 34 |                          serialization
 | 
| 35 |     """
 | 
| 36 | 
 | 
| 37 |     def __init__(
 | 
| 38 |             self,
 | 
| 39 |             mem,  # type: state.Mem
 | 
| 40 |             errfmt,  # type: ui.ErrorFormatter
 | 
| 41 |     ):
 | 
| 42 |         # type: (...) -> None
 | 
| 43 |         self.mem = mem
 | 
| 44 |         self.errfmt = errfmt
 | 
| 45 |         self.stdout_ = mylib.Stdout()
 | 
| 46 | 
 | 
| 47 |     def Run(self, cmd_val):
 | 
| 48 |         # type: (cmd_value.Argv) -> int
 | 
| 49 | 
 | 
| 50 |         arg, arg_r = flag_spec.ParseCmdVal('shvm', cmd_val)
 | 
| 51 | 
 | 
| 52 |         action, action_loc = arg_r.ReadRequired2(
 | 
| 53 |             'expected an action (cell, gc-stats, guts)')
 | 
| 54 | 
 | 
| 55 |         if action == 'cell':
 | 
| 56 |             argv, locs = arg_r.Rest2()
 | 
| 57 | 
 | 
| 58 |             status = 0
 | 
| 59 |             for i, name in enumerate(argv):
 | 
| 60 |                 if name.startswith(':'):
 | 
| 61 |                     name = name[1:]
 | 
| 62 | 
 | 
| 63 |                 if not match.IsValidVarName(name):
 | 
| 64 |                     raise error.Usage('got invalid variable name %r' % name,
 | 
| 65 |                                       locs[i])
 | 
| 66 | 
 | 
| 67 |                 cell = self.mem.GetCell(name)
 | 
| 68 |                 if cell is None:
 | 
| 69 |                     self.errfmt.Print_("Couldn't find a variable named %r" %
 | 
| 70 |                                        name,
 | 
| 71 |                                        blame_loc=locs[i])
 | 
| 72 |                     status = 1
 | 
| 73 |                 else:
 | 
| 74 |                     self.stdout_.write('%s = ' % name)
 | 
| 75 |                     if mylib.PYTHON:
 | 
| 76 |                         cell.PrettyPrint()  # may be color
 | 
| 77 | 
 | 
| 78 |                     self.stdout_.write('\n')
 | 
| 79 | 
 | 
| 80 |         elif action == 'gc-stats':
 | 
| 81 |             # mylib.PrintGcStats()
 | 
| 82 |             print('TODO')
 | 
| 83 |             status = 0
 | 
| 84 | 
 | 
| 85 |         elif action == 'guts':
 | 
| 86 |             # Print the value
 | 
| 87 |             print('TODO')
 | 
| 88 | 
 | 
| 89 |             if cmd_val.typed_args:  # eval (myblock)
 | 
| 90 |                 rd = typed_args.ReaderForProc(cmd_val)
 | 
| 91 |                 val = rd.PosValue()
 | 
| 92 |                 rd.Done()
 | 
| 93 |                 if mylib.PYTHON:
 | 
| 94 |                     print(val)
 | 
| 95 | 
 | 
| 96 |             status = 0
 | 
| 97 | 
 | 
| 98 |         else:
 | 
| 99 |             e_usage('got invalid action %r' % action, action_loc)
 | 
| 100 | 
 | 
| 101 |         return status
 |