Module: GirFFI::Builder::ReturnValueFactory

Defined in:
lib/gir_ffi/builder/argument.rb

Class Method Summary collapse

Class Method Details

.build(var_gen, arginfo) ⇒ Object



356
357
358
359
360
361
# File 'lib/gir_ffi/builder/argument.rb', line 356

def self.build var_gen, arginfo
  builder_for(var_gen,
              arginfo.name,
              arginfo.return_type,
              arginfo.constructor?)
end

.builder_for(var_gen, name, type, is_constructor) ⇒ Object



363
364
365
366
367
368
369
370
371
372
373
374
375
# File 'lib/gir_ffi/builder/argument.rb', line 363

def self.builder_for var_gen, name, type, is_constructor
  if type.tag == :interface and
    [:interface, :object].include? type.interface.info_type
    klass = if is_constructor
              ConstructorReturnValue
            else
              ObjectReturnValue
            end
    klass.new var_gen, name, type
  else
    builder_for_field_getter var_gen, name, type
  end
end

.builder_for_field_getter(var_gen, name, type) ⇒ Object



377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
# File 'lib/gir_ffi/builder/argument.rb', line 377

def self.builder_for_field_getter var_gen, name, type
  klass = case type.tag
          when :void
            if type.pointer?
              RegularReturnValue
            else
              VoidReturnValue
            end
          when :interface
            case type.interface.info_type
            when :struct, :union, :interface, :object
              InterfaceReturnValue
            else
              RegularReturnValue
            end
          when :array
            if type.zero_terminated?
              StrvReturnValue
            else
              case type.array_type
              when :c
                CArrayReturnValue
              when :array
                it = ReturnValue.new var_gen, name, type
                it.extend WithTypedContainerPostMethod
                return it
              when :byte_array
                ByteArrayReturnValue
              else
                PtrArrayReturnValue
              end
            end
          when :glist, :gslist
            it = ReturnValue.new var_gen, name, type
            it.extend WithTypedContainerPostMethod
            return it
          when :ghash
            it = ReturnValue.new var_gen, name, type
            it.extend WithTypedContainerPostMethod
            return it
          when :utf8
            Utf8ReturnValue
          else
            RegularReturnValue
          end
  klass.new var_gen, name, type
end