All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.opalj.br.instructions.IFNONNULL.scala Maven / Gradle / Ivy

The newest version!
/* BSD 2-Clause License - see OPAL/LICENSE for details. */
package org.opalj
package br
package instructions

/**
 * Branch if reference is not null.
 *
 * @author Michael Eichberg
 */
trait IFNONNULLLike extends IFXNullInstructionLike {

    final def opcode: Opcode = IFNONNULL.opcode

    final def mnemonic: String = "ifnonnull"

    final def operator: String = "!= null"

    final def condition: RelationalOperator = RelationalOperators.NE
}

case class IFNONNULL(branchoffset: Int) extends IFXNullInstruction[IFNONNULL] with IFNONNULLLike {

    def copy(branchoffset: Int): IFNONNULL = new IFNONNULL(branchoffset)

    def negate(newBranchoffset: Int = branchoffset): IFNULL = {
        IFNULL(newBranchoffset)
    }

    def toLabeledInstruction(currentPC: PC): LabeledInstruction = {
        LabeledIFNONNULL(InstructionLabel(currentPC + branchoffset))
    }
}

/**
 * Defines constants and factory methods.
 *
 * @author Malte Limmeroth
 */
object IFNONNULL extends InstructionMetaInformation {

    final val opcode = 199

    /**
     * Creates [[LabeledIFNONNULL]] instructions with a `Symbol` as the branch target.
     */
    def apply(branchTarget: InstructionLabel): LabeledIFNONNULL = LabeledIFNONNULL(branchTarget)

}

case class LabeledIFNONNULL(
        branchTarget: InstructionLabel
) extends LabeledSimpleConditionalBranchInstruction
    with IFNONNULLLike {

    @throws[BranchoffsetOutOfBoundsException]("if the branchoffset is invalid")
    override def resolveJumpTargets(pc: PC, pcs: Map[InstructionLabel, PC]): IFNONNULL = {
        IFNONNULL(asShortBranchoffset(pcs(branchTarget) - pc))
    }

    override def negate(newJumpTargetLabel: InstructionLabel): LabeledIFNULL = {
        LabeledIFNULL(newJumpTargetLabel)
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy