class TypeProf::Type::Hash::Elements

Attributes

map_tys[R]

Public Class Methods

dummy_elements() click to toggle source
# File typeprof-0.21.11/lib/typeprof/container-type.rb, line 625
def self.dummy_elements
  Elements.new({Type.any => Type.any})
end
new(map_tys) click to toggle source
# File typeprof-0.21.11/lib/typeprof/container-type.rb, line 613
def initialize(map_tys)
  map_tys.each do |k_ty, v_ty|
    raise unless k_ty.is_a?(Type)
    raise unless v_ty.is_a?(Type)
    raise if k_ty.is_a?(Type::Union)
    raise if k_ty.is_a?(Type::Local)
    raise if k_ty.is_a?(Type::Array)
    raise if k_ty.is_a?(Type::Hash)
  end
  @map_tys = map_tys
end

Public Instance Methods

[](key_ty) click to toggle source
# File typeprof-0.21.11/lib/typeprof/container-type.rb, line 762
def [](key_ty)
  val_ty = Type.bot
  @map_tys.each do |k_ty, v_ty|
    if Type.match?(k_ty, key_ty)
      val_ty = val_ty.union(v_ty)
    end
  end
  val_ty
end
each_free_type_variable(&blk) click to toggle source
# File typeprof-0.21.11/lib/typeprof/container-type.rb, line 727
def each_free_type_variable(&blk)
  @map_tys.each do |k, v|
    k.each_free_type_variable(&blk)
    v.each_free_type_variable(&blk)
  end
end
globalize(env, visited, depth) click to toggle source
# File typeprof-0.21.11/lib/typeprof/container-type.rb, line 635
def globalize(env, visited, depth)
  map_tys = {}
  @map_tys.each do |k_ty, v_ty|
    v_ty = v_ty.globalize(env, visited, depth)
    if map_tys[k_ty]
      map_tys[k_ty] = map_tys[k_ty].union(v_ty)
    else
      map_tys[k_ty] = v_ty
    end
  end
  Elements.new(map_tys)
end
include_untyped?(scratch) click to toggle source
# File typeprof-0.21.11/lib/typeprof/container-type.rb, line 820
def include_untyped?(scratch)
  @map_tys.each do |key, val|
    return true if key.include_untyped?(scratch)
    return true if val.include_untyped?(scratch)
  end
  false
end
limit_size(limit) click to toggle source
# File typeprof-0.21.11/lib/typeprof/container-type.rb, line 657
def limit_size(limit)
  map_tys = {}
  @map_tys.each do |k_ty, v_ty|
    k_ty = k_ty.limit_size(limit)
    v_ty = v_ty.limit_size(limit)
    if map_tys[k_ty]
      map_tys[k_ty] = map_tys[k_ty].union(v_ty)
    else
      map_tys[k_ty] = v_ty
    end
  end
  Elements.new(map_tys)
end
localize(env, alloc_site, depth) click to toggle source
# File typeprof-0.21.11/lib/typeprof/container-type.rb, line 648
def localize(env, alloc_site, depth)
  map_tys = @map_tys.to_h do |k_ty, v_ty|
    alloc_site2 = alloc_site.add_id(k_ty)
    env, v_ty = v_ty.localize(env, alloc_site2, depth)
    [k_ty, v_ty]
  end
  return env, Elements.new(map_tys)
end
match?(other) click to toggle source
# File typeprof-0.21.11/lib/typeprof/container-type.rb, line 707
def match?(other)
  subst = nil
  other.map_tys.each do |k1, v1|
    subst2 = nil
    @map_tys.each do |k0, v0|
      subst3 = Type.match?(k0, k1)
      if subst3
        subst4 = Type.match?(v0, v1)
        if subst4
          subst2 = Type.merge_substitution(subst2, subst3)
          subst2 = Type.merge_substitution(subst2, subst4)
        end
      end
    end
    return nil unless subst2
    subst = Type.merge_substitution(subst, subst2)
  end
  subst
end
pretty_print(q) click to toggle source
# File typeprof-0.21.11/lib/typeprof/container-type.rb, line 692
def pretty_print(q)
  q.group(9, "Elements[", "]") do
    q.seplist(@map_tys) do |k_ty, v_ty|
      q.group do
        q.pp k_ty
        q.text '=>'
        q.group(1) do
          q.breakable ''
          q.pp v_ty
        end
      end
    end
  end
