# File lib/sass/script/funcall.rb, line 92
      def _perform(environment)
        args = @args.map {|a| a.perform(environment)}
        splat = @splat.perform(environment) if @splat
        if fn = environment.function(@name)
          keywords = Sass::Util.map_hash(@keywords) {|k, v| [k, v.perform(environment)]}
          return perform_sass_fn(fn, args, keywords, splat)
        end

        ruby_name = @name.tr('-', '_')
        args = construct_ruby_args(ruby_name, args, splat, environment)

        unless Functions.callable?(ruby_name)
          opts(to_literal(args))
        else
          opts(Functions::EvaluationContext.new(environment.options).send(ruby_name, *args))
        end
      rescue ArgumentError => e
        # If this is a legitimate Ruby-raised argument error, re-raise it.
        # Otherwise, it's an error in the user's stylesheet, so wrap it.
        if e.message =~ /^wrong number of arguments \(\d+ for \d+\)/ &&
            e.backtrace[0] !~ /:in `(block in )?#{ruby_name}'$/ &&
            # JRuby (as of 1.6.7.2) doesn't put the actual method for
            # which the argument error was thrown in the backtrace, so
            # we detect whether our send threw an argument error.
            (RUBY_PLATFORM !~ /java/ || e.backtrace[0] !~ /:in `send'$/ ||
             e.backtrace[1] !~ /:in `_perform'$/)
          raise e
        end
        raise Sass::SyntaxError.new("#{e.message} for `#{name}'")
      end