def process_helper_method method_exp, args
method_name = method_exp.method_name
Brakeman.debug "Processing method #{method_name}"
info = @helper_method_info[method_name]
if info[:uses_ivars]
meth_env = only_ivars(:include_request_vars)
else
meth_env = only_request_vars
end
assign_args method_exp, args, meth_env
values = @helper_method_cache[method_name]
unless values
meth_values = meth_env.instance_variable_get(:@env).to_a
meth_values.sort!
meth_values = meth_values.to_s
digest = Digest::SHA1.new.update(meth_values << method_name.to_s).to_s.to_sym
values = @helper_method_cache[digest]
end
if values
values[:ivar_values].each do |var, val|
env[var] = val
end
values[:return_value]
else
frv = Brakeman::FindReturnValue.new
value = frv.get_return_value(method_exp.body_list, meth_env)
ivars = {}
only_ivars(false, meth_env).all.each do |var, val|
env[var] = val
ivars[var] = val
end
if not frv.uses_ivars? and args.length == 0
@helper_method_cache[method_exp.method_name] = { :return_value => value, :ivar_values => ivars }
else
@helper_method_cache[digest] = { :return_value => value, :ivar_values => ivars }
end
@helper_method_info[method_name] = { :uses_ivars => frv.uses_ivars? }
value
end
end