Sha256: ab92e9daebfa5f5a0f29bf617140af85a5093d42bb45315e7505b15a40e5d4b1

Contents?: true

Size: 1.85 KB

Versions: 1

Compression:

Stored size: 1.85 KB

Contents

module Furnace
  class SSA::Instruction < SSA::User
    def self.opcode
      @opcode ||= SSA.class_name_to_opcode(self)
    end

    def self.syntax(&block)
      SSA::InstructionSyntax.new(self).evaluate(&block)
    end

    attr_reader :basic_block

    def opcode
      self.class.opcode
    end

    def basic_block=(basic_block)
      if @basic_block && @basic_block != basic_block
        @basic_block.remove self
      end

      if basic_block
        self.function = basic_block.function
      end

      @basic_block = basic_block

      SSA.instrument(self)
    end

    def detach
      @basic_block = nil

      super
    end

    def remove
      @basic_block.remove self if @basic_block
    end

    def erase
      remove
      drop_references
    end

    def replace_with(value)
      replace_all_uses_with value

      if value.is_a? SSA::Instruction
        @basic_block.replace self, value
        drop_references
      else
        erase
      end
    end

    def replace_type_with(type, replacement)
    end

    def has_side_effects?
      false
    end

    def terminator?
      false
    end

    def awesome_print(p=AwesomePrinter.new)
      unless type == Type::Bottom.new
        p.nest(type).
          name(name).
          text('=')
      end

      p.keyword(opcode)

      awesome_print_parameters(p)
      awesome_print_operands(p)

      p
    end

    def awesome_print_as_value(p=AwesomePrinter.new)
      if type == Type::Bottom.new
        p.nest(type)
      else
        super
      end
    end

    def awesome_print_parameters(p=AwesomePrinter.new)
      p
    end

    def awesome_print_operands(p=AwesomePrinter.new)
      if @operands
        p.collection('', ', ', '', @operands) do |operand|
          operand.awesome_print_as_value(p)
        end
      else
        p.text('<DETACHED>')
      end
    end

    protected :function=
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
furnace-0.4.0.beta.2 lib/furnace/ssa/instruction.rb