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
message = e.message
if Sass::Util.rbx?
if e.message =~ /^method '([^']+)': given (\d+), expected (\d+)/
error_name, given, expected = $1, $2, $3
raise e if error_name != ruby_name || e.backtrace[0] !~ /:in `_perform'$/
message = "wrong number of arguments (#{given} for #{expected})"
end
elsif Sass::Util.jruby?
if Sass::Util.jruby1_6?
should_maybe_raise = e.message =~ /^wrong number of arguments \((\d+) for (\d+)\)/ &&
e.backtrace[0] !~ /:in `(block in )?#{ruby_name}'$/
else
should_maybe_raise = e.message =~ /^wrong number of arguments calling `[^`]+` \((\d+) for (\d+)\)/
given, expected = $1, $2
end
if should_maybe_raise
trace = e.backtrace.dup
raise e if !Sass::Util.jruby1_6? && trace.shift !~ /:in `__send__'$/
if !(trace[0] =~ /:in `send'$/ && trace[1] =~ /:in `_perform'$/)
raise e
elsif !Sass::Util.jruby1_6?
message = "wrong number of arguments (#{given} for #{expected})"
end
end
elsif e.message =~ /^wrong number of arguments \(\d+ for \d+\)/ &&
e.backtrace[0] !~ /:in `(block in )?#{ruby_name}'$/
raise e
end
raise Sass::SyntaxError.new("#{message} for `#{name}'")
end