class TypeProf::Env

Attributes

locals[R]
stack[R]
static_env[R]
type_params[R]

Public Class Methods

new(static_env, locals, stack, type_params) click to toggle source
# File typeprof-0.21.8/lib/typeprof/analyzer.rb, line 159
def initialize(static_env, locals, stack, type_params)
  @static_env = static_env
  @locals = locals
  @stack = stack
  @type_params = type_params
end

Public Instance Methods

deploy_type(id, elems) click to toggle source
# File typeprof-0.21.8/lib/typeprof/analyzer.rb, line 241
def deploy_type(id, elems)
  type_params = Utils::HashWrapper.new(@type_params.internal_hash.merge({ id => elems }))
  Env.new(@static_env, @locals, @stack, type_params)
end
enable_module_function() click to toggle source
# File typeprof-0.21.8/lib/typeprof/analyzer.rb, line 246
def enable_module_function
  senv = StaticEnv.new(@static_env.recv_ty, @static_env.blk_ty, true, @static_env.pub_meth)
  Env.new(senv, @locals, @stack, @type_params)
end
get_container_elem_types(id) click to toggle source
# File typeprof-0.21.8/lib/typeprof/analyzer.rb, line 237
def get_container_elem_types(id)
  @type_params.internal_hash[id]
end
get_local(idx) click to toggle source
# File typeprof-0.21.8/lib/typeprof/analyzer.rb, line 229
def get_local(idx)
  @locals[idx]
end
inspect() click to toggle source
# File typeprof-0.21.8/lib/typeprof/analyzer.rb, line 266
def inspect
  "Env[#{ @static_env.inspect }, locals:#{ @locals.inspect }, stack:#{ @stack.inspect }, type_params:#{ (@type_params&.internal_hash).inspect }]"
end
local_update(idx, ty) click to toggle source
# File typeprof-0.21.8/lib/typeprof/analyzer.rb, line 233
def local_update(idx, ty)
  Env.new(@static_env, Utils.array_update(@locals, idx, ty), @stack, @type_params)
end
merge(other) click to toggle source
# File typeprof-0.21.8/lib/typeprof/analyzer.rb, line 168
def merge(other)
  raise if @locals.size != other.locals.size
  raise if @stack.size != other.stack.size
  static_env = @static_env.merge(other.static_env)
  locals = []
  @locals.zip(other.locals) {|ty1, ty2| locals << ty1.union(ty2) }
  stack = []
  @stack.zip(other.stack) {|ty1, ty2| stack << ty1.union(ty2) }
  if @type_params
    raise if !other.type_params
    if @type_params == other.type_params
      type_params = @type_params
    else
      type_params = @type_params.internal_hash.dup
      other.type_params.internal_hash.each do |id, elems|
        elems2 = type_params[id]
        if elems2
          if elems != elems2
            type_params[id] = elems.union(elems2)
          end
        else
          type_params[id] = elems
        end
      end
      type_params = Utils::HashWrapper.new(type_params)
    end
  else
    raise if other.type_params
  end
  Env.new(static_env, locals, stack, type_params)
end
method_public_set(flag) click to toggle source
# File typeprof-0.21.8/lib/typeprof/analyzer.rb, line 251
def method_public_set(flag)
  senv = StaticEnv.new(@static_env.recv_ty, @static_env.blk_ty, @static_env.mod_func, flag)
  Env.new(senv, @locals, @stack, @type_params)
end
pop(n) click to toggle source
# File typeprof-0.21.8/lib/typeprof/analyzer.rb, line 213
def pop(n)
  stack = @stack.dup
  tys = stack.pop(n)
  nenv = Env.new(@static_env, @locals, stack, @type_params)
  return nenv, tys
end
push(*tys) click to toggle source
# File typeprof-0.21.8/lib/typeprof/analyzer.rb, line 200
def push(*tys)
  tys.each do |ty|
    raise "nil cannot be pushed to the stack" if ty.nil?
    ty.each_child do |ty|
      raise if ty.is_a?(Type::Var)
      #raise if ty.is_a?(Type::Instance) && ty.klass.type_params.size > 1
      raise "Array cannot be pushed to the stack" if ty.is_a?(Type::Array)
      raise "Hash cannot be pushed to the stack" if ty.is_a?(Type::Hash)
    end
  end
  Env.new(@static_env, @locals, @stack + tys, @type_params)
end
replace_blk_ty(ty) click to toggle source
# File typeprof-0.21.8/lib/typeprof/analyzer.rb, line 261
def replace_blk_ty(ty)
  senv = StaticEnv.new(@static_env.recv_ty, ty, @static_env.mod_func, @static_env.pub_meth)
  Env.new(senv, @locals, @stack, @type_params)
end
replace_recv_ty(ty) click to toggle source
# File typeprof-0.21.8/lib/typeprof/analyzer.rb, line 256
def replace_recv_ty(ty)
  senv = StaticEnv.new(ty, @static_env.blk_ty, @static_env.mod_func, @static_env.pub_meth)
  Env.new(senv, @locals, @stack, @type_params)
end
setn(i, ty) click to toggle source
# File typeprof-0.21.8/lib/typeprof/analyzer.rb, line 220
def setn(i, ty)
  stack = Utils.array_update(@stack, -i, ty)
  Env.new(@static_env, @locals, stack, @type_params)
end
topn(i) click to toggle source
# File typeprof-0.21.8/lib/typeprof/analyzer.rb, line 225
def topn(i)
  push(@stack[-i - 1])
end