From e0b53b23d46f8467884c5c387a9081d98cb7cca7 Mon Sep 17 00:00:00 2001 From: Kevin Gilpin Date: Tue, 25 Jul 2023 15:19:49 -0400 Subject: [PATCH] fix: Guard access to the :size method Fixes #341 --- lib/appmap/value_inspector.rb | 2 +- spec/value_inspector_spec.rb | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/lib/appmap/value_inspector.rb b/lib/appmap/value_inspector.rb index 6fd67045..15a7cdde 100644 --- a/lib/appmap/value_inspector.rb +++ b/lib/appmap/value_inspector.rb @@ -7,7 +7,7 @@ module ValueInspector def detect_size(value) # Don't risk calling #size on things like data-access objects, which can and will issue queries for this information. - if value.is_a?(Array) || value.is_a?(Hash) + if (value.is_a?(Array) || value.is_a?(Hash)) && value.respond_to?(:size) value.size end end diff --git a/spec/value_inspector_spec.rb b/spec/value_inspector_spec.rb index d5b3d8c2..89fa08db 100644 --- a/spec/value_inspector_spec.rb +++ b/spec/value_inspector_spec.rb @@ -289,4 +289,22 @@ ) end end + + describe "Array that doesn't implement :size" do + it 'does not try and invoke :size' do + ary = [] + class << ary + def respond_to?(method) + return false if method.to_sym == :size + + super + end + end + + inspector = Struct.new(:id) do + include AppMap::ValueInspector + end.new + expect(inspector.detect_size(ary)).to be_nil + end + end end