- NAME
- SYNOPSIS
- DESCRIPTION
  - %bits
  - %defines
  - %labels
  - %ops_using

# NAME

B::Op_private - OP op_private flag definitions

# SYNOPSIS

        use B::Op_private;

        # flag details for bit 7 of OP_AELEM's op_private:
        my $name  = $B::Op_private::bits{aelem}{7}; # OPpLVAL_INTRO
        my $value = $B::Op_private::defines{$name}; # 128
        my $label = $B::Op_private::labels{$name};  # LVINTRO

        # the bit field at bits 5..6 of OP_AELEM's op_private:
        my $bf  = $B::Op_private::bits{aelem}{6};
        my $mask = $bf->{bitmask}; # etc

# DESCRIPTION

This module provides four global hashes:

        %B::Op_private::bits
        %B::Op_private::defines
        %B::Op_private::labels
        %B::Op_private::ops_using

which contain information about the per-op meanings of the bits in the op_private field.

## `%bits`

This is indexed by op name and then bit number (0..7). For single bit flags, it returns the name of the define (if any) for that bit:

       $B::Op_private::bits{aelem}{7} eq 'OPpLVAL_INTRO';

For bit fields, it returns a hash ref containing details about the field. The same reference will be returned for all bit positions that make up the bit field; so for example these both return the same hash ref:

        $bitfield = $B::Op_private::bits{aelem}{5};
        $bitfield = $B::Op_private::bits{aelem}{6};

The general format of this hash ref is

        {
            # The bit range and mask; these are always present.
            bitmin        => 5,
            bitmax        => 6,
            bitmask       => 0x60,

            # (The remaining keys are optional)

            # The names of any defines that were requested:
            mask_def      => 'OPpFOO_MASK',
            baseshift_def => 'OPpFOO_SHIFT',
            bitcount_def  => 'OPpFOO_BITS',

            # If present, Concise etc will display the value with a 'FOO='
            # prefix. If it equals '-', then Concise will treat the bit
            # field as raw bits and not try to interpret it.
            label         => 'FOO',

            # If present, specifies the names of some defines and the
            # display labels that are used to assign meaning to particu-
            # lar integer values within the bit field; e.g. 3 is dis-
            # played as 'C'.
            enum          => [ qw(
                                 1   OPpFOO_A  A
                                 2   OPpFOO_B  B
                                 3   OPpFOO_C  C
                             )],

        };

## `%defines`

This gives the value of every `OPp` define, e.g.

        $B::Op_private::defines{OPpLVAL_INTRO} == 128;

## `%labels`

This gives the short display label for each define, as used by `B::Concise` and `perl -Dx`, e.g.

        $B::Op_private::labels{OPpLVAL_INTRO} eq 'LVINTRO';

If the label equals '-', then Concise will treat the bit as a raw bit and not try to display it symbolically.

## `%ops_using`

For each define, this gives a reference to an array of op names that use the flag.

        @ops_using_lvintro = @{ $B::Op_private::ops_using{OPp_LVAL_INTRO} };