def _perform(environment)
      args = @args.each_with_index.
        map {|a, i| perform_arg(a, environment, signature && signature.args[i])}
      keywords = Sass::Util.map_hash(@keywords) do |k, v|
        [k, perform_arg(v, environment, k.tr('-', '_'))]
      end
      splat = Sass::Tree::Visitors::Perform.perform_splat(
        @splat, keywords, @kwarg_splat, environment)

      fn = @callable || environment.function(@name)

      if fn && fn.origin == :stylesheet
        environment.stack.with_function(filename, line, name) do
          return without_original(perform_sass_fn(fn, args, splat, environment))
        end
      end

      args = construct_ruby_args(ruby_name, args, splat, environment)

      if Sass::Script::Functions.callable?(ruby_name) && (!fn || fn.origin == :builtin)
        local_environment = Sass::Environment.new(environment.global_env, environment.options)
        local_environment.caller = Sass::ReadOnlyEnvironment.new(environment, environment.options)
        result = local_environment.stack.with_function(filename, line, name) do
          opts(Sass::Script::Functions::EvaluationContext.new(
            local_environment).send(ruby_name, *args))
        end
        without_original(result)
      else
        opts(to_literal(args))
      end
    rescue ArgumentError => e
      reformat_argument_error(e)
    end
def _perform(environment)
      args = @args.each_with_index.
        map {|a, i| perform_arg(a, environment, signature && signature.args[i])}
      keywords = Sass::Util.map_hash(@keywords) do |k, v|
        [k, perform_arg(v, environment, k.tr('-', '_'))]
      end
      splat = Sass::Tree::Visitors::Perform.perform_splat(
        @splat, keywords, @kwarg_splat, environment)

      fn = @callable || environment.function(@name)

      if fn && fn.origin == :stylesheet
        environment.stack.with_function(filename, line, name) do
          return without_original(perform_sass_fn(fn, args, splat, environment))
        end
      end

      args = construct_ruby_args(ruby_name, args, splat, environment)

      if Sass::Script::Functions.callable?(ruby_name) && (!fn || fn.origin == :builtin)
        local_environment = Sass::Environment.new(environment.global_env, environment.options)
        local_environment.caller = Sass::ReadOnlyEnvironment.new(environment, environment.options)
        result = local_environment.stack.with_function(filename, line, name) do
          opts(Sass::Script::Functions::EvaluationContext.new(
            local_environment).send(ruby_name, *args))
        end
        without_original(result)
      else
        opts(to_literal(args))
      end
    rescue ArgumentError => e
      reformat_argument_error(e)
    end
Evaluates the function call.

 @param environment [Sass::Environment] The environment in which to evaluate the SassScript
 @return [Sass::Script::Value] The SassScript object that is the value of the function call
 @raise [Sass::SyntaxError] if the function call raises an ArgumentError