ndtypes 0.2.0dev4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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.
|