ndtypes 0.2.0dev4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/CONTRIBUTING.md +50 -0
- data/Gemfile +2 -0
- data/History.md +0 -0
- data/README.md +19 -0
- data/Rakefile +125 -0
- data/ext/ruby_ndtypes/extconf.rb +55 -0
- data/ext/ruby_ndtypes/gc_guard.c +36 -0
- data/ext/ruby_ndtypes/gc_guard.h +12 -0
- data/ext/ruby_ndtypes/ndtypes/AUTHORS.txt +5 -0
- data/ext/ruby_ndtypes/ndtypes/INSTALL.txt +101 -0
- data/ext/ruby_ndtypes/ndtypes/LICENSE.txt +29 -0
- data/ext/ruby_ndtypes/ndtypes/MANIFEST.in +3 -0
- data/ext/ruby_ndtypes/ndtypes/Makefile.in +87 -0
- data/ext/ruby_ndtypes/ndtypes/README.rst +47 -0
- data/ext/ruby_ndtypes/ndtypes/config.guess +1530 -0
- data/ext/ruby_ndtypes/ndtypes/config.h.in +67 -0
- data/ext/ruby_ndtypes/ndtypes/config.sub +1782 -0
- data/ext/ruby_ndtypes/ndtypes/configure +5260 -0
- data/ext/ruby_ndtypes/ndtypes/configure.ac +161 -0
- data/ext/ruby_ndtypes/ndtypes/doc/Makefile +14 -0
- data/ext/ruby_ndtypes/ndtypes/doc/_static/copybutton.js +66 -0
- data/ext/ruby_ndtypes/ndtypes/doc/conf.py +26 -0
- data/ext/ruby_ndtypes/ndtypes/doc/grammar/grammar.rst +27 -0
- data/ext/ruby_ndtypes/ndtypes/doc/index.rst +56 -0
- data/ext/ruby_ndtypes/ndtypes/doc/libndtypes/context.rst +131 -0
- data/ext/ruby_ndtypes/ndtypes/doc/libndtypes/encodings.rst +68 -0
- data/ext/ruby_ndtypes/ndtypes/doc/libndtypes/fields-values.rst +175 -0
- data/ext/ruby_ndtypes/ndtypes/doc/libndtypes/functions.rst +72 -0
- data/ext/ruby_ndtypes/ndtypes/doc/libndtypes/index.rst +43 -0
- data/ext/ruby_ndtypes/ndtypes/doc/libndtypes/init.rst +48 -0
- data/ext/ruby_ndtypes/ndtypes/doc/libndtypes/io.rst +100 -0
- data/ext/ruby_ndtypes/ndtypes/doc/libndtypes/memory.rst +124 -0
- data/ext/ruby_ndtypes/ndtypes/doc/libndtypes/predicates.rst +110 -0
- data/ext/ruby_ndtypes/ndtypes/doc/libndtypes/typedef.rst +31 -0
- data/ext/ruby_ndtypes/ndtypes/doc/libndtypes/types.rst +594 -0
- data/ext/ruby_ndtypes/ndtypes/doc/libndtypes/util.rst +166 -0
- data/ext/ruby_ndtypes/ndtypes/doc/ndtypes/buffer-protocol.rst +27 -0
- data/ext/ruby_ndtypes/ndtypes/doc/ndtypes/index.rst +21 -0
- data/ext/ruby_ndtypes/ndtypes/doc/ndtypes/pattern-matching.rst +330 -0
- data/ext/ruby_ndtypes/ndtypes/doc/ndtypes/quickstart.rst +144 -0
- data/ext/ruby_ndtypes/ndtypes/doc/ndtypes/types.rst +544 -0
- data/ext/ruby_ndtypes/ndtypes/doc/releases/index.rst +35 -0
- data/ext/ruby_ndtypes/ndtypes/install-sh +527 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/Makefile.in +271 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/Makefile.vc +269 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/alloc.c +230 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/attr.c +268 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/attr.h +109 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/Makefile.in +73 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/Makefile.vc +70 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/README.txt +16 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/bpgrammar.c +2179 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/bpgrammar.h +134 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/bpgrammar.y +428 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/bplexer.c +2543 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/bplexer.h +735 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/bplexer.l +176 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/export.c +543 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/import.c +110 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/context.c +228 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/copy.c +634 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/encodings.c +116 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/equal.c +288 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/grammar.c +3067 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/grammar.h +180 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/grammar.y +417 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/io.c +1658 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/lexer.c +2773 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/lexer.h +734 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/lexer.l +222 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/match.c +1132 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/ndtypes.c +2323 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/ndtypes.h.in +893 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/overflow.h +161 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/parsefuncs.c +473 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/parsefuncs.h +92 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/parser.c +246 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/seq.c +269 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/seq.h +197 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/serialize/Makefile.in +48 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/serialize/Makefile.vc +46 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/serialize/deserialize.c +1007 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/serialize/serialize.c +442 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/slice.h +42 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/substitute.c +238 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/substitute.h +50 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/symtable.c +371 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/symtable.h +100 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/Makefile.in +55 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/Makefile.vc +45 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/alloc_fail.c +82 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/alloc_fail.h +49 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/runtest.c +1657 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test.h +85 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_array.c +115 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_buffer.c +137 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_indent.c +201 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_match.c +2397 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_numba.c +57 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_parse.c +349 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_parse_error.c +27839 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_parse_roundtrip.c +350 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_record.c +231 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_typecheck.c +375 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_typedef.c +65 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/valgrind.supp +30 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tools/bench.c +79 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tools/indent.c +94 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tools/print_ast.c +96 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/util.c +474 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/values.c +228 -0
- data/ext/ruby_ndtypes/ndtypes/python/bench.py +49 -0
- data/ext/ruby_ndtypes/ndtypes/python/ndt_randtype.py +409 -0
- data/ext/ruby_ndtypes/ndtypes/python/ndt_support.py +14 -0
- data/ext/ruby_ndtypes/ndtypes/python/ndtypes/__init__.py +70 -0
- data/ext/ruby_ndtypes/ndtypes/python/ndtypes/_ndtypes.c +1332 -0
- data/ext/ruby_ndtypes/ndtypes/python/ndtypes/docstrings.h +319 -0
- data/ext/ruby_ndtypes/ndtypes/python/ndtypes/pyndtypes.h +154 -0
- data/ext/ruby_ndtypes/ndtypes/python/test_ndtypes.py +1977 -0
- data/ext/ruby_ndtypes/ndtypes/setup.py +288 -0
- data/ext/ruby_ndtypes/ndtypes/vcbuild/INSTALL.txt +41 -0
- data/ext/ruby_ndtypes/ndtypes/vcbuild/runtest32.bat +15 -0
- data/ext/ruby_ndtypes/ndtypes/vcbuild/runtest64.bat +13 -0
- data/ext/ruby_ndtypes/ndtypes/vcbuild/vcbuild32.bat +38 -0
- data/ext/ruby_ndtypes/ndtypes/vcbuild/vcbuild64.bat +38 -0
- data/ext/ruby_ndtypes/ndtypes/vcbuild/vcclean.bat +13 -0
- data/ext/ruby_ndtypes/ndtypes/vcbuild/vcdistclean.bat +14 -0
- data/ext/ruby_ndtypes/ruby_ndtypes.c +1003 -0
- data/ext/ruby_ndtypes/ruby_ndtypes.h +37 -0
- data/ext/ruby_ndtypes/ruby_ndtypes_internal.h +28 -0
- data/lib/ndtypes.rb +45 -0
- data/lib/ndtypes/errors.rb +2 -0
- data/lib/ndtypes/version.rb +6 -0
- data/ndtypes.gemspec +47 -0
- data/spec/gc_table_spec.rb +10 -0
- data/spec/ndtypes_spec.rb +289 -0
- data/spec/spec_helper.rb +241 -0
- metadata +242 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 1e4f279735d63cdb4899d3df98a78dcde783ea64
|
4
|
+
data.tar.gz: 48e2f95ae6030f6c333ffbf88d8b253f6950830b
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 9f23ebcc82f55ddd54e2417a106e4ab0bf9804ee5c8e951e65f6366b4530bc60a6d0e1992ed5aad32d734ff709f62473e6ce6b9fe2a4ac8f4f8b6c7417fcf008
|
7
|
+
data.tar.gz: 5006d479c176243f23e9956a25890b0caf3df0b1cee7a1546fccc7f1e8b64dd6bfad3b8dddfa796146e9a296cbb32904fe850e84465a77ec9968bd748fec8402
|
data/CONTRIBUTING.md
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
# Developer notes
|
2
|
+
|
3
|
+
## Interfacing with Ruby's GC
|
4
|
+
|
5
|
+
### Background
|
6
|
+
|
7
|
+
Ruby uses a mark-and-sweep GC that scans the entire Ruby interpreter stack for
|
8
|
+
objects that have gone out of scope and can be freed from memory. It does not
|
9
|
+
offer any of the reference counting mechanism that the Python GC offers.
|
10
|
+
|
11
|
+
While both approaches have their pros and cons, in the context of the ndtypes
|
12
|
+
wrapper, it becomes risky to have 'internal' Ruby objects that are only visible
|
13
|
+
to the C API and are shared between multiple user-facing Ruby objecs. If one of
|
14
|
+
the user-facing objects goes out of scope there is a possibilty that the GC will
|
15
|
+
clean up the internal object that is shared between multiple user-facing objects
|
16
|
+
(some of which might still be in use) and that will lead to segfaults.
|
17
|
+
|
18
|
+
To avoid such a situation, in ndtypes we use a 'global GC guard' (inspired by @mrkn's
|
19
|
+
[pycall.rb](https://github.com/mrkn/pycall.rb) gem) that stores the reference to the internal objects in a global Hash
|
20
|
+
so that they don't go out of scope. When a user-facing object needs to be freed, we remove
|
21
|
+
the reference to the user-facing object and its corresponding internal object from the
|
22
|
+
global Hash.
|
23
|
+
|
24
|
+
### Details
|
25
|
+
|
26
|
+
More concretely, the `NdtObject` struct houses a `VALUE` object called `rbuf`. The struct
|
27
|
+
has the following definition:
|
28
|
+
```
|
29
|
+
typedef struct {
|
30
|
+
VALUE rbuf; /* resource buffer */
|
31
|
+
ndt_t *ndt; /* type */
|
32
|
+
} NdtObject;
|
33
|
+
```
|
34
|
+
In the above, the `rbuf` is a Ruby object that contains a struct of type `ResourceBufferObject`.
|
35
|
+
This is the internal object that need to be shared among multiple user-facing `NDTypes` objects.
|
36
|
+
|
37
|
+
The `gc_guard.c` file contains functions that help us interface with a global hash called
|
38
|
+
`__gc_guard_table` that is present under the `NDTypes::GCGuard` module as a instance variable
|
39
|
+
on the module object.
|
40
|
+
|
41
|
+
### Impact on contributor
|
42
|
+
|
43
|
+
Whenever you allocate an `NDTypes` object you call the `gc_guard_register` function and pass
|
44
|
+
it the pointer of the `NdtObject` struct that you have allocated along with the `rbuf` object.
|
45
|
+
|
46
|
+
When an `NDTypes` objects needs to be freed (for example by the GC using the `NDTypes_dfree`
|
47
|
+
function), you must call the `gc_guard_unregister` function that will remove the reference
|
48
|
+
to the `rbuf` object from the global Hash.
|
49
|
+
|
50
|
+
Forgetting to call above procedures can lead to hard-to-trace GC errors.
|
data/Gemfile
ADDED
data/History.md
ADDED
File without changes
|
data/README.md
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
# ndtypes
|
2
|
+
|
3
|
+
Ruby wrapper over the libndtypes library.
|
4
|
+
|
5
|
+
# Installation
|
6
|
+
|
7
|
+
Run `gem install ndtypes --pre` to install on your machine.
|
8
|
+
|
9
|
+
# Usage
|
10
|
+
|
11
|
+
|
12
|
+
|
13
|
+
# Tests
|
14
|
+
|
15
|
+
Run `rspec`.
|
16
|
+
|
17
|
+
# Contributing
|
18
|
+
|
19
|
+
Read the `CONTRIBUTING.md` file to know how to contribute to NDTypes.
|
data/Rakefile
ADDED
@@ -0,0 +1,125 @@
|
|
1
|
+
require 'rake'
|
2
|
+
require 'rake/extensiontask'
|
3
|
+
require 'rspec/core/rake_task'
|
4
|
+
require 'bundler/gem_tasks'
|
5
|
+
require 'fileutils'
|
6
|
+
require "ndtypes/version.rb"
|
7
|
+
|
8
|
+
gemspec = eval(IO.read("ndtypes.gemspec"))
|
9
|
+
|
10
|
+
ext_name = "ruby_ndtypes"
|
11
|
+
Rake::ExtensionTask.new(ext_name, gemspec) do |ext|
|
12
|
+
ext.ext_dir = "ext/#{ext_name}"
|
13
|
+
ext.source_pattern = "**/*.{c, h}"
|
14
|
+
end
|
15
|
+
|
16
|
+
def run *cmd
|
17
|
+
sh(cmd.join(" "))
|
18
|
+
end
|
19
|
+
|
20
|
+
BASEDIR = Pathname( __FILE__ ).dirname.relative_path_from( Pathname.pwd )
|
21
|
+
SPECDIR = BASEDIR + 'spec'
|
22
|
+
|
23
|
+
VALGRIND_OPTIONS = [
|
24
|
+
"--tool=memcheck",
|
25
|
+
#"--leak-check=yes",
|
26
|
+
"--num-callers=15",
|
27
|
+
#"--error-limit=no",
|
28
|
+
"--partial-loads-ok=yes",
|
29
|
+
"--undef-value-errors=no" #,
|
30
|
+
#"--dsymutil=yes"
|
31
|
+
]
|
32
|
+
|
33
|
+
CALLGRIND_OPTIONS = [
|
34
|
+
"--tool=callgrind",
|
35
|
+
"--dump-instr=yes",
|
36
|
+
"--simulate-cache=yes",
|
37
|
+
"--collect-jumps=yes"
|
38
|
+
]
|
39
|
+
|
40
|
+
VALGRIND_MEMORYFILL_OPTIONS = [
|
41
|
+
"--freelist-vol=100000000",
|
42
|
+
"--malloc-fill=6D",
|
43
|
+
"--free-fill=66 ",
|
44
|
+
]
|
45
|
+
|
46
|
+
GDB_OPTIONS = []
|
47
|
+
|
48
|
+
namespace :spec do
|
49
|
+
# partial-loads-ok and undef-value-errors necessary to ignore
|
50
|
+
# spurious (and eminently ignorable) warnings from the ruby
|
51
|
+
# interpreter
|
52
|
+
|
53
|
+
RSPEC_CMD = [ 'ruby', '-S', 'rspec', '-Ilib:ext', SPECDIR.to_s ]
|
54
|
+
|
55
|
+
desc "Run specs under GDB."
|
56
|
+
task :gdb => [ :compile ] do |task|
|
57
|
+
cmd = [ 'gdb' ] + GDB_OPTIONS
|
58
|
+
cmd += [ '--args' ]
|
59
|
+
cmd += RSPEC_CMD
|
60
|
+
run( *cmd )
|
61
|
+
end
|
62
|
+
|
63
|
+
desc "Run specs under cgdb."
|
64
|
+
task :cgdb => [ :compile ] do |task|
|
65
|
+
cmd = [ 'cgdb' ] + GDB_OPTIONS
|
66
|
+
cmd += [ '--args' ]
|
67
|
+
cmd += RSPEC_CMD
|
68
|
+
run( *cmd )
|
69
|
+
end
|
70
|
+
|
71
|
+
desc "Run specs under Valgrind."
|
72
|
+
task :valgrind => [ :compile ] do |task|
|
73
|
+
cmd = [ 'valgrind' ] + VALGRIND_OPTIONS
|
74
|
+
cmd += RSPEC_CMD
|
75
|
+
run( *cmd )
|
76
|
+
end
|
77
|
+
|
78
|
+
desc "Run specs under Callgrind."
|
79
|
+
task :callgrind => [ :compile ] do |task|
|
80
|
+
cmd = [ 'valgrind' ] + CALLGRIND_OPTIONS
|
81
|
+
cmd += RSPEC_CMD
|
82
|
+
run( *cmd )
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
LEAKCHECK_CMD = [ 'ruby', '-Ilib:ext', "#{SPECDIR}/leakcheck.rb" ]
|
87
|
+
|
88
|
+
desc "Run leakcheck script."
|
89
|
+
task :leakcheck => [ :compile ] do |task|
|
90
|
+
cmd = [ 'valgrind' ] + VALGRIND_OPTIONS
|
91
|
+
cmd += LEAKCHECK_CMD
|
92
|
+
run( *cmd )
|
93
|
+
end
|
94
|
+
|
95
|
+
task :clobber do |task|
|
96
|
+
[
|
97
|
+
"ext/#{ext_name}/include",
|
98
|
+
"ext/#{ext_name}/share",
|
99
|
+
"ext/#{ext_name}/lib",
|
100
|
+
].each do |f|
|
101
|
+
puts "deleting folder #{f}..."
|
102
|
+
FileUtils.rm_rf(f)
|
103
|
+
end
|
104
|
+
|
105
|
+
Dir.chdir("ext/#{ext_name}/ndtypes/libndtypes/") do
|
106
|
+
system("make clean")
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
task :deploy do |task|
|
111
|
+
ext_ndtypes = "ext/ruby_ndtypes/ndtypes"
|
112
|
+
puts "deleting previously created #{ext_ndtypes} directory..."
|
113
|
+
FileUtils.rm_rf(ext_ndtypes)
|
114
|
+
Dir.mkdir(ext_ndtypes)
|
115
|
+
|
116
|
+
puts "cloning ndtypes repo into ext/ folder..."
|
117
|
+
system("git clone https://github.com/plures/ndtypes #{ext_ndtypes}")
|
118
|
+
|
119
|
+
Dir.chdir(ext_ndtypes) do
|
120
|
+
system("git checkout #{NDTypes::COMMIT}")
|
121
|
+
end
|
122
|
+
|
123
|
+
puts "building gem with rake build..."
|
124
|
+
system("rake build")
|
125
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require 'mkmf'
|
2
|
+
|
3
|
+
def windows?
|
4
|
+
(/cygwin|mswin|mingw|bccwin|wince|emx/ =~ RUBY_PLATFORM) != nil
|
5
|
+
end
|
6
|
+
|
7
|
+
def mac?
|
8
|
+
(/darwin/ =~ RUBY_PLATFORM) != nil
|
9
|
+
end
|
10
|
+
|
11
|
+
def unix?
|
12
|
+
!windows?
|
13
|
+
end
|
14
|
+
|
15
|
+
puts "compiling libndtypes on your machine..."
|
16
|
+
Dir.chdir(File.join(File.dirname(__FILE__) + "/ndtypes")) do
|
17
|
+
if unix?
|
18
|
+
["libndtypes", "libndtypes/compat", "libndtypes/serialize"].each do |f|
|
19
|
+
Dir.chdir(f) do
|
20
|
+
Dir.mkdir(".objs") unless Dir.exists? ".objs"
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
system("./configure --prefix=#{File.expand_path("../")} --with-docs=no")
|
25
|
+
system("make")
|
26
|
+
system("make install")
|
27
|
+
elsif windows?
|
28
|
+
raise NotImplementedError, "need to specify build instructions for windows."
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
$INSTALLFILES = [
|
33
|
+
["ruby_ndtypes.h", "$(archdir)"]
|
34
|
+
]
|
35
|
+
binaries = File.expand_path(File.join(File.dirname(__FILE__) + "/lib/"))
|
36
|
+
headers = File.expand_path(File.join(File.dirname(__FILE__) + "/include/"))
|
37
|
+
$LOAD_PATH << File.expand_path(binaries)
|
38
|
+
|
39
|
+
["ndtypes"].each do |lib|
|
40
|
+
find_library(lib, nil, binaries)
|
41
|
+
end
|
42
|
+
|
43
|
+
["ndtypes.h"].each do |header|
|
44
|
+
find_header(header, headers)
|
45
|
+
have_header(header)
|
46
|
+
end
|
47
|
+
|
48
|
+
dir_config("ndtypes", [headers], [binaries])
|
49
|
+
|
50
|
+
basenames = %w{gc_guard ruby_ndtypes}
|
51
|
+
$objs = basenames.map { |b| "#{b}.o" }
|
52
|
+
$srcs = basenames.map { |b| "#{b}.c" }
|
53
|
+
|
54
|
+
$CFLAGS += " -O0 -g "
|
55
|
+
create_makefile("ruby_ndtypes/ruby_ndtypes")
|
@@ -0,0 +1,36 @@
|
|
1
|
+
/* Functions useful for interfacing shared rbuf objects with the Ruby GC. */
|
2
|
+
/* Author: Sameer Deshmukh (@v0dro) */
|
3
|
+
#include "ruby_ndtypes_internal.h"
|
4
|
+
|
5
|
+
#define GC_GUARD_TABLE_NAME "@__gc_guard_table"
|
6
|
+
|
7
|
+
static ID id_gc_guard_table;
|
8
|
+
|
9
|
+
/* Unregister an NDT object-rbuf pair from the GC guard. */
|
10
|
+
void
|
11
|
+
rb_ndtypes_gc_guard_unregister(NdtObject *ndt)
|
12
|
+
{
|
13
|
+
VALUE table = rb_ivar_get(mNDTypes_GCGuard, id_gc_guard_table);
|
14
|
+
rb_hash_delete(table, PTR2NUM(ndt));
|
15
|
+
}
|
16
|
+
|
17
|
+
/* Register a NDT-rbuf pair in the GC guard. */
|
18
|
+
void
|
19
|
+
rb_ndtypes_gc_guard_register(NdtObject *ndt, VALUE rbuf)
|
20
|
+
{
|
21
|
+
VALUE table = rb_ivar_get(mNDTypes_GCGuard, id_gc_guard_table);
|
22
|
+
if (table == Qnil) {
|
23
|
+
rb_raise(rb_eLoadError, "GC guard not initialized.");
|
24
|
+
}
|
25
|
+
|
26
|
+
rb_hash_aset(table, PTR2NUM(ndt), rbuf);
|
27
|
+
}
|
28
|
+
|
29
|
+
/* Initialize the global GC guard table. klass is a VALUE reprensenting NDTypes class. */
|
30
|
+
void
|
31
|
+
rb_ndtypes_init_gc_guard(void)
|
32
|
+
{
|
33
|
+
id_gc_guard_table = rb_intern(GC_GUARD_TABLE_NAME);
|
34
|
+
rb_ivar_set(mNDTypes_GCGuard, id_gc_guard_table, rb_hash_new());
|
35
|
+
}
|
36
|
+
|
@@ -0,0 +1,12 @@
|
|
1
|
+
/* Header file containing various functions for GC guard table. */
|
2
|
+
|
3
|
+
#ifndef GC_GUARD_H
|
4
|
+
#define GC_GUARD_H
|
5
|
+
|
6
|
+
#include "ruby_ndtypes_internal.h"
|
7
|
+
|
8
|
+
void rb_ndtypes_gc_guard_unregister(NdtObject *ndt);
|
9
|
+
void rb_ndtypesgc_guard_register(NdtObject *ndt, VALUE rbuf);
|
10
|
+
void rb_ndtypes_init_gc_guard(VALUE cNDTypes);
|
11
|
+
|
12
|
+
#endif /* GC_GUARD_H */
|
@@ -0,0 +1,101 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
Unix: libndtypes build instructions
|
4
|
+
===================================
|
5
|
+
|
6
|
+
# Build
|
7
|
+
./configure
|
8
|
+
make
|
9
|
+
|
10
|
+
# Test
|
11
|
+
make check
|
12
|
+
|
13
|
+
# Install
|
14
|
+
make install
|
15
|
+
|
16
|
+
# Clean
|
17
|
+
make clean
|
18
|
+
|
19
|
+
# Distclean
|
20
|
+
make distclean
|
21
|
+
|
22
|
+
|
23
|
+
Windows: libndtypes build instructions
|
24
|
+
======================================
|
25
|
+
|
26
|
+
See vcbuild/INSTALL.txt.
|
27
|
+
|
28
|
+
|
29
|
+
|
30
|
+
Unix/Windows: Python module build instructions
|
31
|
+
==============================================
|
32
|
+
|
33
|
+
To avoid shared library mismatches, the Python module builds with an rpath
|
34
|
+
and ships the library inside the package.
|
35
|
+
|
36
|
+
Unless you are a distributor with tight control over the system library
|
37
|
+
versions, it is not recommended to install the library for the Python
|
38
|
+
module.
|
39
|
+
|
40
|
+
|
41
|
+
Build all
|
42
|
+
---------
|
43
|
+
|
44
|
+
# Build libndtypes and the module (libndtypes is copied into the package)
|
45
|
+
python3 setup.py build
|
46
|
+
|
47
|
+
# Test
|
48
|
+
python3 setup.py test
|
49
|
+
|
50
|
+
# Doctest (optional, relies on Sphinx)
|
51
|
+
python3 setup.py doctest
|
52
|
+
|
53
|
+
# Install
|
54
|
+
python3 setup.py install
|
55
|
+
|
56
|
+
# Clean libndtypes and the module
|
57
|
+
python3 setup.py distclean
|
58
|
+
|
59
|
+
|
60
|
+
Build the module only (for developing)
|
61
|
+
--------------------------------------
|
62
|
+
|
63
|
+
First, build libndtypes as above. This also copies the shared library into
|
64
|
+
the package. Then, to avoid rebuilding the library repeatedly, use:
|
65
|
+
|
66
|
+
# Build the module
|
67
|
+
python3 setup.py module
|
68
|
+
|
69
|
+
# Clean the module
|
70
|
+
python3 setup.py clean
|
71
|
+
|
72
|
+
|
73
|
+
Alternative install (for developing)
|
74
|
+
------------------------------------
|
75
|
+
|
76
|
+
# Install the package into a local directory. This is mainly useful for
|
77
|
+
# developing xnd or gufuncs:
|
78
|
+
python3 setup.py install --local="$PWD/../python"
|
79
|
+
|
80
|
+
# Windows:
|
81
|
+
python.exe setup.py install --local="%cd%\..\python"
|
82
|
+
|
83
|
+
|
84
|
+
Alternative install with conda (for developing)
|
85
|
+
-----------------------------------------------
|
86
|
+
|
87
|
+
# Install the ndtypes package into a local directory.
|
88
|
+
|
89
|
+
# Create and activate a new conda environment:
|
90
|
+
conda create --name xnd python=3.7
|
91
|
+
conda activate xnd
|
92
|
+
|
93
|
+
# Use conda to build libndtypes and ndtypes:
|
94
|
+
conda build .conda/libndtypes
|
95
|
+
conda build .conda/ndtypes
|
96
|
+
|
97
|
+
# Use conda to install the local version of the library and the
|
98
|
+
# Python module:
|
99
|
+
conda install --use-local ndtypes
|
100
|
+
|
101
|
+
|
@@ -0,0 +1,29 @@
|
|
1
|
+
BSD 3-Clause License
|
2
|
+
|
3
|
+
Copyright (c) 2017-2018, plures
|
4
|
+
All rights reserved.
|
5
|
+
|
6
|
+
Redistribution and use in source and binary forms, with or without
|
7
|
+
modification, are permitted provided that the following conditions are met:
|
8
|
+
|
9
|
+
* Redistributions of source code must retain the above copyright notice, this
|
10
|
+
list of conditions and the following disclaimer.
|
11
|
+
|
12
|
+
* Redistributions in binary form must reproduce the above copyright notice,
|
13
|
+
this list of conditions and the following disclaimer in the documentation
|
14
|
+
and/or other materials provided with the distribution.
|
15
|
+
|
16
|
+
* Neither the name of the copyright holder nor the names of its
|
17
|
+
contributors may be used to endorse or promote products derived from
|
18
|
+
this software without specific prior written permission.
|
19
|
+
|
20
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
21
|
+
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
22
|
+
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
23
|
+
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
24
|
+
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
25
|
+
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
26
|
+
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
27
|
+
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
28
|
+
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
29
|
+
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|