alinta-ffi 1.9.19
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/COPYING +49 -0
- data/LICENSE +24 -0
- data/README.md +112 -0
- data/Rakefile +243 -0
- data/ext/ffi_c/AbstractMemory.c +1109 -0
- data/ext/ffi_c/AbstractMemory.h +175 -0
- data/ext/ffi_c/ArrayType.c +162 -0
- data/ext/ffi_c/ArrayType.h +59 -0
- data/ext/ffi_c/Buffer.c +365 -0
- data/ext/ffi_c/Call.c +517 -0
- data/ext/ffi_c/Call.h +110 -0
- data/ext/ffi_c/ClosurePool.c +283 -0
- data/ext/ffi_c/ClosurePool.h +57 -0
- data/ext/ffi_c/DataConverter.c +91 -0
- data/ext/ffi_c/DynamicLibrary.c +339 -0
- data/ext/ffi_c/DynamicLibrary.h +98 -0
- data/ext/ffi_c/Function.c +998 -0
- data/ext/ffi_c/Function.h +87 -0
- data/ext/ffi_c/FunctionInfo.c +271 -0
- data/ext/ffi_c/LastError.c +184 -0
- data/ext/ffi_c/LastError.h +47 -0
- data/ext/ffi_c/LongDouble.c +63 -0
- data/ext/ffi_c/LongDouble.h +51 -0
- data/ext/ffi_c/MappedType.c +168 -0
- data/ext/ffi_c/MappedType.h +59 -0
- data/ext/ffi_c/MemoryPointer.c +197 -0
- data/ext/ffi_c/MemoryPointer.h +53 -0
- data/ext/ffi_c/MethodHandle.c +358 -0
- data/ext/ffi_c/MethodHandle.h +55 -0
- data/ext/ffi_c/Platform.c +129 -0
- data/ext/ffi_c/Platform.h +45 -0
- data/ext/ffi_c/Pointer.c +508 -0
- data/ext/ffi_c/Pointer.h +63 -0
- data/ext/ffi_c/Struct.c +829 -0
- data/ext/ffi_c/Struct.h +106 -0
- data/ext/ffi_c/StructByReference.c +190 -0
- data/ext/ffi_c/StructByReference.h +50 -0
- data/ext/ffi_c/StructByValue.c +150 -0
- data/ext/ffi_c/StructByValue.h +55 -0
- data/ext/ffi_c/StructLayout.c +698 -0
- data/ext/ffi_c/Thread.c +352 -0
- data/ext/ffi_c/Thread.h +95 -0
- data/ext/ffi_c/Type.c +397 -0
- data/ext/ffi_c/Type.h +62 -0
- data/ext/ffi_c/Types.c +139 -0
- data/ext/ffi_c/Types.h +89 -0
- data/ext/ffi_c/Variadic.c +304 -0
- data/ext/ffi_c/compat.h +78 -0
- data/ext/ffi_c/extconf.rb +71 -0
- data/ext/ffi_c/ffi.c +98 -0
- data/ext/ffi_c/libffi.bsd.mk +40 -0
- data/ext/ffi_c/libffi.darwin.mk +105 -0
- data/ext/ffi_c/libffi.gnu.mk +32 -0
- data/ext/ffi_c/libffi.mk +18 -0
- data/ext/ffi_c/libffi.vc.mk +26 -0
- data/ext/ffi_c/libffi.vc64.mk +26 -0
- data/ext/ffi_c/rbffi.h +57 -0
- data/ext/ffi_c/rbffi_endian.h +59 -0
- data/ext/ffi_c/win32/stdbool.h +8 -0
- data/ext/ffi_c/win32/stdint.h +201 -0
- data/ffi.gemspec +23 -0
- data/gen/Rakefile +30 -0
- data/lib/ffi.rb +20 -0
- data/lib/ffi/autopointer.rb +203 -0
- data/lib/ffi/buffer.rb +4 -0
- data/lib/ffi/callback.rb +4 -0
- data/lib/ffi/enum.rb +296 -0
- data/lib/ffi/errno.rb +43 -0
- data/lib/ffi/ffi.rb +44 -0
- data/lib/ffi/io.rb +62 -0
- data/lib/ffi/library.rb +590 -0
- data/lib/ffi/managedstruct.rb +84 -0
- data/lib/ffi/memorypointer.rb +1 -0
- data/lib/ffi/platform.rb +164 -0
- data/lib/ffi/platform/aarch64-linux/types.conf +104 -0
- data/lib/ffi/platform/arm-linux/types.conf +104 -0
- data/lib/ffi/platform/i386-cygwin/types.conf +3 -0
- data/lib/ffi/platform/i386-darwin/types.conf +100 -0
- data/lib/ffi/platform/i386-freebsd/types.conf +152 -0
- data/lib/ffi/platform/i386-gnu/types.conf +107 -0
- data/lib/ffi/platform/i386-linux/types.conf +103 -0
- data/lib/ffi/platform/i386-netbsd/types.conf +126 -0
- data/lib/ffi/platform/i386-openbsd/types.conf +128 -0
- data/lib/ffi/platform/i386-solaris/types.conf +122 -0
- data/lib/ffi/platform/i386-windows/types.conf +105 -0
- data/lib/ffi/platform/ia64-linux/types.conf +104 -0
- data/lib/ffi/platform/mips-linux/types.conf +102 -0
- data/lib/ffi/platform/mips64el-linux/types.conf +104 -0
- data/lib/ffi/platform/mipsel-linux/types.conf +102 -0
- data/lib/ffi/platform/powerpc-aix/types.conf +180 -0
- data/lib/ffi/platform/powerpc-darwin/types.conf +100 -0
- data/lib/ffi/platform/powerpc-linux/types.conf +100 -0
- data/lib/ffi/platform/powerpc64-linux/types.conf +104 -0
- data/lib/ffi/platform/s390-linux/types.conf +102 -0
- data/lib/ffi/platform/s390x-linux/types.conf +102 -0
- data/lib/ffi/platform/sparc-linux/types.conf +102 -0
- data/lib/ffi/platform/sparc-solaris/types.conf +128 -0
- data/lib/ffi/platform/sparc64-linux/types.conf +102 -0
- data/lib/ffi/platform/sparcv9-solaris/types.conf +128 -0
- data/lib/ffi/platform/x86_64-cygwin/types.conf +3 -0
- data/lib/ffi/platform/x86_64-darwin/types.conf +126 -0
- data/lib/ffi/platform/x86_64-freebsd/types.conf +128 -0
- data/lib/ffi/platform/x86_64-linux/types.conf +102 -0
- data/lib/ffi/platform/x86_64-netbsd/types.conf +128 -0
- data/lib/ffi/platform/x86_64-openbsd/types.conf +134 -0
- data/lib/ffi/platform/x86_64-solaris/types.conf +122 -0
- data/lib/ffi/platform/x86_64-windows/types.conf +120 -0
- data/lib/ffi/pointer.rb +161 -0
- data/lib/ffi/struct.rb +371 -0
- data/lib/ffi/struct_layout_builder.rb +227 -0
- data/lib/ffi/tools/const_generator.rb +229 -0
- data/lib/ffi/tools/generator.rb +60 -0
- data/lib/ffi/tools/generator_task.rb +36 -0
- data/lib/ffi/tools/struct_generator.rb +194 -0
- data/lib/ffi/tools/types_generator.rb +134 -0
- data/lib/ffi/types.rb +194 -0
- data/lib/ffi/union.rb +43 -0
- data/lib/ffi/variadic.rb +78 -0
- data/lib/ffi/version.rb +4 -0
- data/libtest/Benchmark.c +52 -0
- data/libtest/BoolTest.c +34 -0
- data/libtest/BufferTest.c +31 -0
- data/libtest/ClosureTest.c +205 -0
- data/libtest/EnumTest.c +51 -0
- data/libtest/FunctionTest.c +70 -0
- data/libtest/GNUmakefile +149 -0
- data/libtest/GlobalVariable.c +62 -0
- data/libtest/LastErrorTest.c +21 -0
- data/libtest/NumberTest.c +132 -0
- data/libtest/PointerTest.c +63 -0
- data/libtest/ReferenceTest.c +23 -0
- data/libtest/StringTest.c +34 -0
- data/libtest/StructTest.c +243 -0
- data/libtest/UnionTest.c +43 -0
- data/libtest/VariadicTest.c +99 -0
- data/spec/ffi/LICENSE.SPECS +22 -0
- data/spec/ffi/async_callback_spec.rb +35 -0
- data/spec/ffi/bitmask_spec.rb +575 -0
- data/spec/ffi/bool_spec.rb +32 -0
- data/spec/ffi/buffer_spec.rb +279 -0
- data/spec/ffi/callback_spec.rb +773 -0
- data/spec/ffi/custom_param_type.rb +37 -0
- data/spec/ffi/custom_type_spec.rb +74 -0
- data/spec/ffi/dup_spec.rb +52 -0
- data/spec/ffi/enum_spec.rb +423 -0
- data/spec/ffi/errno_spec.rb +20 -0
- data/spec/ffi/ffi_spec.rb +28 -0
- data/spec/ffi/fixtures/Benchmark.c +52 -0
- data/spec/ffi/fixtures/BitmaskTest.c +51 -0
- data/spec/ffi/fixtures/BoolTest.c +34 -0
- data/spec/ffi/fixtures/BufferTest.c +31 -0
- data/spec/ffi/fixtures/ClosureTest.c +205 -0
- data/spec/ffi/fixtures/EnumTest.c +51 -0
- data/spec/ffi/fixtures/FunctionTest.c +142 -0
- data/spec/ffi/fixtures/GNUmakefile +149 -0
- data/spec/ffi/fixtures/GlobalVariable.c +62 -0
- data/spec/ffi/fixtures/LastErrorTest.c +21 -0
- data/spec/ffi/fixtures/NumberTest.c +132 -0
- data/spec/ffi/fixtures/PipeHelper.h +21 -0
- data/spec/ffi/fixtures/PipeHelperPosix.c +41 -0
- data/spec/ffi/fixtures/PipeHelperWindows.c +72 -0
- data/spec/ffi/fixtures/PointerTest.c +63 -0
- data/spec/ffi/fixtures/ReferenceTest.c +23 -0
- data/spec/ffi/fixtures/StringTest.c +34 -0
- data/spec/ffi/fixtures/StructTest.c +243 -0
- data/spec/ffi/fixtures/UnionTest.c +43 -0
- data/spec/ffi/fixtures/VariadicTest.c +99 -0
- data/spec/ffi/fixtures/classes.rb +438 -0
- data/spec/ffi/function_spec.rb +97 -0
- data/spec/ffi/io_spec.rb +16 -0
- data/spec/ffi/library_spec.rb +286 -0
- data/spec/ffi/long_double.rb +30 -0
- data/spec/ffi/managed_struct_spec.rb +68 -0
- data/spec/ffi/memorypointer_spec.rb +78 -0
- data/spec/ffi/number_spec.rb +247 -0
- data/spec/ffi/platform_spec.rb +114 -0
- data/spec/ffi/pointer_spec.rb +285 -0
- data/spec/ffi/rbx/attach_function_spec.rb +34 -0
- data/spec/ffi/rbx/memory_pointer_spec.rb +198 -0
- data/spec/ffi/rbx/spec_helper.rb +6 -0
- data/spec/ffi/rbx/struct_spec.rb +18 -0
- data/spec/ffi/spec_helper.rb +93 -0
- data/spec/ffi/string_spec.rb +118 -0
- data/spec/ffi/strptr_spec.rb +50 -0
- data/spec/ffi/struct_by_ref_spec.rb +43 -0
- data/spec/ffi/struct_callback_spec.rb +69 -0
- data/spec/ffi/struct_initialize_spec.rb +35 -0
- data/spec/ffi/struct_packed_spec.rb +50 -0
- data/spec/ffi/struct_spec.rb +882 -0
- data/spec/ffi/typedef_spec.rb +91 -0
- data/spec/ffi/union_spec.rb +67 -0
- data/spec/ffi/variadic_spec.rb +132 -0
- data/spec/spec.opts +4 -0
- metadata +309 -0
data/ext/ffi_c/compat.h
ADDED
@@ -0,0 +1,78 @@
|
|
1
|
+
/*
|
2
|
+
* Copyright (c) 2008, 2009, Wayne Meissner
|
3
|
+
*
|
4
|
+
* Copyright (c) 2008-2013, Ruby FFI project contributors
|
5
|
+
* All rights reserved.
|
6
|
+
*
|
7
|
+
* Redistribution and use in source and binary forms, with or without
|
8
|
+
* modification, are permitted provided that the following conditions are met:
|
9
|
+
* * Redistributions of source code must retain the above copyright
|
10
|
+
* notice, this list of conditions and the following disclaimer.
|
11
|
+
* * Redistributions in binary form must reproduce the above copyright
|
12
|
+
* notice, this list of conditions and the following disclaimer in the
|
13
|
+
* documentation and/or other materials provided with the distribution.
|
14
|
+
* * Neither the name of the Ruby FFI project nor the
|
15
|
+
* names of its contributors may be used to endorse or promote products
|
16
|
+
* derived from this software without specific prior written permission.
|
17
|
+
*
|
18
|
+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
19
|
+
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
20
|
+
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
21
|
+
* DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
|
22
|
+
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
23
|
+
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
24
|
+
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
25
|
+
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
26
|
+
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
27
|
+
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
28
|
+
*/
|
29
|
+
|
30
|
+
#ifndef RBFFI_COMPAT_H
|
31
|
+
#define RBFFI_COMPAT_H
|
32
|
+
|
33
|
+
#include <ruby.h>
|
34
|
+
|
35
|
+
#ifndef RARRAY_LEN
|
36
|
+
# define RARRAY_LEN(ary) RARRAY(ary)->len
|
37
|
+
#endif
|
38
|
+
|
39
|
+
#ifndef RARRAY_PTR
|
40
|
+
# define RARRAY_PTR(ary) RARRAY(ary)->ptr
|
41
|
+
#endif
|
42
|
+
|
43
|
+
#ifndef RSTRING_LEN
|
44
|
+
# define RSTRING_LEN(s) RSTRING(s)->len
|
45
|
+
#endif
|
46
|
+
|
47
|
+
#ifndef RSTRING_PTR
|
48
|
+
# define RSTRING_PTR(s) RSTRING(s)->ptr
|
49
|
+
#endif
|
50
|
+
|
51
|
+
#ifndef NUM2ULL
|
52
|
+
# define NUM2ULL(x) rb_num2ull((VALUE)x)
|
53
|
+
#endif
|
54
|
+
|
55
|
+
#ifndef roundup
|
56
|
+
# define roundup(x, y) ((((x)+((y)-1))/(y))*(y))
|
57
|
+
#endif
|
58
|
+
|
59
|
+
#ifdef __GNUC__
|
60
|
+
# define likely(x) __builtin_expect((x), 1)
|
61
|
+
# define unlikely(x) __builtin_expect((x), 0)
|
62
|
+
#else
|
63
|
+
# define likely(x) (x)
|
64
|
+
# define unlikely(x) (x)
|
65
|
+
#endif
|
66
|
+
|
67
|
+
#ifndef MAX
|
68
|
+
# define MAX(a, b) ((a) < (b) ? (b) : (a))
|
69
|
+
#endif
|
70
|
+
#ifndef MIN
|
71
|
+
# define MIN(a, b) ((a) < (b) ? (a) : (b))
|
72
|
+
#endif
|
73
|
+
|
74
|
+
#ifndef RB_GC_GUARD
|
75
|
+
# define RB_GC_GUARD(x) (x)
|
76
|
+
#endif
|
77
|
+
|
78
|
+
#endif /* RBFFI_COMPAT_H */
|
@@ -0,0 +1,71 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
if !defined?(RUBY_ENGINE) || RUBY_ENGINE == 'ruby' || RUBY_ENGINE == 'rbx'
|
4
|
+
require 'mkmf'
|
5
|
+
require 'rbconfig'
|
6
|
+
dir_config("ffi_c")
|
7
|
+
|
8
|
+
# recent versions of ruby add restrictive ansi and warning flags on a whim - kill them all
|
9
|
+
$warnflags = ''
|
10
|
+
$CFLAGS.gsub!(/[\s+]-ansi/, '')
|
11
|
+
$CFLAGS.gsub!(/[\s+]-std=[^\s]+/, '')
|
12
|
+
# solaris 10 needs -c99 for <stdbool.h>
|
13
|
+
$CFLAGS << " -std=c99" if RbConfig::CONFIG['host_os'] =~ /solaris(!?2\.11)/
|
14
|
+
|
15
|
+
if ENV['RUBY_CC_VERSION'].nil? && (pkg_config("libffi") ||
|
16
|
+
have_header("ffi.h") ||
|
17
|
+
find_header("ffi.h", "/usr/local/include", "/usr/include/ffi"))
|
18
|
+
|
19
|
+
# We need at least ffi_call and ffi_prep_closure
|
20
|
+
libffi_ok = have_library("ffi", "ffi_call", [ "ffi.h" ]) ||
|
21
|
+
have_library("libffi", "ffi_call", [ "ffi.h" ])
|
22
|
+
libffi_ok &&= have_func("ffi_prep_closure")
|
23
|
+
|
24
|
+
# Check if the raw api is available.
|
25
|
+
$defs << "-DHAVE_RAW_API" if have_func("ffi_raw_call") && have_func("ffi_prep_raw_closure")
|
26
|
+
end
|
27
|
+
|
28
|
+
have_header('shlwapi.h')
|
29
|
+
have_func('rb_thread_blocking_region')
|
30
|
+
have_func('rb_thread_call_with_gvl')
|
31
|
+
have_func('rb_thread_call_without_gvl')
|
32
|
+
|
33
|
+
if libffi_ok
|
34
|
+
have_func('ffi_prep_cif_var')
|
35
|
+
else
|
36
|
+
$defs << "-DHAVE_FFI_PREP_CIF_VAR"
|
37
|
+
end
|
38
|
+
|
39
|
+
$defs << "-DHAVE_EXTCONF_H" if $defs.empty? # needed so create_header works
|
40
|
+
$defs << "-DUSE_INTERNAL_LIBFFI" unless libffi_ok
|
41
|
+
$defs << "-DRUBY_1_9" if RUBY_VERSION >= "1.9.0"
|
42
|
+
$defs << "-DFFI_BUILDING" if RbConfig::CONFIG['host_os'] =~ /mswin/ # for compatibility with newer libffi
|
43
|
+
|
44
|
+
create_header
|
45
|
+
|
46
|
+
$LOCAL_LIBS << " ./libffi/.libs/libffi_convenience.lib" if !libffi_ok && RbConfig::CONFIG['host_os'] =~ /mswin/
|
47
|
+
|
48
|
+
create_makefile("ffi_c")
|
49
|
+
unless libffi_ok
|
50
|
+
File.open("Makefile", "a") do |mf|
|
51
|
+
mf.puts "LIBFFI_HOST=--host=#{RbConfig::CONFIG['host_alias']}" if RbConfig::CONFIG.has_key?("host_alias")
|
52
|
+
if RbConfig::CONFIG['host_os'].downcase =~ /darwin/
|
53
|
+
mf.puts "include ${srcdir}/libffi.darwin.mk"
|
54
|
+
elsif RbConfig::CONFIG['host_os'].downcase =~ /bsd/
|
55
|
+
mf.puts '.include "${srcdir}/libffi.bsd.mk"'
|
56
|
+
elsif RbConfig::CONFIG['host_os'].downcase =~ /mswin64/
|
57
|
+
mf.puts '!include $(srcdir)/libffi.vc64.mk'
|
58
|
+
elsif RbConfig::CONFIG['host_os'].downcase =~ /mswin32/
|
59
|
+
mf.puts '!include $(srcdir)/libffi.vc.mk'
|
60
|
+
else
|
61
|
+
mf.puts "include ${srcdir}/libffi.mk"
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
else
|
67
|
+
File.open("Makefile", "w") do |mf|
|
68
|
+
mf.puts "# Dummy makefile for non-mri rubies"
|
69
|
+
mf.puts "all install::\n"
|
70
|
+
end
|
71
|
+
end
|
data/ext/ffi_c/ffi.c
ADDED
@@ -0,0 +1,98 @@
|
|
1
|
+
/*
|
2
|
+
* Copyright (c) 2008, 2009, Wayne Meissner
|
3
|
+
* Copyright (C) 2009 Luc Heinrich <luc@honk-honk.com>
|
4
|
+
*
|
5
|
+
* Copyright (c) 2008-2013, Ruby FFI project contributors
|
6
|
+
* All rights reserved.
|
7
|
+
*
|
8
|
+
* Redistribution and use in source and binary forms, with or without
|
9
|
+
* modification, are permitted provided that the following conditions are met:
|
10
|
+
* * Redistributions of source code must retain the above copyright
|
11
|
+
* notice, this list of conditions and the following disclaimer.
|
12
|
+
* * Redistributions in binary form must reproduce the above copyright
|
13
|
+
* notice, this list of conditions and the following disclaimer in the
|
14
|
+
* documentation and/or other materials provided with the distribution.
|
15
|
+
* * Neither the name of the Ruby FFI project nor the
|
16
|
+
* names of its contributors may be used to endorse or promote products
|
17
|
+
* derived from this software without specific prior written permission.
|
18
|
+
*
|
19
|
+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
20
|
+
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
21
|
+
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
22
|
+
* DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
|
23
|
+
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
24
|
+
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
25
|
+
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
26
|
+
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
27
|
+
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
28
|
+
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
29
|
+
*/
|
30
|
+
|
31
|
+
#include <sys/types.h>
|
32
|
+
#include <stdio.h>
|
33
|
+
#include <ruby.h>
|
34
|
+
|
35
|
+
#include <ffi.h>
|
36
|
+
|
37
|
+
#include "rbffi.h"
|
38
|
+
#include "AbstractMemory.h"
|
39
|
+
#include "Pointer.h"
|
40
|
+
#include "MemoryPointer.h"
|
41
|
+
#include "Struct.h"
|
42
|
+
#include "StructByValue.h"
|
43
|
+
#include "StructByReference.h"
|
44
|
+
#include "DynamicLibrary.h"
|
45
|
+
#include "Platform.h"
|
46
|
+
#include "Types.h"
|
47
|
+
#include "LastError.h"
|
48
|
+
#include "Function.h"
|
49
|
+
#include "ClosurePool.h"
|
50
|
+
#include "MethodHandle.h"
|
51
|
+
#include "Call.h"
|
52
|
+
#include "ArrayType.h"
|
53
|
+
#include "MappedType.h"
|
54
|
+
|
55
|
+
void Init_ffi_c(void);
|
56
|
+
|
57
|
+
VALUE rbffi_FFIModule = Qnil;
|
58
|
+
|
59
|
+
static VALUE moduleFFI = Qnil;
|
60
|
+
|
61
|
+
void
|
62
|
+
Init_ffi_c(void)
|
63
|
+
{
|
64
|
+
/*
|
65
|
+
* Document-module: FFI
|
66
|
+
*
|
67
|
+
* This module embbed type constants from {FFI::NativeType}.
|
68
|
+
*/
|
69
|
+
rbffi_FFIModule = moduleFFI = rb_define_module("FFI");
|
70
|
+
rb_global_variable(&rbffi_FFIModule);
|
71
|
+
|
72
|
+
rbffi_Thread_Init(rbffi_FFIModule);
|
73
|
+
|
74
|
+
/* FFI::Type needs to be initialized before most other classes */
|
75
|
+
rbffi_Type_Init(moduleFFI);
|
76
|
+
|
77
|
+
rbffi_DataConverter_Init(moduleFFI);
|
78
|
+
|
79
|
+
rbffi_ArrayType_Init(moduleFFI);
|
80
|
+
rbffi_LastError_Init(moduleFFI);
|
81
|
+
rbffi_Call_Init(moduleFFI);
|
82
|
+
rbffi_ClosurePool_Init(moduleFFI);
|
83
|
+
rbffi_MethodHandle_Init(moduleFFI);
|
84
|
+
rbffi_Platform_Init(moduleFFI);
|
85
|
+
rbffi_AbstractMemory_Init(moduleFFI);
|
86
|
+
rbffi_Pointer_Init(moduleFFI);
|
87
|
+
rbffi_Function_Init(moduleFFI);
|
88
|
+
rbffi_MemoryPointer_Init(moduleFFI);
|
89
|
+
rbffi_Buffer_Init(moduleFFI);
|
90
|
+
rbffi_StructByValue_Init(moduleFFI);
|
91
|
+
rbffi_StructByReference_Init(moduleFFI);
|
92
|
+
rbffi_Struct_Init(moduleFFI);
|
93
|
+
rbffi_DynamicLibrary_Init(moduleFFI);
|
94
|
+
rbffi_Variadic_Init(moduleFFI);
|
95
|
+
rbffi_Types_Init(moduleFFI);
|
96
|
+
rbffi_MappedType_Init(moduleFFI);
|
97
|
+
}
|
98
|
+
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# -*- makefile -*-
|
2
|
+
#
|
3
|
+
# Makefile for BSD systems
|
4
|
+
#
|
5
|
+
|
6
|
+
INCFLAGS += -I${LIBFFI_BUILD_DIR}/include
|
7
|
+
LOCAL_LIBS += ${LIBFFI} -lpthread
|
8
|
+
|
9
|
+
LIBFFI_CFLAGS = ${FFI_MMAP_EXEC} -pthread
|
10
|
+
LIBFFI_BUILD_DIR = ${.CURDIR}/libffi-${arch}
|
11
|
+
|
12
|
+
.if ${srcdir} == "."
|
13
|
+
LIBFFI_SRC_DIR := ${.CURDIR}/libffi
|
14
|
+
.else
|
15
|
+
LIBFFI_SRC_DIR := ${srcdir}/libffi
|
16
|
+
.endif
|
17
|
+
|
18
|
+
|
19
|
+
LIBFFI = ${LIBFFI_BUILD_DIR}/.libs/libffi_convenience.a
|
20
|
+
LIBFFI_AUTOGEN = ${LIBFFI_SRC_DIR}/autogen.sh
|
21
|
+
LIBFFI_CONFIGURE = ${LIBFFI_SRC_DIR}/configure --disable-static \
|
22
|
+
--with-pic=yes --disable-dependency-tracking --disable-docs
|
23
|
+
|
24
|
+
$(OBJS): ${LIBFFI}
|
25
|
+
|
26
|
+
$(LIBFFI):
|
27
|
+
@mkdir -p ${LIBFFI_BUILD_DIR}
|
28
|
+
@if [ ! -f $(LIBFFI_BUILD_DIR)/configure ]; then \
|
29
|
+
echo "Running autoreconf for libffi"; \
|
30
|
+
cd "$(LIBFFI_SRC_DIR)" && \
|
31
|
+
/bin/sh $(LIBFFI_AUTOGEN) > /dev/null; \
|
32
|
+
fi
|
33
|
+
@if [ ! -f ${LIBFFI_BUILD_DIR}/Makefile ]; then \
|
34
|
+
echo "Configuring libffi"; \
|
35
|
+
cd ${LIBFFI_BUILD_DIR} && \
|
36
|
+
/usr/bin/env CC="${CC}" LD="${LD}" CFLAGS="${LIBFFI_CFLAGS}" GREP_OPTIONS="" \
|
37
|
+
/bin/sh ${LIBFFI_CONFIGURE} ${LIBFFI_HOST} > /dev/null; \
|
38
|
+
fi
|
39
|
+
@cd ${LIBFFI_BUILD_DIR} && ${MAKE}
|
40
|
+
|
@@ -0,0 +1,105 @@
|
|
1
|
+
# -*- makefile -*-
|
2
|
+
|
3
|
+
include ${srcdir}/libffi.gnu.mk
|
4
|
+
|
5
|
+
CCACHE := $(shell type -p ccache)
|
6
|
+
BUILD_DIR := $(shell pwd)
|
7
|
+
|
8
|
+
INCFLAGS += -I"$(BUILD_DIR)"
|
9
|
+
|
10
|
+
# Work out which arches we need to compile the lib for
|
11
|
+
ARCHES :=
|
12
|
+
ARCHFLAGS ?= $(filter -arch %, $(CFLAGS))
|
13
|
+
|
14
|
+
ifneq ($(findstring -arch ppc,$(ARCHFLAGS)),)
|
15
|
+
ARCHES += ppc
|
16
|
+
endif
|
17
|
+
|
18
|
+
ifneq ($(findstring -arch i386,$(ARCHFLAGS)),)
|
19
|
+
ARCHES += i386
|
20
|
+
endif
|
21
|
+
|
22
|
+
ifneq ($(findstring -arch x86_64,$(ARCHFLAGS)),)
|
23
|
+
ARCHES += x86_64
|
24
|
+
endif
|
25
|
+
|
26
|
+
ifeq ($(strip $(ARCHES)),)
|
27
|
+
LIBFFI_BUILD_DIR = $(BUILD_DIR)/libffi-$(arch)
|
28
|
+
# Just build the one (default) architecture
|
29
|
+
$(LIBFFI):
|
30
|
+
@mkdir -p "$(LIBFFI_BUILD_DIR)" "$(@D)"
|
31
|
+
@if [ ! -f "$(LIBFFI_BUILD_DIR)"/configure ]; then \
|
32
|
+
echo "Running autoreconf for libffi"; \
|
33
|
+
cd "$(LIBFFI_SRC_DIR)" && \
|
34
|
+
/bin/sh $(LIBFFI_AUTOGEN) > /dev/null; \
|
35
|
+
fi
|
36
|
+
@if [ ! -f "$(LIBFFI_BUILD_DIR)"/Makefile ]; then \
|
37
|
+
echo "Configuring libffi"; \
|
38
|
+
cd "$(LIBFFI_BUILD_DIR)" && \
|
39
|
+
/usr/bin/env CC="$(CC)" LD="$(LD)" CFLAGS="$(LIBFFI_CFLAGS)" GREP_OPTIONS="" \
|
40
|
+
/bin/sh $(LIBFFI_CONFIGURE) $(LIBFFI_HOST) > /dev/null; \
|
41
|
+
fi
|
42
|
+
cd "$(LIBFFI_BUILD_DIR)" && $(MAKE)
|
43
|
+
|
44
|
+
else
|
45
|
+
LIBTARGETS = $(foreach arch,$(ARCHES),"$(BUILD_DIR)"/libffi-$(arch)/.libs/libffi_convenience.a)
|
46
|
+
|
47
|
+
# Build a fat binary and assemble
|
48
|
+
build_ffi = \
|
49
|
+
mkdir -p "$(BUILD_DIR)"/libffi-$(1); \
|
50
|
+
(if [ ! -f "$(BUILD_DIR)"/libffi-$(1)/configure ]; then \
|
51
|
+
echo "Running autoreconf for libffi"; \
|
52
|
+
cd "$(LIBFFI_SRC_DIR)" && \
|
53
|
+
/bin/sh $(LIBFFI_AUTOGEN) > /dev/null; \
|
54
|
+
fi); \
|
55
|
+
(if [ ! -f "$(BUILD_DIR)"/libffi-$(1)/Makefile ]; then \
|
56
|
+
echo "Configuring libffi for $(1)"; \
|
57
|
+
cd "$(BUILD_DIR)"/libffi-$(1) && \
|
58
|
+
env CC="$(CCACHE) $(CC)" CFLAGS="-arch $(1) $(LIBFFI_CFLAGS)" LDFLAGS="-arch $(1)" \
|
59
|
+
$(LIBFFI_CONFIGURE) --host=$(1)-apple-darwin > /dev/null; \
|
60
|
+
fi); \
|
61
|
+
env MACOSX_DEPLOYMENT_TARGET=10.4 $(MAKE) -C "$(BUILD_DIR)"/libffi-$(1)
|
62
|
+
|
63
|
+
target_ffi = "$(BUILD_DIR)"/libffi-$(1)/.libs/libffi_convenience.a:; $(call build_ffi,$(1))
|
64
|
+
|
65
|
+
# Work out which arches we need to compile the lib for
|
66
|
+
ifneq ($(findstring ppc,$(ARCHES)),)
|
67
|
+
$(call target_ffi,ppc)
|
68
|
+
endif
|
69
|
+
|
70
|
+
ifneq ($(findstring i386,$(ARCHES)),)
|
71
|
+
$(call target_ffi,i386)
|
72
|
+
endif
|
73
|
+
|
74
|
+
ifneq ($(findstring x86_64,$(ARCHES)),)
|
75
|
+
$(call target_ffi,x86_64)
|
76
|
+
endif
|
77
|
+
|
78
|
+
|
79
|
+
$(LIBFFI): $(LIBTARGETS)
|
80
|
+
# Assemble into a FAT (x86_64, i386, ppc) library
|
81
|
+
@mkdir -p "$(@D)"
|
82
|
+
/usr/bin/libtool -static -o $@ \
|
83
|
+
$(foreach arch, $(ARCHES),"$(BUILD_DIR)"/libffi-$(arch)/.libs/libffi_convenience.a)
|
84
|
+
@mkdir -p "$(LIBFFI_BUILD_DIR)"/include
|
85
|
+
$(RM) "$(LIBFFI_BUILD_DIR)"/include/ffi.h
|
86
|
+
@( \
|
87
|
+
printf "#if defined(__i386__)\n"; \
|
88
|
+
printf "#include \"libffi-i386/include/ffi.h\"\n"; \
|
89
|
+
printf "#elif defined(__x86_64__)\n"; \
|
90
|
+
printf "#include \"libffi-x86_64/include/ffi.h\"\n";\
|
91
|
+
printf "#elif defined(__ppc__)\n"; \
|
92
|
+
printf "#include \"libffi-ppc/include/ffi.h\"\n";\
|
93
|
+
printf "#endif\n";\
|
94
|
+
) > "$(LIBFFI_BUILD_DIR)"/include/ffi.h
|
95
|
+
@( \
|
96
|
+
printf "#if defined(__i386__)\n"; \
|
97
|
+
printf "#include \"libffi-i386/include/ffitarget.h\"\n"; \
|
98
|
+
printf "#elif defined(__x86_64__)\n"; \
|
99
|
+
printf "#include \"libffi-x86_64/include/ffitarget.h\"\n";\
|
100
|
+
printf "#elif defined(__ppc__)\n"; \
|
101
|
+
printf "#include \"libffi-ppc/include/ffitarget.h\"\n";\
|
102
|
+
printf "#endif\n";\
|
103
|
+
) > "$(LIBFFI_BUILD_DIR)"/include/ffitarget.h
|
104
|
+
|
105
|
+
endif
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# -*- makefile -*-
|
2
|
+
#
|
3
|
+
# Common definitions for all systems that use GNU make
|
4
|
+
#
|
5
|
+
|
6
|
+
|
7
|
+
# Tack the extra deps onto the autogenerated variables
|
8
|
+
INCFLAGS += -I"$(LIBFFI_BUILD_DIR)"/include
|
9
|
+
LOCAL_LIBS += $(LIBFFI)
|
10
|
+
BUILD_DIR = $(shell pwd)
|
11
|
+
LIBFFI_CFLAGS = $(FFI_MMAP_EXEC)
|
12
|
+
LIBFFI_BUILD_DIR = $(BUILD_DIR)/libffi-$(arch)
|
13
|
+
|
14
|
+
ifeq ($(srcdir),.)
|
15
|
+
LIBFFI_SRC_DIR := $(shell pwd)/libffi
|
16
|
+
else ifeq ($(srcdir),..)
|
17
|
+
LIBFFI_SRC_DIR := $(shell pwd)/../libffi
|
18
|
+
else
|
19
|
+
LIBFFI_SRC_DIR := $(realpath $(srcdir)/libffi)
|
20
|
+
endif
|
21
|
+
|
22
|
+
LIBFFI = "$(LIBFFI_BUILD_DIR)"/.libs/libffi_convenience.a
|
23
|
+
LIBFFI_AUTOGEN = ${LIBFFI_SRC_DIR}/autogen.sh
|
24
|
+
LIBFFI_CONFIGURE = "$(LIBFFI_SRC_DIR)"/configure --disable-static \
|
25
|
+
--with-pic=yes --disable-dependency-tracking --disable-docs
|
26
|
+
|
27
|
+
$(OBJS): $(LIBFFI)
|
28
|
+
|
29
|
+
#
|
30
|
+
# libffi.mk or libffi.darwin.mk contains rules for building the actual library
|
31
|
+
#
|
32
|
+
|
data/ext/ffi_c/libffi.mk
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
# -*- makefile -*-
|
2
|
+
|
3
|
+
include ${srcdir}/libffi.gnu.mk
|
4
|
+
|
5
|
+
$(LIBFFI):
|
6
|
+
@mkdir -p "$(LIBFFI_BUILD_DIR)" "$@(D)"
|
7
|
+
@if [ ! -f "$(LIBFFI_BUILD_DIR)"/configure ]; then \
|
8
|
+
echo "Running autoreconf for libffi"; \
|
9
|
+
cd "$(LIBFFI_SRC_DIR)" && \
|
10
|
+
/bin/sh $(LIBFFI_AUTOGEN) > /dev/null; \
|
11
|
+
fi
|
12
|
+
@if [ ! -f "$(LIBFFI_BUILD_DIR)"/Makefile ]; then \
|
13
|
+
echo "Configuring libffi"; \
|
14
|
+
cd "$(LIBFFI_BUILD_DIR)" && \
|
15
|
+
env CFLAGS="$(LIBFFI_CFLAGS)" GREP_OPTIONS="" \
|
16
|
+
sh $(LIBFFI_CONFIGURE) $(LIBFFI_HOST) > /dev/null; \
|
17
|
+
fi
|
18
|
+
$(MAKE) -C "$(LIBFFI_BUILD_DIR)"
|