narray_ffi 1.0.0 → 1.1.0
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 +4 -4
- data/ext/narray_ffi_c/narray_ffi.c +153 -1
- data/lib/narray_ffi.rb +6 -1
- data/narray_ffi.gemspec +2 -2
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1d1fd3b17183842cb75ec77fef2754c7fc9266a8
|
4
|
+
data.tar.gz: d652418d88d7ce7df105336d628f2a0cdbf6619e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 362cab7657d9a7a00a1b84933a1c436395694c68a244904b8eb5fa9af4edb71191852f23578fb13c713554729a21d07b5fb03b061469f1f3aa407dfbd8df7e1f
|
7
|
+
data.tar.gz: 91d3336406830ddee1a4c1c458cd5df888a73666522ea56ac970c40306cfb1a92fa3a5555cc1013dc05fb46284d7953215a5e20b107696b9acb51ce207764d26
|
@@ -1,7 +1,9 @@
|
|
1
1
|
#include "ruby.h"
|
2
2
|
#include "narray.h"
|
3
3
|
|
4
|
-
|
4
|
+
static VALUE
|
5
|
+
na_address(VALUE self)
|
6
|
+
{
|
5
7
|
struct NARRAY *ary;
|
6
8
|
void * ptr;
|
7
9
|
VALUE ret;
|
@@ -12,11 +14,161 @@ VALUE na_address(VALUE self) {
|
|
12
14
|
return ret;
|
13
15
|
}
|
14
16
|
|
17
|
+
static struct NARRAY*
|
18
|
+
na_alloc_struct_empty(int type, int rank, int *shape)
|
19
|
+
{
|
20
|
+
int total=1, total_bak;
|
21
|
+
int i, memsz;
|
22
|
+
struct NARRAY *ary;
|
23
|
+
|
24
|
+
for (i=0; i<rank; ++i) {
|
25
|
+
if (shape[i] < 0) {
|
26
|
+
rb_raise(rb_eArgError, "negative array size");
|
27
|
+
} else if (shape[i] == 0) {
|
28
|
+
total = 0;
|
29
|
+
break;
|
30
|
+
}
|
31
|
+
total_bak = total;
|
32
|
+
total *= shape[i];
|
33
|
+
if (total < 1 || total > 2147483647 || total/shape[i] != total_bak) {
|
34
|
+
rb_raise(rb_eArgError, "array size is too large");
|
35
|
+
}
|
36
|
+
}
|
37
|
+
|
38
|
+
if (rank<=0 || total<=0) {
|
39
|
+
/* empty array */
|
40
|
+
ary = ALLOC(struct NARRAY);
|
41
|
+
ary->rank =
|
42
|
+
ary->total = 0;
|
43
|
+
ary->shape = NULL;
|
44
|
+
ary->ptr = NULL;
|
45
|
+
ary->type = type;
|
46
|
+
}
|
47
|
+
else {
|
48
|
+
memsz = na_sizeof[type] * total;
|
49
|
+
|
50
|
+
if (memsz < 1 || memsz > 2147483647 || memsz/na_sizeof[type] != total) {
|
51
|
+
rb_raise(rb_eArgError, "allocation size is too large");
|
52
|
+
}
|
53
|
+
|
54
|
+
/* Garbage Collection */
|
55
|
+
#ifdef NARRAY_GC
|
56
|
+
mem_count += memsz;
|
57
|
+
if ( mem_count > na_gc_freq ) { rb_gc(); mem_count=0; }
|
58
|
+
#endif
|
59
|
+
|
60
|
+
ary = ALLOC(struct NARRAY);
|
61
|
+
ary->shape = ALLOC_N(int, rank);
|
62
|
+
|
63
|
+
ary->rank = rank;
|
64
|
+
ary->total = total;
|
65
|
+
ary->type = type;
|
66
|
+
for (i=0; i<rank; ++i)
|
67
|
+
ary->shape[i] = shape[i];
|
68
|
+
}
|
69
|
+
ary->ref = Qtrue;
|
70
|
+
return ary;
|
71
|
+
}
|
72
|
+
|
73
|
+
static void
|
74
|
+
na_free_empty(struct NARRAY* ary)
|
75
|
+
{
|
76
|
+
if ( ary->total > 0 ) {
|
77
|
+
xfree(ary->shape);
|
78
|
+
}
|
79
|
+
xfree(ary);
|
80
|
+
}
|
81
|
+
|
82
|
+
static void
|
83
|
+
na_mark_ref_empty(struct NARRAY *ary)
|
84
|
+
{
|
85
|
+
struct NARRAY *a2;
|
86
|
+
|
87
|
+
rb_gc_mark( ary->ref );
|
88
|
+
|
89
|
+
}
|
90
|
+
|
91
|
+
static VALUE
|
92
|
+
na_make_object_empty(int type, int rank, int *shape, VALUE klass, VALUE pointer)
|
93
|
+
{
|
94
|
+
struct NARRAY *na;
|
95
|
+
|
96
|
+
na = na_alloc_struct_empty(type, rank, shape);
|
97
|
+
na->ref = pointer;
|
98
|
+
|
99
|
+
return Data_Wrap_Struct(klass, na_mark_ref_empty, na_free_empty, na);
|
100
|
+
}
|
101
|
+
|
102
|
+
|
103
|
+
static VALUE
|
104
|
+
na_pointer_to_na(int argc, VALUE *argv, VALUE pointer)
|
105
|
+
{
|
106
|
+
struct NARRAY *ary;
|
107
|
+
VALUE v;
|
108
|
+
void * ptr;
|
109
|
+
VALUE address;
|
110
|
+
int i, type, len=1, pointer_len, *shape, rank=argc-1;
|
111
|
+
|
112
|
+
if (argc < 1)
|
113
|
+
rb_raise(rb_eArgError, "Type and Size Arguments required");
|
114
|
+
|
115
|
+
type = na_get_typecode(argv[0]);
|
116
|
+
if (type==NA_ROBJ)
|
117
|
+
rb_raise(rb_eArgError, "Invalid type");
|
118
|
+
|
119
|
+
address = rb_funcall(pointer, rb_intern("address"), 0);
|
120
|
+
ptr = sizeof(ptr) == 4 ? (void *) NUM2ULONG(address) : (void *) NUM2ULL(address);
|
121
|
+
|
122
|
+
pointer_len = NUM2INT(rb_funcall(pointer, rb_intern("size"), 0));
|
123
|
+
|
124
|
+
if (argc == 1) {
|
125
|
+
rank = 1;
|
126
|
+
shape = ALLOCA_N(int,rank);
|
127
|
+
if ( pointer_len % na_sizeof[type] != 0 )
|
128
|
+
rb_raise(rb_eArgError, "pointer size mismatch");
|
129
|
+
shape[0] = pointer_len / na_sizeof[type];
|
130
|
+
}
|
131
|
+
else {
|
132
|
+
shape = ALLOCA_N(int,rank);
|
133
|
+
for (i=0; i<rank; i++)
|
134
|
+
len *= shape[i] = NUM2INT(argv[i+1]);
|
135
|
+
len *= na_sizeof[type];
|
136
|
+
if ( len != pointer_len )
|
137
|
+
rb_raise(rb_eArgError, "pointer size mismatch");
|
138
|
+
}
|
139
|
+
|
140
|
+
v = na_make_object_empty( type, rank, shape, cNArray, pointer );
|
141
|
+
GetNArray(v,ary);
|
142
|
+
ary->ptr = ptr;
|
143
|
+
|
144
|
+
return v;
|
145
|
+
}
|
146
|
+
|
147
|
+
static VALUE
|
148
|
+
na_s_to_na_pointer(int argc, VALUE *argv, VALUE klass)
|
149
|
+
{
|
150
|
+
VALUE mod;
|
151
|
+
VALUE klass_p;
|
152
|
+
if (argc < 1){
|
153
|
+
rb_raise(rb_eArgError, "Argument is required");
|
154
|
+
}
|
155
|
+
mod = rb_const_get(rb_cObject, rb_intern("FFI"));
|
156
|
+
if (mod != Qnil) {
|
157
|
+
klass_p = rb_const_get(mod, rb_intern("Pointer"));
|
158
|
+
if ( rb_funcall(argv[0], rb_intern("kind_of?"), 1, klass_p) == Qtrue ){
|
159
|
+
return na_pointer_to_na(argc-1,argv+1,argv[0]);
|
160
|
+
}
|
161
|
+
}
|
162
|
+
rb_funcall2(klass, rb_intern("to_na_old"), argc, argv);
|
163
|
+
}
|
164
|
+
|
15
165
|
void Init_narray_ffi_c() {
|
16
166
|
ID id;
|
17
167
|
VALUE klass;
|
18
168
|
id = rb_intern("NArray");
|
19
169
|
klass = rb_const_get(rb_cObject, id);
|
20
170
|
rb_define_private_method(klass, "address", na_address, 0);
|
171
|
+
rb_define_singleton_method(klass, "to_na", na_s_to_na_pointer, -1);
|
172
|
+
rb_define_singleton_method(klass, "to_narray", na_s_to_na_pointer, -1);
|
21
173
|
}
|
22
174
|
|
data/lib/narray_ffi.rb
CHANGED
@@ -1,9 +1,14 @@
|
|
1
1
|
require "narray"
|
2
2
|
require "ffi"
|
3
|
+
class NArray
|
4
|
+
class << self
|
5
|
+
alias to_na_old to_na
|
6
|
+
end
|
7
|
+
end
|
3
8
|
require "narray_ffi_c.so"
|
4
9
|
|
5
10
|
class NArray
|
6
11
|
def to_ptr
|
7
|
-
return FFI::Pointer::new( address() )
|
12
|
+
return FFI::Pointer::new( address() ).slice(0, size*element_size)
|
8
13
|
end
|
9
14
|
end
|
data/narray_ffi.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = 'narray_ffi'
|
3
|
-
s.version = "1.
|
3
|
+
s.version = "1.1.0"
|
4
4
|
s.author = "Brice Videau"
|
5
5
|
s.email = "brice.videau@imag.fr"
|
6
6
|
s.homepage = "https://forge.imag.fr/projects/opencl-ruby/"
|
@@ -11,6 +11,6 @@ Gem::Specification.new do |s|
|
|
11
11
|
s.has_rdoc = false
|
12
12
|
s.license = 'BSD'
|
13
13
|
s.required_ruby_version = '>= 1.8.7'
|
14
|
-
s.add_dependency 'narray', '~> 0.6
|
14
|
+
s.add_dependency 'narray', '~> 0.6', '>=0.6.0.8'
|
15
15
|
s.add_dependency 'ffi', '~> 1.9', '>=1.9.3'
|
16
16
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: narray_ffi
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brice Videau
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-09-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: narray
|
@@ -16,7 +16,7 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 0.6
|
19
|
+
version: '0.6'
|
20
20
|
- - ">="
|
21
21
|
- !ruby/object:Gem::Version
|
22
22
|
version: 0.6.0.8
|
@@ -26,7 +26,7 @@ dependencies:
|
|
26
26
|
requirements:
|
27
27
|
- - "~>"
|
28
28
|
- !ruby/object:Gem::Version
|
29
|
-
version: 0.6
|
29
|
+
version: '0.6'
|
30
30
|
- - ">="
|
31
31
|
- !ruby/object:Gem::Version
|
32
32
|
version: 0.6.0.8
|