Class: Contrast::Agent::Assess::PreShift

Inherits:
Object
  • Object
show all
Includes:
Components::Interface
Defined in:
lib/contrast/agent/assess/policy/preshift.rb,
ext/cs__contrast_patch/cs__contrast_patch.c

Overview

In order to properly shift tags to account for the changes this method caused, we’ll need to store the state before the change occurred.

Constant Summary collapse

UNDUPLICABLE_MODULES =
[
  Enumerator # dup'ing results in 'can't copy execution context'
].cs__freeze

Instance Attribute Summary collapse

Class Method Summary collapse

Methods included from Components::Interface

included

Instance Attribute Details

#arg_lengthsObject

Returns the value of attribute arg_lengths.



19
20
21
# File 'lib/contrast/agent/assess/policy/preshift.rb', line 19

def arg_lengths
  @arg_lengths
end

#argsObject

Returns the value of attribute args.



19
20
21
# File 'lib/contrast/agent/assess/policy/preshift.rb', line 19

def args
  @args
end

#objectObject

Returns the value of attribute object.



19
20
21
# File 'lib/contrast/agent/assess/policy/preshift.rb', line 19

def object
  @object
end

#object_lengthObject

Returns the value of attribute object_length.



19
20
21
# File 'lib/contrast/agent/assess/policy/preshift.rb', line 19

def object_length
  @object_length
end

Class Method Details

.build_preshift(propagation_node, object, args) ⇒ Contrast::Agent::Assess::PreShift?

Save the state before we do the propagation. This is one of the few things that we’ll call BEFORE calling the original method. Unfortunately, we may waste some time here if the method then throws an exception, but hey, it threw an exception. These few extra objects aren’t the real problem in that case.

Parameters:

Returns:

  • (Contrast::Agent::Assess::PreShift, nil)

    a holder saving the state of the object and arguments just prior to the method being called or nil if one is not required.



38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/contrast/agent/assess/policy/preshift.rb', line 38

def build_preshift propagation_node, object, args
  return nil unless propagation_node
  return nil unless ASSESS.enabled?

  initializing = propagation_node.method_name == :initialize
  return nil if unsafe_io_object?(object, initializing)

  needs_object = propagation_node.needs_object?
  needs_args = propagation_node.needs_args?

  preshift = Contrast::Agent::Assess::PreShift.new
  append_object_details(preshift, initializing, object) if needs_object
  append_arg_details(preshift, args) if needs_args

  preshift
rescue StandardError => e
  logger.error('Unable to build preshift for method.', e)
  nil
end