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 display 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
|