Class: TypeProf::Core::MAsgnBox

Inherits:
Box
  • Object
show all
Defined in:
lib/typeprof/core/graph/box.rb

Instance Attribute Summary collapse

Attributes inherited from Box

#changes, #destroyed

Instance Method Summary collapse

Methods inherited from Box

#on_type_added, #on_type_removed, #reuse, #run, #to_s

Constructor Details

#initialize(node, genv, value, lefts, rest_elem, rights) ⇒ MAsgnBox

Returns a new instance of MAsgnBox.



1048
1049
1050
1051
1052
1053
1054
1055
# File 'lib/typeprof/core/graph/box.rb', line 1048

def initialize(node, genv, value, lefts, rest_elem, rights)
  super(node)
  @value = value
  @lefts = lefts
  @rest_elem = rest_elem
  @rights = rights
  @value.add_edge(genv, self)
end

Instance Attribute Details

#leftsObject (readonly)

Returns the value of attribute lefts.



1057
1058
1059
# File 'lib/typeprof/core/graph/box.rb', line 1057

def lefts
  @lefts
end

#nodeObject (readonly)

Returns the value of attribute node.



1057
1058
1059
# File 'lib/typeprof/core/graph/box.rb', line 1057

def node
  @node
end

#rest_elemObject (readonly)

Returns the value of attribute rest_elem.



1057
1058
1059
# File 'lib/typeprof/core/graph/box.rb', line 1057

def rest_elem
  @rest_elem
end

#rightsObject (readonly)

Returns the value of attribute rights.



1057
1058
1059
# File 'lib/typeprof/core/graph/box.rb', line 1057

def rights
  @rights
end

#valueObject (readonly)

Returns the value of attribute value.



1057
1058
1059
# File 'lib/typeprof/core/graph/box.rb', line 1057

def value
  @value
end

Instance Method Details

#destroy(genv) ⇒ Object



1059
1060
1061
1062
# File 'lib/typeprof/core/graph/box.rb', line 1059

def destroy(genv)
  @value.remove_edge(genv, self) # TODO: Is this really needed?
  super(genv)
end

#retObject



1064
# File 'lib/typeprof/core/graph/box.rb', line 1064

def ret = @rhs

#run0(genv, changes) ⇒ Object



1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
# File 'lib/typeprof/core/graph/box.rb', line 1066

def run0(genv, changes)
  edges = []
  @value.each_type do |ty|
    # TODO: call to_ary?
    case ty
    when Type::Array
      edges.concat(ty.splat_assign(genv, @lefts, @rest_elem, @rights))
    else
      if @lefts.size >= 1
        edges << [Source.new(ty), @lefts[0]]
      elsif @rights.size >= 1
        edges << [Source.new(ty), @rights[0]]
      else
        edges << [Source.new(ty), @rest_elem]
      end
    end
  end
  edges.each do |src, dst|
    changes.add_edge(genv, src, dst)
  end
end