ffi 1.10.0 → 1.11.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +3 -0
- data/.gitmodules +2 -1
- data/.travis.yml +17 -18
- data/CHANGELOG.md +33 -0
- data/Gemfile +1 -1
- data/README.md +20 -17
- data/Rakefile +10 -83
- data/appveyor.yml +6 -1
- data/ext/ffi_c/Call.c +16 -33
- data/ext/ffi_c/Call.h +2 -5
- data/ext/ffi_c/Function.c +24 -108
- data/ext/ffi_c/Platform.c +0 -47
- data/ext/ffi_c/Thread.c +6 -222
- data/ext/ffi_c/Thread.h +2 -13
- data/ext/ffi_c/Type.c +0 -18
- data/ext/ffi_c/Type.h +0 -1
- data/ext/ffi_c/Variadic.c +9 -15
- data/ext/ffi_c/extconf.rb +34 -20
- data/ext/ffi_c/ffi.c +3 -8
- data/ext/ffi_c/libffi/configure.ac +5 -1
- data/ext/ffi_c/libffi/include/ffi_common.h +1 -1
- data/ext/ffi_c/libffi/src/aarch64/ffi.c +2 -2
- data/ext/ffi_c/libffi/src/frv/ffi.c +1 -1
- data/ext/ffi_c/libffi/src/metag/ffi.c +1 -1
- data/ext/ffi_c/libffi/src/moxie/ffi.c +1 -1
- data/ext/ffi_c/libffi/src/riscv/ffi.c +42 -6
- data/ext/ffi_c/libffi/src/riscv/ffitarget.h +1 -0
- data/ext/ffi_c/libffi/src/riscv/sysv.S +86 -7
- data/ext/ffi_c/libffi/src/x86/ffi.c +2 -1
- data/ext/ffi_c/libffi/src/x86/ffiw64.c +1 -1
- data/ext/ffi_c/libffi/src/x86/sysv.S +88 -2
- data/ext/ffi_c/libffi/src/x86/unix64.S +41 -0
- data/ext/ffi_c/rbffi.h +0 -2
- data/ffi.gemspec +11 -4
- data/lib/ffi/data_converter.rb +67 -0
- data/lib/ffi/ffi.rb +1 -0
- data/lib/ffi/platform.rb +2 -0
- data/lib/ffi/pointer.rb +1 -1
- data/lib/ffi/struct.rb +3 -63
- data/lib/ffi/struct_by_reference.rb +72 -0
- data/lib/ffi/struct_layout.rb +96 -0
- data/lib/ffi/tools/const_generator.rb +5 -4
- data/lib/ffi/tools/generator.rb +47 -2
- data/lib/ffi/tools/generator_task.rb +13 -17
- data/lib/ffi/tools/struct_generator.rb +4 -4
- data/lib/ffi/types.rb +1 -1
- data/lib/ffi/version.rb +1 -1
- metadata +18 -13
- data/ext/ffi_c/DataConverter.c +0 -91
- data/ext/ffi_c/StructByReference.c +0 -190
- data/ext/ffi_c/StructByReference.h +0 -50
@@ -0,0 +1,96 @@
|
|
1
|
+
#
|
2
|
+
# Copyright (C) 2008-2010 Wayne Meissner
|
3
|
+
# Copyright (C) 2008, 2009 Andrea Fazzi
|
4
|
+
# Copyright (C) 2008, 2009 Luc Heinrich
|
5
|
+
#
|
6
|
+
# This file is part of ruby-ffi.
|
7
|
+
#
|
8
|
+
# All rights reserved.
|
9
|
+
#
|
10
|
+
# Redistribution and use in source and binary forms, with or without
|
11
|
+
# modification, are permitted provided that the following conditions are met:
|
12
|
+
#
|
13
|
+
# * Redistributions of source code must retain the above copyright notice, this
|
14
|
+
# list of conditions and the following disclaimer.
|
15
|
+
# * Redistributions in binary form must reproduce the above copyright notice
|
16
|
+
# this list of conditions and the following disclaimer in the documentation
|
17
|
+
# and/or other materials provided with the distribution.
|
18
|
+
# * Neither the name of the Ruby FFI project nor the names of its contributors
|
19
|
+
# may be used to endorse or promote products derived from this software
|
20
|
+
# without specific prior written permission.
|
21
|
+
#
|
22
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
23
|
+
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
24
|
+
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
25
|
+
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
|
26
|
+
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
27
|
+
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
28
|
+
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
29
|
+
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
30
|
+
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
31
|
+
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
32
|
+
#
|
33
|
+
|
34
|
+
module FFI
|
35
|
+
|
36
|
+
class StructLayout
|
37
|
+
|
38
|
+
# @return [Array<Array(Symbol, Numeric)>
|
39
|
+
# Get an array of tuples (field name, offset of the field).
|
40
|
+
def offsets
|
41
|
+
members.map { |m| [ m, self[m].offset ] }
|
42
|
+
end
|
43
|
+
|
44
|
+
# @return [Numeric]
|
45
|
+
# Get the offset of a field.
|
46
|
+
def offset_of(field_name)
|
47
|
+
self[field_name].offset
|
48
|
+
end
|
49
|
+
|
50
|
+
# An enum {Field} in a {StructLayout}.
|
51
|
+
class Enum < Field
|
52
|
+
|
53
|
+
# @param [AbstractMemory] ptr pointer on a {Struct}
|
54
|
+
# @return [Object]
|
55
|
+
# Get an object of type {#type} from memory pointed by +ptr+.
|
56
|
+
def get(ptr)
|
57
|
+
type.find(ptr.get_int(offset))
|
58
|
+
end
|
59
|
+
|
60
|
+
# @param [AbstractMemory] ptr pointer on a {Struct}
|
61
|
+
# @param value
|
62
|
+
# @return [nil]
|
63
|
+
# Set +value+ into memory pointed by +ptr+.
|
64
|
+
def put(ptr, value)
|
65
|
+
ptr.put_int(offset, type.find(value))
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
69
|
+
|
70
|
+
class InnerStruct < Field
|
71
|
+
def get(ptr)
|
72
|
+
type.struct_class.new(ptr.slice(self.offset, self.size))
|
73
|
+
end
|
74
|
+
|
75
|
+
def put(ptr, value)
|
76
|
+
raise TypeError, "wrong value type (expected #{type.struct_class})" unless value.is_a?(type.struct_class)
|
77
|
+
ptr.slice(self.offset, self.size).__copy_from__(value.pointer, self.size)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
class Mapped < Field
|
82
|
+
def initialize(name, offset, type, orig_field)
|
83
|
+
super(name, offset, type)
|
84
|
+
@orig_field = orig_field
|
85
|
+
end
|
86
|
+
|
87
|
+
def get(ptr)
|
88
|
+
type.from_native(@orig_field.get(ptr), nil)
|
89
|
+
end
|
90
|
+
|
91
|
+
def put(ptr, value)
|
92
|
+
@orig_field.put(ptr, type.to_native(value, nil))
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
@@ -6,6 +6,7 @@ module FFI
|
|
6
6
|
# ConstGenerator turns C constants into ruby values.
|
7
7
|
#
|
8
8
|
# @example a simple example for stdio
|
9
|
+
# require 'ffi/tools/const_generator'
|
9
10
|
# cg = FFI::ConstGenerator.new('stdio') do |gen|
|
10
11
|
# gen.const(:SEEK_SET)
|
11
12
|
# gen.const('SEEK_CUR')
|
@@ -25,10 +26,10 @@ module FFI
|
|
25
26
|
#
|
26
27
|
# The only option is +:required+, which if set to +true+ raises an error if a
|
27
28
|
# constant you have requested was not found.
|
28
|
-
#
|
29
|
+
#
|
29
30
|
# @param [#to_s] prefix
|
30
31
|
# @param [Hash] options
|
31
|
-
# @return
|
32
|
+
# @return
|
32
33
|
# @option options [Boolean] :required
|
33
34
|
# @overload initialize(prefix, options)
|
34
35
|
# @overload initialize(prefix, options) { |gen| ... }
|
@@ -79,7 +80,7 @@ module FFI
|
|
79
80
|
# @param [#call] converter convert the value from a string to the appropriate
|
80
81
|
# type for {#to_ruby}.
|
81
82
|
# @overload const(name, format=nil, cast='', ruby_name=nil) { |value| ... }
|
82
|
-
# Use a converter block. This block convert the value from a string to the
|
83
|
+
# Use a converter block. This block convert the value from a string to the
|
83
84
|
# appropriate type for {#to_ruby}.
|
84
85
|
# @yieldparam value constant value
|
85
86
|
def const(name, format = nil, cast = '', ruby_name = nil, converter = nil,
|
@@ -224,6 +225,6 @@ module FFI
|
|
224
225
|
"#{ruby_name} = #{converted_value}"
|
225
226
|
end
|
226
227
|
|
227
|
-
end
|
228
|
+
end
|
228
229
|
|
229
230
|
end
|
data/lib/ffi/tools/generator.rb
CHANGED
@@ -1,6 +1,51 @@
|
|
1
|
+
require 'ffi/tools/struct_generator'
|
2
|
+
require 'ffi/tools/const_generator'
|
3
|
+
|
1
4
|
module FFI
|
2
5
|
|
3
|
-
|
6
|
+
##
|
7
|
+
# Generate files with C structs for FFI::Struct and C constants.
|
8
|
+
#
|
9
|
+
# == A simple example
|
10
|
+
#
|
11
|
+
# In file +zlib.rb.ffi+:
|
12
|
+
# module Zlib
|
13
|
+
# @@@
|
14
|
+
# constants do |c|
|
15
|
+
# c.include "zlib.h"
|
16
|
+
# c.const :ZLIB_VERNUM
|
17
|
+
# end
|
18
|
+
# @@@
|
19
|
+
#
|
20
|
+
# class ZStream < FFI::Struct
|
21
|
+
#
|
22
|
+
# struct do |s|
|
23
|
+
# s.name "struct z_stream_s"
|
24
|
+
# s.include "zlib.h"
|
25
|
+
#
|
26
|
+
# s.field :next_in, :pointer
|
27
|
+
# s.field :avail_in, :uint
|
28
|
+
# s.field :total_in, :ulong
|
29
|
+
# end
|
30
|
+
# @@@
|
31
|
+
# end
|
32
|
+
# end
|
33
|
+
#
|
34
|
+
# Translate the file:
|
35
|
+
# require "ffi/tools/generator"
|
36
|
+
# FFI::Generator.new "zlib.rb.ffi", "zlib.rb"
|
37
|
+
#
|
38
|
+
# Generates the file +zlib.rb+ with constant values and offsets:
|
39
|
+
# module Zlib
|
40
|
+
# ZLIB_VERNUM = 4784
|
41
|
+
#
|
42
|
+
# class ZStream < FFI::Struct
|
43
|
+
# layout :next_in, :pointer, 0,
|
44
|
+
# :avail_in, :uint, 8,
|
45
|
+
# :total_in, :ulong, 16
|
46
|
+
# end
|
47
|
+
#
|
48
|
+
# @see FFI::Generator::Task for easy integration in a Rakefile
|
4
49
|
class Generator
|
5
50
|
|
6
51
|
def initialize(ffi_name, rb_name, options = {})
|
@@ -34,7 +79,7 @@ module FFI
|
|
34
79
|
end
|
35
80
|
|
36
81
|
open @rb_name, 'w' do |f|
|
37
|
-
f.puts "# This file is generated
|
82
|
+
f.puts "# This file is generated from `#{@ffi_name}'. Do not edit."
|
38
83
|
f.puts
|
39
84
|
f.puts new_file
|
40
85
|
end
|
@@ -1,25 +1,21 @@
|
|
1
|
-
|
2
|
-
require 'ffi/struct_generator'
|
3
|
-
require 'ffi/const_generator'
|
4
|
-
require 'ffi/generator'
|
5
|
-
rescue LoadError
|
6
|
-
# from Rakefile
|
7
|
-
require 'lib/ffi/struct_generator'
|
8
|
-
require 'lib/ffi/const_generator'
|
9
|
-
require 'lib/ffi/generator'
|
10
|
-
end
|
11
|
-
|
1
|
+
require 'ffi/tools/generator'
|
12
2
|
require 'rake'
|
13
3
|
require 'rake/tasklib'
|
14
|
-
require 'tempfile'
|
15
4
|
|
16
5
|
##
|
17
|
-
# Rake
|
18
|
-
|
19
|
-
# @
|
6
|
+
# Add Rake tasks that generate files with C structs for FFI::Struct and C constants.
|
7
|
+
#
|
8
|
+
# @example a simple example for your Rakefile
|
9
|
+
# require "ffi/tools/generator_task"
|
10
|
+
# # Add a task to generate my_object.rb out of my_object.rb.ffi
|
11
|
+
# FFI::Generator::Task.new ["my_object.rb"], cflags: "-I/usr/local/mylibrary"
|
12
|
+
#
|
13
|
+
# The generated files are also added to the 'clear' task.
|
14
|
+
#
|
15
|
+
# @see FFI::Generator for a description of the file content
|
20
16
|
class FFI::Generator::Task < Rake::TaskLib
|
21
17
|
|
22
|
-
def initialize(rb_names)
|
18
|
+
def initialize(rb_names, options={})
|
23
19
|
task :clean do rm_f rb_names end
|
24
20
|
|
25
21
|
rb_names.each do |rb_name|
|
@@ -28,7 +24,7 @@ class FFI::Generator::Task < Rake::TaskLib
|
|
28
24
|
file rb_name => ffi_name do |t|
|
29
25
|
puts "Generating #{rb_name}..." if Rake.application.options.trace
|
30
26
|
|
31
|
-
FFI::Generator.new ffi_name, rb_name
|
27
|
+
FFI::Generator.new ffi_name, rb_name, options
|
32
28
|
end
|
33
29
|
end
|
34
30
|
end
|
@@ -7,15 +7,15 @@ module FFI
|
|
7
7
|
#
|
8
8
|
# Given the @@@ portion in:
|
9
9
|
#
|
10
|
-
#
|
10
|
+
# class Zlib::ZStream < FFI::Struct
|
11
11
|
# @@@
|
12
12
|
# name "struct z_stream_s"
|
13
13
|
# include "zlib.h"
|
14
|
-
#
|
14
|
+
#
|
15
15
|
# field :next_in, :pointer
|
16
16
|
# field :avail_in, :uint
|
17
17
|
# field :total_in, :ulong
|
18
|
-
#
|
18
|
+
#
|
19
19
|
# # ...
|
20
20
|
# @@@
|
21
21
|
# end
|
@@ -90,7 +90,7 @@ module FFI
|
|
90
90
|
raise "Compilation error generating struct #{@name} (#{@struct_name}):\n#{output}"
|
91
91
|
end
|
92
92
|
end
|
93
|
-
|
93
|
+
|
94
94
|
output = `#{binary}`.split "\n"
|
95
95
|
File.unlink(binary + (FFI::Platform.windows? ? ".exe" : ""))
|
96
96
|
sizeof = output.shift
|
data/lib/ffi/types.rb
CHANGED
@@ -152,7 +152,7 @@ module FFI
|
|
152
152
|
# also allow to work with the pointer itself. This is useful when you want
|
153
153
|
# a Ruby string already containing a copy of the data, but also the pointer
|
154
154
|
# to the data for you to do something with it, like freeing it, in case the
|
155
|
-
# library handed the memory
|
155
|
+
# library handed the memory off to the caller (Ruby-FFI).
|
156
156
|
#
|
157
157
|
# It's {typedef}'d as +:strptr+.
|
158
158
|
class StrPtrConverter
|
data/lib/ffi/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ffi
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.11.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Wayne Meissner
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-05-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '12.1'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
26
|
+
version: '12.1'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rake-compiler
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -44,14 +44,14 @@ dependencies:
|
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: 0.
|
47
|
+
version: 0.7.0
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: 0.
|
54
|
+
version: 0.7.0
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: rspec
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -108,7 +108,6 @@ files:
|
|
108
108
|
- ext/ffi_c/Call.h
|
109
109
|
- ext/ffi_c/ClosurePool.c
|
110
110
|
- ext/ffi_c/ClosurePool.h
|
111
|
-
- ext/ffi_c/DataConverter.c
|
112
111
|
- ext/ffi_c/DynamicLibrary.c
|
113
112
|
- ext/ffi_c/DynamicLibrary.h
|
114
113
|
- ext/ffi_c/Function.c
|
@@ -130,8 +129,6 @@ files:
|
|
130
129
|
- ext/ffi_c/Pointer.h
|
131
130
|
- ext/ffi_c/Struct.c
|
132
131
|
- ext/ffi_c/Struct.h
|
133
|
-
- ext/ffi_c/StructByReference.c
|
134
|
-
- ext/ffi_c/StructByReference.h
|
135
132
|
- ext/ffi_c/StructByValue.c
|
136
133
|
- ext/ffi_c/StructByValue.h
|
137
134
|
- ext/ffi_c/StructLayout.c
|
@@ -557,6 +554,7 @@ files:
|
|
557
554
|
- lib/ffi/autopointer.rb
|
558
555
|
- lib/ffi/buffer.rb
|
559
556
|
- lib/ffi/callback.rb
|
557
|
+
- lib/ffi/data_converter.rb
|
560
558
|
- lib/ffi/enum.rb
|
561
559
|
- lib/ffi/errno.rb
|
562
560
|
- lib/ffi/ffi.rb
|
@@ -611,6 +609,8 @@ files:
|
|
611
609
|
- lib/ffi/platform/x86_64-windows/types.conf
|
612
610
|
- lib/ffi/pointer.rb
|
613
611
|
- lib/ffi/struct.rb
|
612
|
+
- lib/ffi/struct_by_reference.rb
|
613
|
+
- lib/ffi/struct_layout.rb
|
614
614
|
- lib/ffi/struct_layout_builder.rb
|
615
615
|
- lib/ffi/tools/const_generator.rb
|
616
616
|
- lib/ffi/tools/generator.rb
|
@@ -632,7 +632,13 @@ files:
|
|
632
632
|
homepage: http://wiki.github.com/ffi/ffi
|
633
633
|
licenses:
|
634
634
|
- BSD-3-Clause
|
635
|
-
metadata:
|
635
|
+
metadata:
|
636
|
+
bug_tracker_uri: https://github.com/ffi/ffi/issues
|
637
|
+
changelog_uri: https://github.com/ffi/ffi/blob/master/CHANGELOG.md
|
638
|
+
documentation_uri: https://github.com/ffi/ffi/wiki
|
639
|
+
wiki_uri: https://github.com/ffi/ffi/wiki
|
640
|
+
source_code_uri: https://github.com/ffi/ffi/
|
641
|
+
mailing_list_uri: http://groups.google.com/group/ruby-ffi
|
636
642
|
post_install_message:
|
637
643
|
rdoc_options:
|
638
644
|
- "--exclude=ext/ffi_c/.*\\.o$"
|
@@ -643,15 +649,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
643
649
|
requirements:
|
644
650
|
- - ">="
|
645
651
|
- !ruby/object:Gem::Version
|
646
|
-
version: '
|
652
|
+
version: '2.0'
|
647
653
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
648
654
|
requirements:
|
649
655
|
- - ">="
|
650
656
|
- !ruby/object:Gem::Version
|
651
657
|
version: '0'
|
652
658
|
requirements: []
|
653
|
-
|
654
|
-
rubygems_version: 2.7.8
|
659
|
+
rubygems_version: 3.0.3
|
655
660
|
signing_key:
|
656
661
|
specification_version: 4
|
657
662
|
summary: Ruby FFI
|
data/ext/ffi_c/DataConverter.c
DELETED
@@ -1,91 +0,0 @@
|
|
1
|
-
|
2
|
-
#include <ruby.h>
|
3
|
-
|
4
|
-
#include <ffi.h>
|
5
|
-
#include "rbffi.h"
|
6
|
-
|
7
|
-
#include "Type.h"
|
8
|
-
#include "MappedType.h"
|
9
|
-
|
10
|
-
|
11
|
-
VALUE rbffi_DataConverterClass = Qnil;
|
12
|
-
static ID id_native_type_ivar;
|
13
|
-
|
14
|
-
/*
|
15
|
-
* Get native type.
|
16
|
-
* @overload native_type(type)
|
17
|
-
* @param [String, Symbol, Type] type
|
18
|
-
* @return [Type]
|
19
|
-
* Get native type from +type+.
|
20
|
-
* @overload native_type
|
21
|
-
* @raise {NotImplementedError} This method must be overriden.
|
22
|
-
*/
|
23
|
-
static VALUE
|
24
|
-
conv_native_type(int argc, VALUE* argv, VALUE self)
|
25
|
-
{
|
26
|
-
if (argc == 0) {
|
27
|
-
if (!rb_ivar_defined(self, id_native_type_ivar)) {
|
28
|
-
rb_raise(rb_eNotImpError, "native_type method not overridden and no native_type set");
|
29
|
-
}
|
30
|
-
|
31
|
-
return rb_ivar_get(self, id_native_type_ivar);
|
32
|
-
|
33
|
-
} else if (argc == 1) {
|
34
|
-
VALUE type = rbffi_Type_Find(argv[0]);
|
35
|
-
|
36
|
-
rb_ivar_set(self, id_native_type_ivar, type);
|
37
|
-
|
38
|
-
return type;
|
39
|
-
|
40
|
-
} else {
|
41
|
-
rb_raise(rb_eArgError, "incorrect arguments");
|
42
|
-
}
|
43
|
-
}
|
44
|
-
|
45
|
-
/*
|
46
|
-
* call-seq: to_native(value, ctx)
|
47
|
-
* @param value
|
48
|
-
* @param ctx
|
49
|
-
* @return [value]
|
50
|
-
* Convert to a native type.
|
51
|
-
*/
|
52
|
-
static VALUE
|
53
|
-
conv_to_native(VALUE self, VALUE value, VALUE ctx)
|
54
|
-
{
|
55
|
-
return value;
|
56
|
-
}
|
57
|
-
|
58
|
-
/*
|
59
|
-
* call-seq: from_native(value, ctx)
|
60
|
-
* @param value
|
61
|
-
* @param ctx
|
62
|
-
* @return [value]
|
63
|
-
* Convert from a native type.
|
64
|
-
*/
|
65
|
-
static VALUE
|
66
|
-
conv_from_native(VALUE self, VALUE value, VALUE ctx)
|
67
|
-
{
|
68
|
-
return value;
|
69
|
-
}
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
void
|
74
|
-
rbffi_DataConverter_Init(VALUE moduleFFI)
|
75
|
-
{
|
76
|
-
/*
|
77
|
-
* Document-module: FFI::DataConverter
|
78
|
-
* This module is used to extend somes classes and give then a common API.
|
79
|
-
*
|
80
|
-
* Most of methods defined here must be overriden.
|
81
|
-
*/
|
82
|
-
rbffi_DataConverterClass = rb_define_module_under(moduleFFI, "DataConverter");
|
83
|
-
|
84
|
-
rb_define_method(rbffi_DataConverterClass, "native_type", conv_native_type, -1);
|
85
|
-
rb_define_method(rbffi_DataConverterClass, "to_native", conv_to_native, 2);
|
86
|
-
rb_define_method(rbffi_DataConverterClass, "from_native", conv_from_native, 2);
|
87
|
-
|
88
|
-
id_native_type_ivar = rb_intern("@native_type");
|
89
|
-
}
|
90
|
-
|
91
|
-
|