27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
|
# File 'lib/engine/metal/metal_bindings.rb', line 27
def self.msg(obj, selector, *args)
sel_ptr = sel(selector)
arg_types = [Fiddle::TYPE_VOIDP, Fiddle::TYPE_VOIDP]
call_args = [obj, sel_ptr]
args.each do |arg|
case arg
when Integer
arg_types << Fiddle::TYPE_LONG
call_args << arg
when Float
arg_types << Fiddle::TYPE_DOUBLE
call_args << arg
when String
arg_types << Fiddle::TYPE_VOIDP
call_args << Fiddle::Pointer[arg]
when Fiddle::Pointer
arg_types << Fiddle::TYPE_VOIDP
call_args << arg
when nil
arg_types << Fiddle::TYPE_VOIDP
call_args << Fiddle::Pointer.new(0)
else
arg_types << Fiddle::TYPE_VOIDP
call_args << arg
end
end
func = Fiddle::Function.new(OBJC_MSGSEND_ADDR, arg_types, Fiddle::TYPE_VOIDP)
result = func.call(*call_args)
Fiddle::Pointer.new(result)
end
|