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