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
164 165 166 167 168 |
# File 'lib/prism/ffi.rb', line 164 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.
162 163 164 |
# File 'lib/prism/ffi.rb', line 162 def length @length end |
#pointer ⇒ Object (readonly)
Returns the value of attribute pointer.
162 163 164 |
# File 'lib/prism/ffi.rb', line 162 def pointer @pointer end |
Class Method Details
.with_file(filepath) ⇒ Object
Yields a pm_string_t pointer to the given block.
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 217 |
# File 'lib/prism/ffi.rb', line 190 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.
176 177 178 179 180 181 182 183 184 185 186 187 |
# File 'lib/prism/ffi.rb', line 176 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
170 171 172 173 |
# File 'lib/prism/ffi.rb', line 170 def read raise "should use the original String instead" if @from_string @pointer.read_string(@length) end |