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
-
SIZEOF =
# File 'lib/prism/ffi.rb', line 159LibRubyParser.pm_string_sizeof
Class Method Summary
- .new(pointer, length, from_string) ⇒ PrismString constructor
-
.with_file(filepath)
Yields a pm_string_t pointer to the given block.
-
.with_string(string)
Yields a pm_string_t pointer to the given block.
Instance Attribute Summary
Instance Method Summary
Constructor Details
.new(pointer, length, from_string) ⇒ PrismString
Class Method Details
.with_file(filepath)
Yields a pm_string_t pointer to the given block.
# 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.
# 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