Bytecode disassemby command, introduced in [Tcl 8.6.3], intended to produce machine-readable disassembly of Tcl's bytecode. The machine-readable format is a [dict].
: '''[tcl::unsupported::getbytecode proc''' ''procName''
: '''tcl::unsupported::getbytecode lambda''' ''lambdaTerm''
: '''tcl::unsupported::getbytecode script''' ''script''
: '''tcl::unsupported::getbytecode method''' ''class method''
: '''tcl::unsupported::getbytecode objmethod''' ''object method''
The different arguments control how the command looks up the bytecode to take apart.
!!!!!!
'''''WARNING!'''''<
>''The output format of this command, beyond being a dictionary, is '''not''' defined.<
>Future releases of Tcl may change it at any time.''
!!!!!!
------
**Description of output**
***Main dictionary***
In 8.6.3, the following keys are in the dict:
literals: [list] of literal values
variables: [list] of descriptions of variables in the local variable table. Each variable is a pair, where the first element is a collection of flags (e.g., `arg` for “argument to procedure”, `scalar` for “simple non-array variable”, `temp` for “a temporary variable without name”), and the second is the name of the variable (omitted for temporaries).
exception: [list] of [dict]s describing the exception ranges.
instructions: [dict] of instructions, indexed by address (which is monotonically increasing, but not contiguous; bytecodes are not all the same). Each instruction is described by a [list] where the first element is the opcode and the subsequent elements are the arguments.
auxiliary: [list] of auxiliary metadata for instructions, used to store additional information for [foreach], [switch] (in jump-table form), and [dict update]. Each entry in the auxiliary metadata is represented by a dict where `name` maps to a description of what sort of metadata it is, and other elements are defined by the type.
commands: [list] of dicts describing the commands found in the script that caused the bytecode to be generated.
script: The whole Tcl script that was parsed to generate the bytecode.
namespace: The [namespace] that the script is bound to. (Note that [TclOO] methods mutate this.)
stackdepth: The depth of value stack required to evaluate the bytecode.
exceptdepth: The depth of exception handler stack required to evaluate the bytecode.
***Variable meaning flags***
scalar: This variable holds a single value.
array: This variable is an [array].
link: This variable is a link (e.g., local variable bound for [global], [variable] or [upvar]).
arg: This variable is an argument to the procedure or method.
temp: This variable is an unnamed temporary.
resolved: This variable is controlled by a variable resolver.
***Exception dictionary entries***
type: Type of exception range being described: '''loop''' or '''catch'''.
level: How deep in the stack of exception ranges is this one?
from: Instruction address at which this range starts.
to: Instruction address at which this range ends.
break: Location to jump to on `TCL_BREAK`. Only present for '''loop''' exception ranges.
catch: Location to jump to on any exception (''including'' both `TCL_BREAK` and `TCL_CONTINUE`). Only present for '''catch''' exception ranges.
continue: Location to jump to on `TCL_CONTINUE`. Only present for '''loop''' exception ranges.
***Argument meaning flags***
Arguments may be:
* an immediate integer (may be an index into the exception table if the instruction is `beginCatch4`),
* a `@` followed by an integer index into the literals list,
* a ` %` followed by an index into the variables list,
* a `.` followed by an immediate list index (may be end-relative),
* a `=` followed by an index into the table of [string is] classes,
* a `?` followed by an index into the auxiliary list, or
* `pc ` followed by an address (for jump-like instructions).
***Auxiliary metadata types***
The first pair in the dictionary defines the `name` key, which describes the meaning of the other elements
****ForeachInfo****
Old-style foreach information. Should not normally be seen.
data: List of variables used to store lists being iterated over.
loop: Loop counter variable.
assign: List of lists of indices of variables to be assigned each step around the loop.
****NewForeachInfo****
jumpOffset: Offset of the start of the foreach loop (instruction after `foreach_start`) ''relative'' to the end of the foreach loop (`foreach_step`).
assign: List of lists of indices of variables to be assigned each step around the loop.
****DictUpdateInfo****
variables: List of indices into the variables list of variables to be written (matching order for arguments to [dict update]).
****JumptableInfo****
mapping: Dictionary mapping the value to match to the jump offset to use (i.e., ''relative'' to the `jumptable` instruction).
***Command dictionary entries***
codefrom: The index into the instructions of the start of the command.
codeto: The index into the instructions of the end of the command.
scriptfrom: The index into the script of the start of the command.
scriptto: The index into the script of the end of the command.
script: The section of script defining the command, as a string.
----
**See also**
* [tcl::unsupported::disassemble] for human-readable disassembly
<>Internals