FFI::ClangSourceFFIClangCursorOverriddenCursors

class OverriddenCursors

Represents the set of cursors overridden by a method. Calls clang_getOverriddenCursors, copies each CXCursor into Ruby-managed memory, then immediately disposes the buffer via clang_disposeOverriddenCursors. This avoids GC-order issues with AutoPointer where the buffer could be double-freed.

Definitions

attr_reader :size

Signature

attribute r

size

returns Integer

The number of overridden cursors.

def initialize(cursor, translation_unit)

Initialize overridden cursors for a given cursor.

Signature

parameter cursor Lib::CXCursor

The cursor to query.

parameter translation_unit TranslationUnit

The parent translation unit.

Implementation

def initialize(cursor, translation_unit)
	cursor_ptr = FFI::MemoryPointer.new :pointer
	num_ptr = FFI::MemoryPointer.new :uint
	Lib.get_overridden_cursors(cursor, cursor_ptr, num_ptr)
	
	@size = num_ptr.get_uint(0)
	
	if @size > 0
		buffer = cursor_ptr.get_pointer(0)
		
		# Dup each CXCursor into Ruby-managed memory before
		# disposing the buffer. Using an AutoPointer to defer
		# disposal causes double-free crashes on Linux and MacOS
		# (not windows) for unknown reasons.
		cur_ptr = buffer
		@cursors = @size.times.map do
			cursor = Lib::CXCursor.new(cur_ptr).dup
			cur_ptr += Lib::CXCursor.size
			Cursor.new(cursor, translation_unit)
		end
		
		Lib.dispose_overridden_cursors(buffer)
	else
		@cursors = []
	end
end

def each(&block)

Iterate over each overridden cursor.

Signature

yields {|cursor| ...}

Each overridden cursor.

parameter cursor Cursor

The overridden cursor.

returns Enumerator

If no block is given.

Implementation

def each(&block)
	return to_enum(__method__) unless block_given?
	
	@cursors.each(&block)
	
	self
end