class FFI_Yajl::Parser

def parse(str)

def parse(str)
  raise FFI_Yajl::ParseError, "input must be a string or IO" unless str.is_a?(String) || str.respond_to?(:read)
  # initialization that we can do in pure ruby
  yajl_opts = {}
  if @opts[:check_utf8] == false && @opts[:dont_validate_strings] == false
    raise ArgumentError, "options check_utf8 and dont_validate_strings are both false which conflict"
  end
  if @opts[:check_utf8] == true && @opts[:dont_validate_strings] == true
    raise ArgumentError, "options check_utf8 and dont_validate_strings are both true which conflict"
  end
  yajl_opts[:yajl_allow_comments] = true
  if @opts.key?(:allow_comments)
    yajl_opts[:yajl_allow_comments] = @opts[:allow_comments]
  end
  yajl_opts[:yajl_dont_validate_strings]  = (@opts[:check_utf8] == false || @opts[:dont_validate_strings])
  yajl_opts[:yajl_allow_trailing_garbage] = @opts[:allow_trailing_garbage]
  yajl_opts[:yajl_allow_multiple_values]  = @opts[:allow_multiple_values]
  yajl_opts[:yajl_allow_partial_values]   = @opts[:allow_partial_values]
  yajl_opts[:unique_key_checking]         = @opts[:unique_key_checking]
  # XXX: bug-compat with ruby-yajl
  return nil if str == ""
  str = str.read if str.respond_to?(:read)
  # call either the ext or ffi hook
  do_yajl_parse(str, yajl_opts)
end