Class: Contrast::Extension::Assess::ArrayPropagator
- Extended by:
- Components::Scope::InstanceMethods
- Defined in:
- lib/contrast/extension/assess/array.rb,
ext/cs__assess_array/cs__assess_array.c
Overview
This is our patch of the Array class required to handle propagation Disclaimer: there may be a better way, but we’re in a ‘get it work’ state. Hopefully, we’ll be in a ‘get it right’ state soon.
Class Method Summary collapse
-
.cs__track_join(ary, separator, ret) ⇒ Object
When you call join, they use an internal thing, so there’s no good way to get at the thing being returned.
Methods included from Components::Scope::InstanceMethods
contrast_enter_method_scopes!, contrast_exit_method_scopes!, with_app_scope, with_contrast_scope, with_deserialization_scope, with_split_scope
Class Method Details
.cs__track_join(ary, separator, ret) ⇒ Object
When you call join, they use an internal thing, so there’s no good way to get at the thing being returned. Multiple Strings are appended with the #join method. Because that operation happens in C, we have to do it here rather than rely on the patch of our String append or concat methods.
37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
# File 'lib/contrast/extension/assess/array.rb', line 37 def cs__track_join ary, separator, ret return ret unless ary&.any? { |element| Contrast::Agent::Assess::Tracker.tracked?(element) } return ret if Contrast::Agent::Patching::Policy::Patch.skip_assess_analysis? with_contrast_scope do return ret unless (properties = Contrast::Agent::Assess::Tracker.properties!(ret)) shift = 0 separator_length = separator.nil? ? 0 : separator.to_s.length parent_events = [] ary.compact.each do |obj| properties.copy_from(obj, ret, shift) shift += obj.to_s.length parent_event = Contrast::Agent::Assess::Tracker.properties(obj)&.event parent_events << parent_event if parent_event shift += separator_length end return ret unless Contrast::Agent::Assess::Tracker.tracked?(ret) properties. event_data = Contrast::Agent::Assess::Events::EventData.new(ARRAY_JOIN_NODE, ret, ary, ret, [separator]) properties.build_event(event_data) properties.event.instance_variable_set(:@_parent_events, parent_events) ret end end |