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
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.
163 164 165 166 167 |
# File 'lib/prism/ffi.rb', line 163 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.
161 162 163 |
# File 'lib/prism/ffi.rb', line 161 def length @length end |
#pointer ⇒ Object (readonly)
Returns the value of attribute pointer.
161 162 163 |
# File 'lib/prism/ffi.rb', line 161 def pointer @pointer end |
Class Method Details
.with_file(filepath) ⇒ Object
Yields a pm_string_t pointer to the given block.
189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 |
# 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) ⇒ Object
Yields a pm_string_t pointer to the given block.
175 176 177 178 179 180 181 182 183 184 185 186 |
# 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 Method Details
#read ⇒ Object
169 170 171 172 |
# File 'lib/prism/ffi.rb', line 169 def read raise "should use the original String instead" if @from_string @pointer.read_string(@length) end |