Sha256: cb993dd9243e1c7ab4a408b75ad26cb73e196aeea0cb81f4494a485a175f42a2

Contents?: true

Size: 1.58 KB

Versions: 6

Compression:

Stored size: 1.58 KB

Contents

# frozen_string_literal: true

module Orthoses
  class CallTracer
    module Capturable
      module ExtractRestParameters
        def __extract_rest_parameters__(*rest, **kw_rest, &block)
          {
            :* => rest,
            :** => kw_rest,
            :& => block,
            :"..." => [rest, kw_rest, block]
          }
        end
      end

      def build_capture(tp)
        Capture.new(
          method: build_method(tp),
          argument: build_argument(tp),
        )
      end

      private

      def build_method(tp)
        METHOD_METHOD.bind(tp.self).call(tp.method_id)
      end

      def build_argument(tp)
        has_unnamed_parameters = false
        tp.parameters.each_with_object({}) do |op_name, hash|
          name = op_name[1]
          case name
          when :*, :**, :&, nil
            has_unnamed_parameters = true
          else
            hash[name] = tp.binding.local_variable_get(name).then do |var|
              case var
              when Module, Thread::Backtrace::Location, IO, Encoding
                var
              else
                var.dup
              end
            rescue => err
              warn("#{var.class}#dup failed with #{err.class}:#{err.message}")
              var
            end
          end
        end.tap do |hash|
          if has_unnamed_parameters
            tp.binding.eval("extend ::Orthoses::CallTracer::Capturable::ExtractRestParameters")
            unnamed_parameters = tp.binding.eval("__extract_rest_parameters__(...)")
            hash.merge!(unnamed_parameters)
          end
        end
      end
    end
  end
end

Version data entries

6 entries across 6 versions & 1 rubygems

Version Path
orthoses-1.18.0 lib/orthoses/call_tracer/capturable.rb
orthoses-1.17.0 lib/orthoses/call_tracer/capturable.rb
orthoses-1.16.0 lib/orthoses/call_tracer/capturable.rb
orthoses-1.15.0 lib/orthoses/call_tracer/capturable.rb
orthoses-1.14.0 lib/orthoses/call_tracer/capturable.rb
orthoses-1.13.0 lib/orthoses/call_tracer/capturable.rb