```{index} single: Opcode; Perl module ``` # Opcode ```{pperl-module-badges} Opcode ``` Name, group and mask the interpreter's opcodes - the machinery `Safe` compartments are built from. An *opset* is a bit string with one bit per opcode, `(MAXO + 7) / 8` bytes wide. Operators are named individually (`"print"`, `"backtick"`) or by tag (`":base_core"`, `":subprocess"`); `Opcode` converts between names, tags and opsets, and installs an opset into `PL_op_mask`, which the compiler consults to refuse masked ops. This is the XS half only. `Opcode.pm` still loads from disk (`xs_only: true`) and supplies the exported wrappers (`opset_to_hex`, `opdump`, `ops_to_opset`) plus the standard tag definitions it builds from its own `__DATA__` section via `define_optag`. ## Functions ### Other Functions #### `safe_pkg_prep` Opcode.xs `_safe_pkg_prep($Package)`: make the compartment stash believe it is `main`, and wire its `_` to the global `*_` so `$_` still works. #### `safe_call_sv` Opcode.xs `_safe_call_sv($Package, $mask, $codesv)`: run $codesv with PL_op_mask localised to $mask and the compartment stash installed as PL_defstash/PL_curstash, so compiled code inside it sees the compartment as `main`. #### `verify_opset` `verify_opset($opset, $fatal = 0)` - Opcode.xs line 337. #### `invert_opset` `invert_opset($opset)` - Opcode.xs line 347. Clears the bits past MAXO in the last byte so the result never names a nonexistent opcode. #### `opset_to_ops` `opset_to_ops($opset, $desc = 0)` - Opcode.xs line 367. #### `opset` `opset(@names_or_opsets)` - Opcode.xs line 391. A leading `!` on a name turns the bit off instead of on. #### `opdesc` `opdesc(@names)` - Opcode.xs line 461. #### `define_optag` `define_optag($tag, $mask)` - Opcode.xs line 504. #### `empty_opset` `empty_opset()` - Opcode.xs line 517. #### `full_opset` `full_opset()` - Opcode.xs line 524. #### `opmask_add` `opmask_add($opset)` - Opcode.xs line 532. The PREINIT allocates PL_op_mask on first use; opmask_add itself refuses a null mask. #### `opcodes` `opcodes()` - Opcode.xs line 541. List context is unimplemented upstream too, and croaks. #### `opmask` `opmask()` - Opcode.xs line 552: the current PL_op_mask as an opset.