1 2 3 4 5 6 7 8 9 10 11
12
13 /*!
14 * ======== Program ========
15 * Root object for the ROV model
16 *
17 * This module is the main access point for all ROV operations.
18 * The Program APIs are used to retrieve the views for the
19 * requested modules.
20 */
21 metaonly module Program {
22
23 /*!
24 * ======== FetchDesc ========
25 * Description of data to fetch
26 *
27 * A FetchDesc object is required as the first argument of the
28 * `{@link #fetchStruct}` and `{@link #fetchArray}` methods.
29 * The FetchDesc tells ROV the type of the data to be
30 * fetched so it knows how much data to read and how to decode it.
31 *
32 * Every reference-type field in a state structure has a FetchDesc
33 * generated for it, with the name `<field name>$fetchDesc`.
34 *
35 * For example, the instance structure
36 * @p(code)
37 * struct Instance_State {
38 * Char stack[];
39 * ];
40 * @p
41 * will have defined `obj.stack$fetchDesc`, which can be used to fetch
42 * the array:
43 * @p(code)
44 * var data = Program.fetchArray(obj.stack$fetchDesc, obj.stack, len);
45 * @p
46 *
47 * @field(type) the fully qualified name of a specified type; i.e.,
48 * a type declared in some .xdc file. For example,
49 * "xdc.runtime.Types.Timestamp64".
50 * @field(isScalar) if fetching an array, are the elements of the array
51 * really just one of the "scalar structs" defined by
52 * xdc.rov.support.ScalarStructs.
53 *
54 * @see #fetchStruct
55 * @see #fetchArray
56 */
57 metaonly struct FetchDesc {
58 String type;
59 Bool isScalar;
60 }
61
62 /*!
63 * ======== InstDataView ========
64 * Instance view data returned from a scan
65 *
66 * @see #scanInstanceDataView
67 */
68 metaonly struct InstDataView {
69 String label;
70 Any elements[];
71 }
72
73 /*!
74 * ======== InstDataViewArr ========
75 * Array of all instance view data objects
76 *
77 * @see #scanInstanceDataView
78 */
79 typedef InstDataView InstDataViewArr[];
80
81 /*!
82 * ======== ModDataView ========
83 * Module view data returned from a scan
84 *
85 * @see #scanModuleDataView
86 */
87 metaonly struct ModDataView {
88 Any elements[];
89 }
90
91 /*!
92 * ======== TreeNode ========
93 * Node for a generic "tree table" view
94 *
95 * @see #scanTreeTableView
96 * @see ViewInfo#TREE_TABLE
97 */
98 metaonly struct TreeNode {
99 String label;
100 TreeNode children[];
101 Any properties[];
102 }
103
104 /*!
105 * ======== TreeNodeArr ========
106 * Array of tree table nodes
107 *
108 * @see #scanTreeTableView
109 * @see ViewInfo#TREE_TABLE
110 */
111 typedef TreeNode TreeNodeArr[];
112
113 /*!
114 * ========= RawView ========
115 * Raw module view
116 *
117 * This is the structure returned by the `{@link scanRawView}` method.
118 * It contains the module's state, the instance states, and the module
119 * configuration fields and values.
120 */
121 metaonly struct RawView {
122 Any modState;
123 Any instStates[];
124 Any modCfg;
125 }
126
127
128
129 /*!
130 * ======== scanInstanceView ========
131 * Retrieve the instance-type views for a module
132 *
133 * Returns an array of Instance_View structures, each structure
134 * representing an instance of the module.
135 *
136 * @param(modName) Full module name to return the views for.
137 * @param(tabName) Name of the tab to retrieve the views for.
138 *
139 * @a(Returns) Array of Instance_View structures, one for each instance.
140 *
141 * @a(Throws) Throws an exception in the event that a memory read of
142 * the specified instance view fails, the specified `tabName`
143 * isn't recognized, the specified `modName` doesn't support
144 * instances, or the module `modName` is not configured into
145 * the current program.
146 */
147 Any scanInstanceView(String modName, String tabName);
148
149 /*!
150 * ======== scanModuleView ========
151 * Retrieve module-type view for a module.
152 *
153 * @param(modName) Full module name to return the view for.
154 * @param(tabName) Name of the tab to retreive the view for.
155 *
156 * @(Returns) Module_View structure.
157 *
158 * @a(Throws) Throws an exception in the event that a memory read of
159 * the specified module view fails, the specified `tabName`
160 * isn't recognized, or the module `modName` is not
161 * configured into the current program.
162 */
163 Any scanModuleView(String modName, String tabName);
164
165 /*!
166 * ======== scanInstanceDataView ========
167 * Retrieve a module's specified INSTANCE_DATA type view
168 *
169 * @param(modName) Full module name to return the views for.
170 * @param(tabName) Name of the tab to retrieve the views for.
171 *
172 * @a(Throws) Throws an exception in the event that a memory read of
173 * the module's Raw view or any instance fails, the specified
174 * `tabName` isn't recognized, the specified `modName`
175 * doesn't support instances, or the module `modName` is not
176 * configured into the current program.
177 */
178 InstDataViewArr scanInstanceDataView(String modName, String tabName);
179
180 /*!
181 * ======== scanModuleDataView ========
182 * Retrieve a module's specified MODULE_DATA type view
183 *
184 * @param(modName) Full module name to return the views for.
185 * @param(tabName) Name of the tab to retrieve the views for.
186 *
187 * @a(Throws) Throws an exception in the event that a memory read of
188 * the specified module view fails, the specified `tabName`
189 * isn't recognized, or the module `modName` is not
190 * configured into the current program.
191 */
192 ModDataView scanModuleDataView(String modName, String tabName);
193
194 /*!
195 * ======== scanRawView ========
196 * Retrieve the raw view for a module.
197 *
198 * @param(modName) Full module name to return the raw view for.
199 *
200 * @(Returns) A RawView structure which contains the raw data.
201 *
202 * @a(Throws) Throws an exception in the event that a memory read of
203 * the specified instance view fails, the specified `tabName`
204 * isn't recognized, the specified `modName` doesn't support
205 * instances, or the module `modName` is not configured into
206 * the current program.
207 *
208 * @a(Throws) Throws an exception in the event that a memory read of
209 * the module's Raw view fails, or the module `modName` is
210 * not configured into the current program.
211 */
212 RawView scanRawView(String modName);
213
214 /*!
215 * ======== scanTreeTableView ========
216 */
217 TreeNodeArr scanTreeTableView(String modName, String tabName);
218
219 /*!
220 * ======== scanTreeView ========
221 */
222 Any scanTreeView(String modName, String tabName);
223
224 /*!
225 * ======== scanHandle ========
226 * Scan single instance of a module
227 *
228 * Used from a view$init function to scan a single instance of a
229 * different module given that instance's address.
230 *
231 * @param(modName) Full module name to return the raw view for.
232 * @param(instAddr) Address of instance to scan.
233 * @param(tabName) Name of the tab to retrieve the view for.
234 *
235 * @a(Returns) An Instance_View object for the requested view.
236 *
237 * @a(Throws) Throws an exception in the event that a memory read of
238 * the specified instance view fails, the specified `tabName`
239 * isn't recognized, the specified `modName` doesn't support
240 * instances, or the module `modName` is not configured into
241 * the current program.
242 */
243 Any scanHandleView(String modName, Ptr instAddr, String tabName);
244
245 /*!
246 * ======== scanObjectView ========
247 * Scan view for an embedded object
248 *
249 * Called from a view$init function to retrieve the specified view for
250 * an embedded object.
251 *
252 * Since XDC has no way of knowing what embedded objects are present in
253 * a system, embedded objects do not appear in the list of a module's
254 * instances until they have been scanned in this way.
255 *
256 * Calling Program.scanObjectView will not read any additional data from
257 * the target, since the state structure was already read as part of
258 * reading its parent structure.
259 *
260 * @param(modName) Full module name to return the view for.
261 * @param(obj) Actual object to retrieve the view for.
262 * @param(tabName) Name of the tab to retrieve the view for.
263 *
264 * @a(Returns) An Instance_View object for the requested view.
265 *
266 * @a(Throws) Throws an exception in the event that the specified
267 * `tabName` isn't recognized, the specified `modName`
268 * doesn't support instances, or the module `modName` is not
269 * configured into the current program.
270 */
271 Any scanObjectView(String modName, Any obj, String tabName);
272
273
274
275
276 /*!
277 * ======== fetchStruct ========
278 * Retrieve the specified structure from the target
279 *
280 * @param(desc) Fetch descriptor for the structure, indicating the type
281 * of the structure.
282 * @param(addr) Address of the structure to fetch.
283 * @param(addrCheck) Optional, defaults to true. Indicates whether the
284 * memory image should validate the read by comparing
285 * the address to section information.
286 *
287 * @a(Returns) Returns the requested structure as a JavaScript object.
288 *
289 * @a(Throws) Throws an exception in the event that `addr` is not in
290 * the program's memory map or some error occurs that
291 * prevents memory from being read.
292 */
293 Any fetchStruct(FetchDesc desc, Ptr addr, Bool addrCheck = true);
294
295 /*!
296 * ======== fetchArray ========
297 * Retrieve the specified array from the target
298 *
299 * @param(desc) Fetch descriptor for the array, indicating the type of
300 * data in the array.
301 * @param(addr) Address of the array to fetch.
302 * @param(len) The number of arrray elements to fetch.
303 * @param(addrCheck) Optional, defaults to true. Indicates whether the
304 * memory image should validate the read by comparing
305 * the address to section information.
306 *
307 * @a(Returns) Returns a JavaScript array with the data in it.
308 *
309 * @a(Throws) Throws an exception in the event that `addr` is not in
310 * the program's memory map, some error occurs that
311 * prevents memory from being read, or if `len` = 0.
312 */
313 Any fetchArray(FetchDesc desc, Ptr addr, Int len, Bool addrCheck = true);
314
315 /*!
316 * ======== fetchString ========
317 * Retrieve a string from the target
318 *
319 * @param(addr) Address of the string.
320 * @param(addrCheck) Optional, defaults to true. Indicates whether the
321 * memory image should validate the read by comparing
322 * the address to section information.
323 *
324 * @a(Returns) Requested string.
325 *
326 * @a(Throws) Throws an exception in the event that `addr` is not in
327 * the program's memory map or some error occurs that
328 * prevents memory from being read.
329 */
330 String fetchString(Ptr addr, Bool addrCheck = true);
331
332 /*!
333 * ======== fetchStaticString ========
334 * Retrieves a static string from the executable.
335 *
336 * This API makes use of an object file reader to improve the string
337 * reading performance--it reads the string from the file rather than
338 * performing a target memory read. For this reason, it should only be
339 * used on static strings and not dynamic ones.
340 *
341 * @param(addr) Address of the string
342 *
343 * @a(Returns) Requested string or `null` if it can't be found.
344 */
345 String fetchStaticString(Ptr addr);
346
347 /*!
348 * ======== fetchFromAddr ========
349 * Returns a JavaScript object that mirrors the C object at the supplied
350 * address
351 *
352 * The type of the object is also supplied by the user. There is no
353 * checking whether the object at that address is of the supplied type.
354 * By default, only one instance of the specified type will be fetched
355 * from the address.
356 *
357 * @param(addr) Address of the C object
358 * @param(typeName) Name of the C type read from the address
359 * @param(count) Number of C objects read from the address
360 *
361 * @a(Returns) JavaScript representation of the object at the address
362 */
363 Any fetchFromAddr(Ptr addr, String typename, Int count = 1);
364
365 /*!
366 * ======== fetchVariable ========
367 * Returns a JavaScript object or a scalar that mirrors the content of the
368 * variable.
369 *
370 * This function replicates primitive or aggregate objects from memory,
371 * and returns them as JavaScript objects. If the variable is an array or
372 * a structure, its corresponding JavaScript elements can be accessed as
373 * JavaScript arrays or structures.
374 * Pointers are not followed, but they are represented as hexadecimal
375 * values.
376 *
377 * If the variable is not found in the object file, an exception is raised.
378 *
379 * @param(varName) name of the variable
380 *
381 * @a(Returns) content of the variable
382 */
383 Any fetchVariable(String varName);
384
385 /*!
386 * ======== fetchVariableByPtr ========
387 * Returns a JavaScript representation of a C object or a scalar pointed to
388 * by the supplied pointer variable.
389 *
390 * This API first checks if there is such a variable, and if it is of a
391 * pointer type. If any of these checks fails, 'null' is returned.
392 * Otherwise, the pointer variable is dereferenced, and the memory content
393 * is interpreted as a pointed-to type.
394 */
395 Any fetchVariableByPtr(String varName);
396
397 /*!
398 * @_nodoc
399 * ======== createObject ========
400 * Internal method to create a JavaScript object representing a C object
401 *
402 * This method should never be directly called by code outside
403 * the xdc.rov package; future changes to an executables debug format
404 * will result is compatibility breaks.
405 *
406 * @param(addr) address of the object in memory
407 * @param(type) type specification for the object from memory
408 * @param(ret) already created object to which a new object is added
409 * @param(name) name for the new object within `ret`
410 */
411 Void createObject(Ptr addr, Any typespec, Any ret, String name);
412
413 /*!
414 * @_nodoc
415 * ======== readMemory ========
416 * Internal method to read a primitive value from memory
417 *
418 * This method should never be directly called by code outside
419 * the xdc.rov package; future changes to an executables debug format
420 * will result is compatibility breaks.
421 *
422 * @param(addr) memory address
423 * @param(size) size in MAUs
424 * @param(enc) one of the following Dwarf encodings (DW_AT_encoding)
425 * 0x01 DW_ATE_address
426 * 0x02 DW_ATE_boolean
427 * 0x05 DW_ATE_signed
428 * 0x06 DW_ATE_signed_char
429 * 0x07 DW_ATE_unsigned
430 * 0x08 DW_ATE_unsigned_char
431 *
432 * The following encodings are not supported
433 * 0x03 DW_ATE_complex_float
434 * 0x04 DW_ATE_float
435 * 0x09 DW_ATE_imaginary_float
436 * 0x0a DW_ATE_packed_decimal
437 * 0x0b DW_ATE_numeric_string
438 * 0x0c DW_ATE_edited
439 * 0x0d DW_ATE_signed_fixed
440 * 0x0e DW_ATE_unsigned_fixed
441 * 0x0f DW_ATE_decimal_float
442 * 0x10 DW_ATE_UTF
443 * 0x11 DW_ATE_UCS
444 * 0x12 DW_ATE_ASCII
445 * @a(Returns) a scalor value (via `{@link StructureDecoder StructureDecoder._decodeScalar}`)
446 */
447 Any readMemory(Ptr addr, UInt size, Int enc);
448
449 /*!
450 * ======== getModuleConfig ========
451 * Get a module's configuration state
452 *
453 * Returns an object with all of the module configuration values used
454 * in configuring the application.
455 *
456 * This object includes the common$ config params.
457 *
458 * @param(modName) Full module name to get the configs for.
459 *
460 * @a(Returns) Object containing all of the module configs and
461 * their values.
462 */
463 Any getModuleConfig(String modName);
464
465 /*!
466 * ======== getPrivateData ========
467 * Retrieves module's private ROV data.
468 *
469 * This API returns an object which can be used to store private data
470 * across different ROV API calls. The object is reset at every
471 * breakpoint.
472 *
473 * This object is also passed as the context to all view init functions,
474 * so it can also be accessed using 'this'. However, the context changes
475 * when you call other APIs in your module; that is when you will need
476 * this API. It can also be used to support metaonly APIs which are called
477 * by other modules.
478 */
479 Any getPrivateData(String modName);
480
481 /*!
482 * ======== lookupDataSymbol ========
483 * Lookup symbolic names for an address
484 *
485 * Uses the ISymbolTable to look up the symbols at the given address.
486 *
487 * This API is separate from lookupFuncName to address paging concerns.
488 * Use lookupFuncName to get function names (or any symbols in PROGRAM
489 * memory) and use lookupDataSymbol to get data symbols (for symbols in
490 * DATA memory).
491 *
492 * @param(addr) Address of symbols
493 *
494 * @a(Returns) Array of symbols at the requested address.
495 */
496 Any lookupDataSymbol(Int addr);
497
498 /*!
499 * ======== lookupFuncName ========
500 * Lookup function names for an address.
501 *
502 * Uses the ISymbolTable to look up the symbols at the given address.
503 *
504 * This API is separate from lookupDataSymbol to address paging concerns.
505 * Use lookupFuncName to get function names (or any symbols in PROGRAM
506 * memory) and use lookupDataSymbol to get data symbols (for symbols in
507 * DATA memory).
508 *
509 * @param(addr) Address of symbols
510 *
511 * @a(Returns) Array of symbols at the requested address.
512 */
513 Any lookupFuncName(Int addr);
514
515 /*!
516 * ======== lookupType ========
517 * Creates a type specification from the Dwarf data. Returns null if the
518 * type doesn't exist.
519 *
520 * @param(type) type name
521 */
522 Any lookupType(String type);
523
524 /*!
525 * ======== lookupTypeByVariable ========
526 * Creates a type specification from the Dwarf data for a variable.
527 *
528 * @param(varName) variable name
529 */
530 Any lookupTypeByVariable(String varName);
531
532 /*!
533 * ======== lookupSymbolValue ========
534 * Returns the value for the given symbol.
535 *
536 * Returns -1 if the symbol does not exist.
537 *
538 * @param(symName) Name of symbol
539 *
540 * @a(Returns) Address or value of symbol, or -1 if symbol does not exist
541 */
542 Int lookupSymbolValue(String symName);
543
544 /*!
545 * ======== getSymbolValue ========
546 * Returns the value for the given symbol.
547 *
548 * Returns -1 if the symbol does not exist.
549 *
550 * @param(symName) Name of symbol
551 *
552 * @a(Returns) Address or value of symbol, or -1 if symbol does not exist
553 */
554 Int getSymbolValue(String symName);
555
556 /*!
557 * ======== displayError ========
558 *
559 */
560 Void displayError(Any view, String fieldName, String errorMsg);
561
562 /*!
563 * ======== ptrToHex ========
564 * Convert pointer representation to hex string
565 *
566 * Convenience function for converting the 'at' symbol representation
567 * of a pointer to the form 0x80005846.
568 */
569 String ptrToHex(Any ptr);
570
571 /*!
572 * ======== getShortName ========
573 * Convert canonical instance names to a short name
574 *
575 * Parses the full canonical instance name for the shorter name given
576 * by the user. If there is no shorter name, then it returns an empty
577 * string "".
578 *
579 * @param(name) Full canonical instance name.
580 *
581 * @a(Returns) The short name, if the user specified one. Empty string
582 * otherwise.
583 */
584 String getShortName(String name);
585
586 /*!
587 * ======== debugPrint ========
588 * Conditional print API
589 *
590 * Output message if only debug printing is enabled. Output is sent to
591 * stdout as well as an ROV view.
592 *
593 * To enable output, either set the environment variable `XDC_ROV_TRACE`
594 * or the Java property `xdc.rov.traceEnable` to `"true"`.
595 */
596 Void debugPrint(String msg);
597
598 /*!
599 * ======== print ========
600 * Unconditional print API
601 *
602 * Output is sent to stdout as well as an ROV view.
603 */
604 Void print(String msg);
605
606 /*!
607 * ======== timestamp ========
608 * API for printing timestamp messages for performance analysis.
609 */
610 Void timestamp(String msg);
611
612 /*!
613 * ======== setTimestampFunc ========
614 * Sets API to be used for printing timestamp.
615 */
616 Void setTimestampFunc(Any func);
617
618 /*!
619 * ======== newViewStruct ========
620 * Creates a new instance of the view structure for the specified view.
621 *
622 * This API is called for views where the view structure is not already
623 * passed in as an argument to the view init function.
624 *
625 * It is necessary to instantiate a view structure in this way so that ROV
626 * is given an opportunity to initialize the status-reporting mechanisms
627 * of the view structure (to support, e.g., Program.displayError).
628 */
629 Any newViewStruct(String modName, String tabName);
630
631 /*!
632 * ======== StatusEntry ========
633 * Single entry in the ROV status table.
634 *
635 * ROV maintains a table of all errors, warnings, etc. encountered while
636 * processing views. This table is cleared on each call to clear cache
637 * (e.g., at each breakpoint).
638 */
639 metaonly struct StatusEntry {
640 String mod;
641 String tab;
642 String inst;
643 String field;
644 String message;
645 }
646
647 /*!
648 * ======== getStatusTable ========
649 * Returns the current table of all encountered status messages.
650 *
651 * This table is reset with every call to 'resetMods'. (e.g., at every
652 * breakpoint).
653 */
654 Any getStatusTable();
655
656
657
658 /*!
659 * @_nodoc
660 * ======== moduleNames ========
661 * Array of all the module names in the application.
662 */
663 readonly config String moduleNames[length];
664
665 /*!
666 * @_nodoc
667 * ======== getModuleDesc ========
668 * Used to retrieve the module descriptor object for the requested module.
669 */
670 ROVModuleDesc *getModuleDesc(String modName);
671
672 /*!
673 * @_nodoc
674 * ======== getViewType ========
675 * This is a helper method which returns whether a given tabName is a
676 * module-level view, instance-level view, or raw view.
677 */
678 String getViewType(String modName, String tabName);
679
680 /*!
681 * @_nodoc
682 * ======== Tab ========
683 * The type is an enum, but we can't use an enum from another module,
684 * so just use the String value of the type.
685 */
686 metaonly struct Tab {
687 String name;
688 String type;
689 }
690
691 /*!
692 * @_nodoc
693 * ======== Tabs ========
694 */
695 typedef Tab Tabs[];
696
697 /*!
698 * @_nodoc
699 * ======== getSupportedTabs ========
700 * Returns a string array of the tab names supported by the module.
701 */
702 Tabs getSupportedTabs(String modName);
703
704 /*!
705 * @_nodoc
706 * ======== addCMod ========
707 */
708 Void addCMod(Any mod);
709
710 /*!
711 * @_nodoc
712 * ======== getAbortFlag ========
713 * In CCS, indicates whether the abort flag has been set.
714 */
715 Bool getAbortFlag();
716
717 /*!
718 * @_nodoc
719 * ======== resetMods ========
720 * Used to clear the cache of all scanned data and views. Should be called
721 * whenever the target data has changed.
722 */
723 Void resetMods();
724
725 /*!
726 * @_nodoc
727 * ======== setThrowViewErrors ========
728 * Used to enable/disable exceptions when views detect errors
729 */
730 Void setThrowViewErrors(Bool flag);
731
732 /*!
733 * @_nodoc
734 * ======== moduleIdToName ========
735 * Used by xdc.runtime.Log.decode
736 */
737 String moduleIdToName(Int mid);
738
739 /*!
740 * ======== exToString ========
741 * Helper function for formatting exceptions into strings with filename
742 * and line number.
743 */
744 String exToString(Any e);
745
746 /*!
747 * @_nodoc
748 * ========= ROVModuleDesc ========
749 * Structure containing all ROV-related data about an individual module.
750 *
751 * An instance of this structure is created for each module in the system.
752 * As various Program.scan APIs are called, this structure is gradually
753 * filled in with data.
754 *
755 * The structure's fields:
756 * name The module's name
757 * addr Address of the state object. Redundant with state.$addr,
758 * but available so that address is present even if fetch
759 * of state fails.
760 * loadFailed Indicates that the 'useModule' call on this module threw
761 * an exception.
762 * loadFailedMsg The exception message from the 'useModule' call
763 * cfg Object containing all of the mod's configuration values
764 * state Raw module state object
765 * instances Array of ROVInstanceDesc objects representing the mod's
766 * instances.
767 * objects Array of ROVInstanceDesc objects representing instances
768 * of the module which are embedded in other objects.
769 * viewMap Contains the module-level views. The key to the map is
770 * the string tab name for the view, and the value is the
771 * an instance of Module_View.
772 * errorMap For each view, contains any error that was encountered
773 * in processing the view outside of what was reported by
774 * the module. For example, an unhandled exception from the
775 * view code would be stored here.
776 */
777 metaonly struct ROVModuleDesc {
778 String name;
779 Any addr;
780 Bool loadFailed;
781 String loadFailedMsg;
782 Any cfg;
783 Any useMod;
784 Any viewInfo;
785 Any state;
786
787 Any staticInstAddrs[];
788 Any dynInstAddrs[];
789 Bool readAllAddrs;
790
791 ROVInstanceDesc *instances[];
792 Any viewMap[string];
793 String errorMap[string];
794
795 String error;
796
797 Any instMap;
798
799 Any userPrivate;
800 };
801
802 /*!
803 * @_nodoc
804 * ========= ROVInstanceDesc ========
805 * Structure containing all ROV-related data about an individual instance.
806 *
807 * The ROVInstanceDesc objects are stored in the 'instances' array of the
808 * respective module's ROVModuleDesc structure.
809 *
810 * The structure's fields:
811 * state Raw instance state object
812 * addr Address of the state object. Redundant with state.$addr,
813 * but available so that address is present even if fetch of
814 * statefails.
815 * viewMap Contains the instance-level views. The key to the map is
816 * the string tab name for the view, and the value is the
817 * an instance of Instance_View.
818 * errorMap For each view, contains any error that was encountered
819 * in processing the view outside of what was reported by
820 * the module. For example, an unhandled exception from the
821 * view code would be stored here.
822 */
823 metaonly struct ROVInstanceDesc {
824 Any state;
825 Any addr;
826 Any viewMap[string];
827 String errorMap[string];
828
829 String error;
830 };
831
832 }
833 834 835
836