123456789_123456789_123456789_123456789_123456789_

Class: Prism::LibRubyParser::PrismString

Do not use. This class is for internal use only.
Relationships & Source Files
Inherits: Object
Defined in: lib/prism/ffi.rb

Overview

This object represents a pm_string_t. We only use it as an opaque pointer, so it doesn’t have to be an FFI::Struct.

Constant Summary

Class Method Summary

Instance Attribute Summary

Instance Method Summary

Constructor Details

.new(pointer, length, from_string) ⇒ PrismString

[ GitHub ]

  
# File 'lib/prism/ffi.rb', line 163

def initialize(pointer, length, from_string)
  @pointer = pointer
  @length = length
  @from_string = from_string
end

Class Method Details

.with_file(filepath)

Yields a pm_string_t pointer to the given block.

Raises:

  • (TypeError)
[ GitHub ]

  
# File 'lib/prism/ffi.rb', line 189

def self.with_file(filepath)
  raise TypeError unless filepath.is_a?(String)

  # On Windows and Mac, it's expected that filepaths will be encoded in
  # UTF-8. If they are not, we need to convert them to UTF-8 before
  # passing them into pm_string_mapped_init.
  if RbConfig::CONFIG["host_os"].match?(/bccwin|cygwin|djgpp|mingw|mswin|wince|darwin/i) &&
     (encoding = filepath.encoding) != Encoding::ASCII_8BIT && encoding != Encoding::UTF_8
    filepath = filepath.encode(Encoding::UTF_8)
  end

  FFI::MemoryPointer.new(SIZEOF) do |pm_string|
    case (result = LibRubyParser.pm_string_mapped_init(pm_string, filepath))
    when :PM_STRING_INIT_SUCCESS
      pointer = LibRubyParser.pm_string_source(pm_string)
      length = LibRubyParser.pm_string_length(pm_string)
      return yield new(pointer, length, false)
    when :PM_STRING_INIT_ERROR_GENERIC
      raise SystemCallError.new(filepath, FFI.errno)
    when :PM_STRING_INIT_ERROR_DIRECTORY
      raise Errno::EISDIR.new(filepath)
    else
      raise "Unknown error initializing pm_string_t: #{result.inspect}"
    end
  ensure
    LibRubyParser.pm_string_free(pm_string)
  end
end

.with_string(string)

Yields a pm_string_t pointer to the given block.

Raises:

  • (TypeError)
[ GitHub ]

  
# File 'lib/prism/ffi.rb', line 175

def self.with_string(string)
  raise TypeError unless string.is_a?(String)

  length = string.bytesize
  # + 1 to never get an address of 0, which pm_parser_init() asserts
  FFI::MemoryPointer.new(:char, length + 1, false) do |pointer|
    pointer.write_string(string)
    # since we have the extra byte we might as well \0-terminate
    pointer.put_char(length, 0)
    return yield new(pointer, length, true)
  end
end

Instance Attribute Details

#length (readonly)

[ GitHub ]

  
# File 'lib/prism/ffi.rb', line 161

attr_reader :pointer, :length

#pointer (readonly)

[ GitHub ]

  
# File 'lib/prism/ffi.rb', line 161

attr_reader :pointer, :length

Instance Method Details

#read

[ GitHub ]

  
# File 'lib/prism/ffi.rb', line 169

def read
  raise "should use the original String instead" if @from_string
  @pointer.read_string(@length)
end