Sha256: c98e46dc6e11914f42c27f56fd8bb7bad80036b0776c68d1269dd29d4b3762bc

Contents?: true

Size: 1.33 KB

Versions: 1

Compression:

Stored size: 1.33 KB

Contents

module Furnace
  module CFG
    class Graph
      attr_reader :nodes, :edges

      def initialize
        @nodes = Set.new
        @edges = Set.new

        @pending_label      = nil
        @pending_operations = []
      end

      def find_node(label)
        if node = @nodes.find { |n| n.label == label }
          node
        else
          raise "Cannot find CFG node #{label}"
        end
      end

      def expand(label, operation)
        @pending_label ||= label
        @pending_operations << operation
      end

      def transfer(targets)
        return unless @pending_label

        @nodes << CFG::Node.new(self, @pending_label, @pending_operations)

        targets.each do |operation, target|
          @edges << CFG::Edge.new(self, operation, @pending_label, target)
        end

        @pending_label      = nil
        @pending_operations = []
      end

      def to_graphviz
        Graphviz.new do |graph|
          @nodes.each do |node|
            graph.node node.label, node.operations.map(&:inspect).join("\n")
          end

          @edges.each do |edge|
            if edge.source_operation.nil?
              label = "~"
            else
              label = edge.source_operation
            end

            graph.edge edge.source_label, edge.target_label, label
          end
        end
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
furnace-0.0.1 lib/furnace/cfg/graph.rb