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

org.opalj.br.collection.mutable.InstructionsBuilder.scala Maven / Gradle / Ivy

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

import org.opalj.br.instructions.Instruction
import org.opalj.br.instructions.ConstantLengthInstruction

import scala.collection.mutable.ArrayBuffer

/**
 * A buffer for creating bytecode arrays that automatically adds the required null entries.
 *
 * @author Dominik Helm
 *         @author Michael Eichberg
 */
class InstructionsBuilder private (private val buffer: ArrayBuffer[Instruction]) {

    def this(initialSize: Int) =
        this(new ArrayBuffer[Instruction](initialSize = initialSize))

    /**
     * Adds the given instruction to the buffer and adds the appropriate number of `null`
     * values to the array such that the instruction occupies exactly so many slots as
     * specified by `slots`. Hence, `slotes` has to be >= 1.
     */
    def ++=(value: Instruction, slots: Int): Unit = {
        //        if (slots > 1) buffer.ensureAdditionalCapacity(slots)
        buffer += value
        var i = 1
        while (i < slots) {
            buffer += null
            i += 1
        }
    }

    /**
     * Adds the given instruction to the buffer and adds the appropriate number of `null`
     * values to the array such that the instruction occupies exactly so many slots as
     * required by the JVM specification.
     */
    final def ++=(value: ConstantLengthInstruction): Unit = this.++=(value, value.length)

    /**
     * Adds the given instructions as is to this builder. Hence, the instructions already
     * have to use the required layout.
     */
    def ++=(instructions: Array[Instruction]): Unit = buffer ++= instructions

    /**
     * Returns the build instructions array; this builder is not to be used afterwards.
     */
    def result(): Array[Instruction] = buffer.toArray
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy