Class: Contrast::Extension::Assess::ArrayPropagator

Inherits:
Object
  • Object
show all
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

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.cleanup_tags
    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