end
screen_name(scratch) click to toggle source
# File typeprof-0.21.11/lib/typeprof/container-type.rb, line 671
def screen_name(scratch)
  if !@map_tys.empty? && @map_tys.all? {|k_ty,| k_ty.is_a?(Type::Symbol) }
    s = @map_tys.map do |k_ty, v_ty|
      v = v_ty.screen_name(scratch)
      "#{ k_ty.sym }: #{ v }"
    end.join(", ")
    "{#{ s }}"
  else
    k_ty = v_ty = Type.bot
    @map_tys.each do |k, v|
      k_ty = k_ty.union(k)
      v_ty = v_ty.union(v)
    end
    k_ty = Type.any if k_ty == Type.bot
    v_ty = Type.any if v_ty == Type.bot
    k_ty = k_ty.screen_name(scratch)
    v_ty = v_ty.screen_name(scratch)
    "Hash[#{ k_ty }, #{ v_ty }]"
  end
end
squash() click to toggle source
# File typeprof-0.21.11/lib/typeprof/container-type.rb, line 753
def squash
  all_k_ty, all_v_ty = Type.bot, Type.bot
  @map_tys.each do |k_ty, v_ty|
    all_k_ty = all_k_ty.union(k_ty)
    all_v_ty = all_v_ty.union(v_ty)
  end
  return all_k_ty, all_v_ty
end
substitute(subst, depth) click to toggle source
# File typeprof-0.21.11/lib/typeprof/container-type.rb, line 734
def substitute(subst, depth)
  map_tys = {}
  @map_tys.each do |k_ty_orig, v_ty_orig|
    k_ty = k_ty_orig.substitute(subst, depth)
    v_ty = v_ty_orig.substitute(subst, depth)
    k_ty.each_child_global do |k_ty|
      # This is a temporal hack to mitigate type explosion
      k_ty = Type.any if k_ty.is_a?(Type::Array)
      k_ty = Type.any if k_ty.is_a?(Type::Hash)
      if map_tys[k_ty]
        map_tys[k_ty] = map_tys[k_ty].union(v_ty)
      else
        map_tys[k_ty] = v_ty
      end
    end
  end
  Elements.new(map_tys)
end
to_keywords() click to toggle source
# File typeprof-0.21.11/lib/typeprof/container-type.rb, line 804
def to_keywords
  kw_tys = {}
  @map_tys.each do |key_ty, val_ty|
    if key_ty.is_a?(Type::Symbol)
      kw_tys[key_ty.sym] = val_ty
    else
      all_val_ty = Type.bot
      @map_tys.each do |_key_ty, val_ty|
        all_val_ty = all_val_ty.union(val_ty)
      end
      return { nil => all_val_ty }
    end
  end
  kw_tys
end
to_local_type(id, base_ty) click to toggle source
# File typeprof-0.21.11/lib/typeprof/container-type.rb, line 631
def to_local_type(id, base_ty)
  Type::Local.new(Hash, id, base_ty)
end
union(other) click to toggle source
# File typeprof-0.21.11/lib/typeprof/container-type.rb, line 788
def union(other)
  return self if self == other
  raise "Array::Elements merge Hash::Elements" if other.is_a?(Array::Elements)

  map_tys = @map_tys.dup
  other.map_tys.each do |k_ty, v_ty|
    if map_tys[k_ty]
      map_tys[k_ty] = map_tys[k_ty].union(v_ty)
    else
      map_tys[k_ty] = v_ty
    end
  end

  Elements.new(map_tys)
end
update(idx, ty) click to toggle source
# File typeprof-0.21.11/lib/typeprof/container-type.rb, line 772
def update(idx, ty)
  map_tys = @map_tys.dup
  idx.each_child_global do |idx|
    # This is a temporal hack to mitigate type explosion
    idx = Type.any if idx.is_a?(Type::Array)
    idx = Type.any if idx.is_a?(Type::Hash)

    if map_tys[idx]
      map_tys[idx] = map_tys[idx].union(ty)
    else
      map_tys[idx] = ty
    end
  end
  Elements.new(map_tys)
end