# File typeprof-0.15.2/lib/typeprof/config.rb, line 64
def self.analyze(config)
# Deploy the config to the TypeProf::Config (Note: This is thread unsafe)
if TypeProf.const_defined?(:Config)
TypeProf.send(:remove_const, :Config)
end
TypeProf.const_set(:Config, config)
if Config.options[:stackprof]
require "stackprof"
out = "typeprof-stackprof-#{ Config.options[:stackprof] }.dump"
StackProf.start(mode: Config.options[:stackprof], out: out, raw: true)
end
scratch = Scratch.new
Builtin.setup_initial_global_env(scratch)
Config.gem_rbs_features.each do |feature|
Import.import_library(scratch, feature)
end
rbs_files = []
rbs_codes = []
Config.rbs_files.each do |rbs|
if rbs.is_a?(Array) # [String name, String content]
rbs_codes << rbs
else
rbs_files << rbs
end
end
Import.import_rbs_files(scratch, rbs_files)
rbs_codes.each do |name, content|
Import.import_rbs_code(scratch, name, content)
end
Config.rb_files.each do |rb|
if rb.is_a?(Array) # [String name, String content]
iseq = ISeq.compile_str(*rb.reverse)
else
iseq = rb
end
scratch.add_entrypoint(iseq)
end
result = scratch.type_profile
if Config.output.respond_to?(:write)
scratch.report(result, Config.output)
else
open(Config.output, "w") do |output|
scratch.report(result, output)
end
end
rescue TypeProfError => exc
exc.report(Config.output)
ensure
if Config.options[:stackprof] && defined?(StackProf)
StackProf.stop
StackProf.results
end
end
# File typeprof-0.15.2/lib/typeprof/config.rb, line 127
def self.starting_state(iseq)
cref = CRef.new(:bottom, Type::Builtin[:obj], false) # object
recv = Type::Instance.new(Type::Builtin[:obj])
ctx = Context.new(iseq, cref, nil)
ep = ExecutionPoint.new(ctx, 0, nil)
locals = [Type.nil] * iseq.locals.size
env = Env.new(StaticEnv.new(recv, Type.nil, false, false), locals, [], Utils::HashWrapper.new({}))
return ep, env
end