Class: Prism::LibRubyParser::PrismString
- Inherits:
-
Object
- Object
- Prism::LibRubyParser::PrismString
- 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 collapse
- SIZEOF =
:nodoc:
LibRubyParser.pm_string_sizeof
- PLATFORM_EXPECTS_UTF8 =
RbConfig::CONFIG["host_os"].match?(/bccwin|cygwin|djgpp|mingw|mswin|wince|darwin/i)
Instance Attribute Summary collapse
-
#length ⇒ Object
readonly
Returns the value of attribute length.
-
#pointer ⇒ Object
readonly
Returns the value of attribute pointer.
Class Method Summary collapse
-
.with_file(filepath) ⇒ Object
Yields a pm_string_t pointer to the given block.
-
.with_string(string) ⇒ Object
Yields a pm_string_t pointer to the given block.
Instance Method Summary collapse
-
#initialize(pointer, length, from_string) ⇒ PrismString
constructor
A new instance of PrismString.
- #read ⇒ Object
Constructor Details
#initialize(pointer, length, from_string) ⇒ PrismString
Returns a new instance of PrismString.
173 174 175 176 177 |
# File 'lib/prism/ffi.rb', line 173 def initialize(pointer, length, from_string) @pointer = pointer @length = length @from_string = from_string end |
Instance Attribute Details
#length ⇒ Object (readonly)
Returns the value of attribute length.
171 172 173 |
# File 'lib/prism/ffi.rb', line 171 def length @length end |
#pointer ⇒ Object (readonly)
Returns the value of attribute pointer.
171 172 173 |
# File 'lib/prism/ffi.rb', line 171 def pointer @pointer end |
Class Method Details
.with_file(filepath) ⇒ Object
Yields a pm_string_t pointer to the given block.
199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 |
# File 'lib/prism/ffi.rb', line 199 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 PLATFORM_EXPECTS_UTF8 && (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) ⇒ Object
Yields a pm_string_t pointer to the given block.
185 186 187 188 189 190 191 192 193 194 195 196 |
# File 'lib/prism/ffi.rb', line 185 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 Method Details
#read ⇒ Object
179 180 181 182 |
# File 'lib/prism/ffi.rb', line 179 def read raise "should use the original String instead" if @from_string @pointer.read_string(@length) end |