Commit a7620b0d authored by Samuel Giddins's avatar Samuel Giddins

Fix memoization for array settings

parent 391ff4aa
...@@ -98,15 +98,17 @@ module Pod ...@@ -98,15 +98,17 @@ module Pod
dup_before_freeze = frozen && (from_pod_targets_to_link || from_search_paths_aggregate_targets || uniqued || sorted) dup_before_freeze = frozen && (from_pod_targets_to_link || from_search_paths_aggregate_targets || uniqued || sorted)
define_method(method_name) do define_method(method_name) do
retval =
if memoized if memoized
@__memoized ||= {} @__memoized ||= {}
@__memoized.fetch(memoized_key) { @__memoized[memoized_key] = send(raw_method_name) } retval = @__memoized.fetch(memoized_key, :not_found)
else return retval if :not_found != retval
send(raw_method_name)
end end
return if retval.nil? retval = send(raw_method_name)
if retval.nil?
@__memoized[memoized_key] = retval if memoized
return
end
retval = retval.dup if dup_before_freeze && retval.frozen? retval = retval.dup if dup_before_freeze && retval.frozen?
...@@ -118,6 +120,8 @@ module Pod ...@@ -118,6 +120,8 @@ module Pod
retval.sort! if sorted retval.sort! if sorted
retval.freeze if frozen retval.freeze if frozen
@__memoized[memoized_key] = retval if memoized
retval retval
end end
end end
......
...@@ -11,6 +11,37 @@ module Pod ...@@ -11,6 +11,37 @@ module Pod
BuildSettings::Aggregate.new(aggregate_target, configuration_name) BuildSettings::Aggregate.new(aggregate_target, configuration_name)
end end
describe 'memoization' do
it 'memoizes methods when requested' do
cls = Class.new(BuildSettings) do
define_build_settings_method :foobar, :memoized => true do
Object.new
end
end
settings = cls.new(stub('Target'))
object = settings.foobar
object.should.be.frozen
object.should.equal?(settings.foobar)
end
it 'memoizes array methods when requested' do
cls = Class.new(BuildSettings) do
define_build_settings_method :foobar, :memoized => true, :sorted => true, :uniqued => true do
%w(b a c a)
end
end
settings = cls.new(stub('Target'))
object = settings.foobar
object.should.be.frozen
object.should == %w(a b c)
object.should.equal?(settings.foobar)
end
end
#---------------------------------------------------------------------# #---------------------------------------------------------------------#
describe '::add_developers_frameworks_if_needed' do describe '::add_developers_frameworks_if_needed' do
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment