ndtypes 0.2.0dev5 → 0.2.0dev6
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/CONTRIBUTING.md +12 -0
- data/Rakefile +8 -0
- data/ext/ruby_ndtypes/GPATH +0 -0
- data/ext/ruby_ndtypes/GRTAGS +0 -0
- data/ext/ruby_ndtypes/GTAGS +0 -0
- data/ext/ruby_ndtypes/extconf.rb +1 -1
- data/ext/ruby_ndtypes/include/ndtypes.h +231 -122
- data/ext/ruby_ndtypes/include/ruby_ndtypes.h +1 -1
- data/ext/ruby_ndtypes/lib/libndtypes.a +0 -0
- data/ext/ruby_ndtypes/lib/libndtypes.so.0.2.0dev3 +0 -0
- data/ext/ruby_ndtypes/ndtypes/Makefile +87 -0
- data/ext/ruby_ndtypes/ndtypes/config.h +68 -0
- data/ext/ruby_ndtypes/ndtypes/config.log +477 -0
- data/ext/ruby_ndtypes/ndtypes/config.status +1027 -0
- data/ext/ruby_ndtypes/ndtypes/doc/_static/style.css +7 -0
- data/ext/ruby_ndtypes/ndtypes/doc/_templates/layout.html +2 -0
- data/ext/ruby_ndtypes/ndtypes/doc/conf.py +40 -4
- data/ext/ruby_ndtypes/ndtypes/doc/images/xndlogo.png +0 -0
- data/ext/ruby_ndtypes/ndtypes/doc/ndtypes/types.rst +1 -1
- data/ext/ruby_ndtypes/ndtypes/doc/requirements.txt +2 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/Makefile +287 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/Makefile.in +20 -4
- data/ext/ruby_ndtypes/ndtypes/libndtypes/Makefile.vc +22 -3
- data/ext/ruby_ndtypes/ndtypes/libndtypes/alloc.c +1 -1
- data/ext/ruby_ndtypes/ndtypes/libndtypes/alloc.o +0 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/attr.o +0 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/Makefile +73 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/bpgrammar.c +246 -229
- data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/bpgrammar.h +15 -11
- data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/bpgrammar.o +0 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/bpgrammar.y +38 -28
- data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/bplexer.c +91 -91
- data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/bplexer.h +1 -1
- data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/bplexer.l +4 -3
- data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/bplexer.o +0 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/export.c +8 -7
- data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/export.o +0 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/import.c +2 -2
- data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/import.o +0 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/context.o +0 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/copy.c +263 -182
- data/ext/ruby_ndtypes/ndtypes/libndtypes/copy.o +0 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/encodings.o +0 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/equal.c +67 -7
- data/ext/ruby_ndtypes/ndtypes/libndtypes/equal.o +0 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/grammar.c +1112 -1000
- data/ext/ruby_ndtypes/ndtypes/libndtypes/grammar.h +69 -58
- data/ext/ruby_ndtypes/ndtypes/libndtypes/grammar.o +0 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/grammar.y +150 -99
- data/ext/ruby_ndtypes/ndtypes/libndtypes/io.c +185 -15
- data/ext/ruby_ndtypes/ndtypes/libndtypes/io.o +0 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/lexer.c +301 -276
- data/ext/ruby_ndtypes/ndtypes/libndtypes/lexer.h +1 -1
- data/ext/ruby_ndtypes/ndtypes/libndtypes/lexer.l +9 -4
- data/ext/ruby_ndtypes/ndtypes/libndtypes/lexer.o +0 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/libndtypes.a +0 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/libndtypes.so +1 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/libndtypes.so.0 +1 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/libndtypes.so.0.2.0dev3 +0 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/match.c +729 -228
- data/ext/ruby_ndtypes/ndtypes/libndtypes/match.o +0 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/ndtypes.c +768 -403
- data/ext/ruby_ndtypes/ndtypes/libndtypes/ndtypes.h +1002 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/ndtypes.h.in +231 -122
- data/ext/ruby_ndtypes/ndtypes/libndtypes/ndtypes.o +0 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/parsefuncs.c +176 -84
- data/ext/ruby_ndtypes/ndtypes/libndtypes/parsefuncs.h +26 -14
- data/ext/ruby_ndtypes/ndtypes/libndtypes/parsefuncs.o +0 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/parser.c +57 -35
- data/ext/ruby_ndtypes/ndtypes/libndtypes/parser.o +0 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/primitive.c +420 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/primitive.o +0 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/seq.c +8 -8
- data/ext/ruby_ndtypes/ndtypes/libndtypes/seq.h +1 -1
- data/ext/ruby_ndtypes/ndtypes/libndtypes/seq.o +0 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/serialize/Makefile +48 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/serialize/deserialize.c +200 -116
- data/ext/ruby_ndtypes/ndtypes/libndtypes/serialize/deserialize.o +0 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/serialize/serialize.c +46 -4
- data/ext/ruby_ndtypes/ndtypes/libndtypes/serialize/serialize.o +0 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/substitute.c +58 -27
- data/ext/ruby_ndtypes/ndtypes/libndtypes/substitute.h +1 -1
- data/ext/ruby_ndtypes/ndtypes/libndtypes/substitute.o +0 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/symtable.c +3 -5
- data/ext/ruby_ndtypes/ndtypes/libndtypes/symtable.h +12 -4
- data/ext/ruby_ndtypes/ndtypes/libndtypes/symtable.o +0 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/Makefile +55 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/Makefile.in +8 -8
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/Makefile.vc +5 -5
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/runtest.c +274 -172
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test.h +24 -4
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_array.c +2 -2
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_buffer.c +14 -14
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_match.c +32 -30
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_parse.c +37 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_parse_error.c +36 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_parse_roundtrip.c +16 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_record.c +5 -5
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_typecheck.c +706 -253
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_unify.c +132 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/unify.c +703 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/unify.o +0 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/util.c +335 -127
- data/ext/ruby_ndtypes/ndtypes/libndtypes/util.o +0 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/values.c +2 -2
- data/ext/ruby_ndtypes/ndtypes/libndtypes/values.o +0 -0
- data/ext/ruby_ndtypes/ndtypes/python/ndt_randtype.py +88 -71
- data/ext/ruby_ndtypes/ndtypes/python/ndt_support.py +0 -1
- data/ext/ruby_ndtypes/ndtypes/python/ndtypes/__init__.py +10 -13
- data/ext/ruby_ndtypes/ndtypes/python/ndtypes/_ndtypes.c +395 -314
- data/ext/ruby_ndtypes/ndtypes/python/ndtypes/libndtypes.a +0 -0
- data/ext/ruby_ndtypes/ndtypes/python/ndtypes/libndtypes.so +1 -0
- data/ext/ruby_ndtypes/ndtypes/python/ndtypes/libndtypes.so.0 +1 -0
- data/ext/ruby_ndtypes/ndtypes/python/ndtypes/libndtypes.so.0.2.0dev3 +0 -0
- data/ext/ruby_ndtypes/ndtypes/python/ndtypes/ndtypes.h +1002 -0
- data/ext/ruby_ndtypes/ndtypes/python/ndtypes/pyndtypes.h +15 -33
- data/ext/ruby_ndtypes/ndtypes/python/test_ndtypes.py +340 -132
- data/ext/ruby_ndtypes/ndtypes/setup.py +11 -2
- data/ext/ruby_ndtypes/ruby_ndtypes.c +364 -241
- data/ext/ruby_ndtypes/ruby_ndtypes.h +1 -1
- data/ext/ruby_ndtypes/ruby_ndtypes_internal.h +0 -1
- data/lib/ndtypes.rb +11 -0
- data/lib/ndtypes/version.rb +2 -2
- data/lib/ruby_ndtypes.so +0 -0
- data/ndtypes.gemspec +3 -0
- data/spec/ndtypes_spec.rb +6 -0
- metadata +98 -4
- data/ext/ruby_ndtypes/gc_guard.c +0 -36
- data/ext/ruby_ndtypes/gc_guard.h +0 -12
|
@@ -42,6 +42,7 @@ from distutils.sysconfig import get_python_lib
|
|
|
42
42
|
from glob import glob
|
|
43
43
|
import platform
|
|
44
44
|
import subprocess
|
|
45
|
+
import argparse
|
|
45
46
|
import shutil
|
|
46
47
|
|
|
47
48
|
try:
|
|
@@ -81,6 +82,13 @@ Links
|
|
|
81
82
|
* http://xnd.readthedocs.io/en/latest/
|
|
82
83
|
"""
|
|
83
84
|
|
|
85
|
+
# Pre-parse and remove the '-j' argument from sys.argv.
|
|
86
|
+
parser = argparse.ArgumentParser()
|
|
87
|
+
parser.add_argument('-j', default=None)
|
|
88
|
+
values, rest = parser.parse_known_args()
|
|
89
|
+
PARALLEL = values.j
|
|
90
|
+
sys.argv = sys.argv[:1] + rest
|
|
91
|
+
|
|
84
92
|
|
|
85
93
|
if sys.platform == "darwin":
|
|
86
94
|
LIBNAME = "libndtypes.dylib"
|
|
@@ -230,10 +238,11 @@ def ndtypes_ext():
|
|
|
230
238
|
runtime_library_dirs = ["$ORIGIN"]
|
|
231
239
|
|
|
232
240
|
if BUILD_ALL:
|
|
241
|
+
make = "make -j%d" % int(PARALLEL) if PARALLEL else "make"
|
|
233
242
|
if WITH_VALGRIND:
|
|
234
|
-
os.system("./configure --with-valgrind && make
|
|
243
|
+
os.system("./configure --with-valgrind && %s" % make)
|
|
235
244
|
else:
|
|
236
|
-
os.system("./configure && make
|
|
245
|
+
os.system("./configure && %s" % make)
|
|
237
246
|
|
|
238
247
|
return Extension (
|
|
239
248
|
"ndtypes._ndtypes",
|
|
@@ -8,7 +8,6 @@
|
|
|
8
8
|
/* ---------- Interal declarations ---------- */
|
|
9
9
|
/* data_type_t variables. */
|
|
10
10
|
static const rb_data_type_t NdtObject_type;
|
|
11
|
-
static const rb_data_type_t ResourceBufferObject_type;
|
|
12
11
|
|
|
13
12
|
/* Class declarations. */
|
|
14
13
|
VALUE cNDTypes;
|
|
@@ -82,148 +81,14 @@ seterr(ndt_context_t *ctx)
|
|
|
82
81
|
return exc;
|
|
83
82
|
}
|
|
84
83
|
|
|
85
|
-
/******************************************************************************/
|
|
86
|
-
/************************* Resource Buffer Object *****************************/
|
|
87
|
-
|
|
88
|
-
/* A ResourceBufferObject is passed around various NDT objects for storing
|
|
89
|
-
* internal state. It might or might not be duplicated across other NDT
|
|
90
|
-
* objects.
|
|
91
|
-
*/
|
|
92
|
-
typedef struct ResourceBufferObject {
|
|
93
|
-
ndt_meta_t *m;
|
|
94
|
-
} ResourceBufferObject;
|
|
95
|
-
|
|
96
|
-
#define GET_RBUF(obj, rbuf_p) do { \
|
|
97
|
-
TypedData_Get_Struct((obj), ResourceBufferObject, \
|
|
98
|
-
&ResourceBufferObject_type, (rbuf_p)); \
|
|
99
|
-
} while (0)
|
|
100
|
-
#define RBUF_NDT_M(rbuf_p) ((ndt_meta_t*)(rbuf_p->m))
|
|
101
|
-
#define MAKE_RBUF(self, rbuf_p) TypedData_Make_Struct(self, ResourceBufferObject, \
|
|
102
|
-
&ResourceBufferObject_type, rbuf_p)
|
|
103
|
-
#define WRAP_RBUF(self, rbuf_p) TypedData_Wrap_Struct(self, \
|
|
104
|
-
&ResourceBufferObject_type, rbuf_p)
|
|
105
|
-
|
|
106
|
-
/* GC free the ResourceBufferObject struct. */
|
|
107
|
-
static void
|
|
108
|
-
ResourceBufferObject_dfree(void * self)
|
|
109
|
-
{
|
|
110
|
-
ResourceBufferObject * rbf = (ResourceBufferObject*)self;
|
|
111
|
-
|
|
112
|
-
ndt_meta_del(rbf->m);
|
|
113
|
-
rbf->m = NULL;
|
|
114
|
-
xfree(rbf);
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
/* Calculate the size of the object. */
|
|
118
|
-
static size_t
|
|
119
|
-
ResourceBufferObject_dsize(const void *self)
|
|
120
|
-
{
|
|
121
|
-
return sizeof(ResourceBufferObject);
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
static const rb_data_type_t ResourceBufferObject_type = {
|
|
125
|
-
.wrap_struct_name = "ResourceBufferObject",
|
|
126
|
-
.function = {
|
|
127
|
-
.dmark = 0,
|
|
128
|
-
.dfree = ResourceBufferObject_dfree,
|
|
129
|
-
.dsize = ResourceBufferObject_dsize,
|
|
130
|
-
.reserved = {0,0},
|
|
131
|
-
},
|
|
132
|
-
.parent = 0,
|
|
133
|
-
.flags = RUBY_TYPED_FREE_IMMEDIATELY,
|
|
134
|
-
};
|
|
135
|
-
|
|
136
|
-
/* FIXME: change this to rbuf_alloc to reflect that its not called by Ruby alloc. */
|
|
137
|
-
static VALUE
|
|
138
|
-
rbuf_allocate(void)
|
|
139
|
-
{
|
|
140
|
-
NDT_STATIC_CONTEXT(ctx);
|
|
141
|
-
ResourceBufferObject *self;
|
|
142
|
-
|
|
143
|
-
self = ALLOC(ResourceBufferObject);
|
|
144
|
-
|
|
145
|
-
self->m = ndt_meta_new(&ctx);
|
|
146
|
-
if (self->m == NULL) {
|
|
147
|
-
rb_raise(rb_eNoMemError, "cannot allocate rbuf object.");
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
return WRAP_RBUF(cNDTypes_RBuf, self);
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
static int
|
|
154
|
-
rbuf_init_from_offset_list(ResourceBufferObject *rbuf, VALUE list)
|
|
155
|
-
{
|
|
156
|
-
ndt_meta_t * const m = rbuf->m;
|
|
157
|
-
VALUE lst;
|
|
158
|
-
|
|
159
|
-
Check_Type(list, T_ARRAY);
|
|
160
|
-
|
|
161
|
-
const int64_t n = RARRAY_LEN(list);
|
|
162
|
-
if (n < 1 || n > NDT_MAX_DIM) {
|
|
163
|
-
rb_raise(rb_eValueError, "number of offset lists must be in [1, %d].",
|
|
164
|
-
NDT_MAX_DIM);
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
m->ndims = 0;
|
|
168
|
-
for (int64_t i = n-1; i >= 0; i--) {
|
|
169
|
-
lst = rb_ary_entry(list, i);
|
|
170
|
-
if (!RB_TYPE_P(lst, T_ARRAY)) {
|
|
171
|
-
rb_raise(rb_eTypeError, "expected a list of offset lists.");
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
const int64_t noffsets = RARRAY_LEN(lst);
|
|
175
|
-
if (noffsets < 2 || noffsets > INT32_MAX) {
|
|
176
|
-
rb_raise(rb_eValueError, "length of a single offset must be in [2, INT32_MAX].");
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
int32_t * const offsets = ndt_alloc(noffsets, sizeof(int32_t));
|
|
180
|
-
if (offsets == NULL) {
|
|
181
|
-
rb_raise(rb_eNoMemError, "could not allocate offsets.");
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
for (int32_t k = 0; k < noffsets; k++) {
|
|
185
|
-
long long x = NUM2LL(rb_ary_entry(lst, k));
|
|
186
|
-
if (x == -1 || x < 0 || x > INT32_MAX) {
|
|
187
|
-
ndt_free(offsets);
|
|
188
|
-
rb_raise(rb_eValueError, "offset must be in [0, INT32_MAX].");
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
offsets[k] = (int32_t)x;
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
m->noffsets[m->ndims] = (int32_t)noffsets;
|
|
195
|
-
m->offsets[m->ndims] = offsets;
|
|
196
|
-
m->ndims++;
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
return 0;
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
static VALUE
|
|
203
|
-
rbuf_from_offset_lists(VALUE list)
|
|
204
|
-
{
|
|
205
|
-
VALUE rbuf;
|
|
206
|
-
ResourceBufferObject * rbuf_p;
|
|
207
|
-
|
|
208
|
-
rbuf = rbuf_allocate();
|
|
209
|
-
GET_RBUF(rbuf, rbuf_p);
|
|
210
|
-
rbuf_init_from_offset_list(rbuf_p, list);
|
|
211
|
-
|
|
212
|
-
return rbuf;
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
/******************************************************************************/
|
|
216
|
-
|
|
217
84
|
/******************************************************************************/
|
|
218
85
|
/************************* NDT struct object **********************************/
|
|
219
86
|
|
|
220
87
|
typedef struct NdtObject {
|
|
221
|
-
|
|
222
|
-
ndt_t *ndt; /* type */
|
|
88
|
+
const ndt_t *ndt; /* type */
|
|
223
89
|
} NdtObject;
|
|
224
90
|
|
|
225
91
|
#define NDT(v) (((NdtObject *)v)->ndt)
|
|
226
|
-
#define RBUF(v) (((NdtObject *)v)->rbuf)
|
|
227
92
|
#define GET_NDT(obj, ndt_p) do { \
|
|
228
93
|
TypedData_Get_Struct((obj), NdtObject, \
|
|
229
94
|
&NdtObject_type, (ndt_p)); \
|
|
@@ -232,20 +97,6 @@ typedef struct NdtObject {
|
|
|
232
97
|
&NdtObject_type, ndt_p)
|
|
233
98
|
#define WRAP_NDT(self, ndt_p) TypedData_Wrap_Struct(self, &NdtObject_type, ndt_p)
|
|
234
99
|
#define NDT_CHECK_TYPE(obj) (CLASS_OF(obj) == cNDTypes)
|
|
235
|
-
|
|
236
|
-
/* Get the metatdata of the ResourceBufferObject within this NDT Ruby object. */
|
|
237
|
-
static ndt_meta_t *
|
|
238
|
-
rbuf_ndt_meta(VALUE ndt)
|
|
239
|
-
{
|
|
240
|
-
NdtObject *ndt_p;
|
|
241
|
-
ResourceBufferObject *rbuf_p;
|
|
242
|
-
|
|
243
|
-
GET_NDT(ndt, ndt_p);
|
|
244
|
-
GET_RBUF(ndt_p->rbuf, rbuf_p);
|
|
245
|
-
|
|
246
|
-
return rbuf_p->m;
|
|
247
|
-
}
|
|
248
|
-
|
|
249
100
|
/* Allocate an NdtObject, initialize members and return wrapped as a Ruby object. */
|
|
250
101
|
static VALUE
|
|
251
102
|
NdtObject_alloc(void)
|
|
@@ -253,8 +104,6 @@ NdtObject_alloc(void)
|
|
|
253
104
|
NdtObject *ndt_p;
|
|
254
105
|
|
|
255
106
|
ndt_p = ZALLOC(NdtObject);
|
|
256
|
-
|
|
257
|
-
ndt_p->rbuf = 0;
|
|
258
107
|
ndt_p->ndt = NULL;
|
|
259
108
|
|
|
260
109
|
return WRAP_NDT(cNDTypes, ndt_p);
|
|
@@ -263,20 +112,13 @@ NdtObject_alloc(void)
|
|
|
263
112
|
/* GC mark the NdtObject struct. */
|
|
264
113
|
/* TODO: verify that there are no more object allocations happening inside ndt. */
|
|
265
114
|
static void
|
|
266
|
-
NdtObject_dmark(void * self)
|
|
267
|
-
{
|
|
268
|
-
NdtObject * ndt = (NdtObject*)self;
|
|
269
|
-
|
|
270
|
-
rb_gc_mark(ndt->rbuf);
|
|
271
|
-
}
|
|
115
|
+
NdtObject_dmark(void * self) {}
|
|
272
116
|
|
|
273
117
|
/* GC free the NdtObject struct. */
|
|
274
118
|
static void
|
|
275
119
|
NdtObject_dfree(void * self)
|
|
276
120
|
{
|
|
277
121
|
NdtObject * ndt = (NdtObject*)self;
|
|
278
|
-
|
|
279
|
-
rb_ndtypes_gc_guard_unregister(ndt);
|
|
280
122
|
xfree(ndt);
|
|
281
123
|
}
|
|
282
124
|
|
|
@@ -333,13 +175,81 @@ NDTYPES_BOOL_FUNC(ndt_is_complex)
|
|
|
333
175
|
|
|
334
176
|
NDTYPES_BOOL_FUNC(ndt_is_c_contiguous)
|
|
335
177
|
NDTYPES_BOOL_FUNC(ndt_is_f_contiguous)
|
|
178
|
+
NDTYPES_BOOL_FUNC(ndt_is_var_contiguous)
|
|
179
|
+
|
|
180
|
+
static int
|
|
181
|
+
offsets_from_array(ndt_meta_t *m, VALUE array)
|
|
182
|
+
{
|
|
183
|
+
NDT_STATIC_CONTEXT(ctx);
|
|
184
|
+
VALUE temp;
|
|
185
|
+
|
|
186
|
+
Check_Type(array, T_ARRAY);
|
|
187
|
+
|
|
188
|
+
const int n = RARRAY_LEN(array);
|
|
189
|
+
if (n < 1 || n > NDT_MAX_DIM) {
|
|
190
|
+
rb_raise(rb_eValueError, "number of offsets arrays must be in [1, %d].", NDT_MAX_DIM);
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
m->ndims = 0;
|
|
194
|
+
for (int i = n-1; i >= 0; i--) {
|
|
195
|
+
temp = rb_ary_entry(array, i);
|
|
196
|
+
if (!RB_TYPE_P(temp, T_ARRAY)) {
|
|
197
|
+
rb_raise(rb_eValueError, "expected a list of offset lists.");
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
const int64_t noffsets = RARRAY_LEN(temp);
|
|
201
|
+
if (noffsets < 2 || noffsets > INT32_MAX) {
|
|
202
|
+
rb_raise(rb_eValueError, "length of a single offset list be in [2, INT32_MAX].");
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
int32_t * const offsets = ndt_alloc(noffsets, sizeof(int32_t));
|
|
206
|
+
if (offsets == NULL) {
|
|
207
|
+
rb_raise(rb_eNoMemError, "no memory to allocate offsets.");
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
for (int32_t k = 0; k < noffsets; k++) {
|
|
211
|
+
long long x = NUM2LL(rb_ary_entry(temp, k));
|
|
212
|
+
|
|
213
|
+
if (x < 0 || x > INT32_MAX) {
|
|
214
|
+
ndt_free(offsets);
|
|
215
|
+
rb_raise(rb_eValueError, "offset must be in [0, INT32_MAX].");
|
|
216
|
+
}
|
|
217
|
+
offsets[k] = (int32_t)x;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
m->offsets[m->ndims] = ndt_offsets_from_ptr(offsets, (int32_t)noffsets, &ctx);
|
|
221
|
+
if (m->offsets[m->ndims] == NULL) {
|
|
222
|
+
seterr(&ctx);
|
|
223
|
+
raise_error();
|
|
224
|
+
}
|
|
225
|
+
m->ndims++;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
return 0;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
static VALUE
|
|
232
|
+
array_from_int64(int64_t x[NDT_MAX_DIM], int ndim)
|
|
233
|
+
{
|
|
234
|
+
VALUE array;
|
|
235
|
+
int i;
|
|
236
|
+
|
|
237
|
+
array = rb_ary_new2(ndim);
|
|
238
|
+
|
|
239
|
+
for (i = 0; i < ndim; ++i) {
|
|
240
|
+
VALUE v = LL2NUM(x[i]);
|
|
241
|
+
rb_ary_store(array, i, v);
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
return array;
|
|
245
|
+
}
|
|
336
246
|
|
|
337
247
|
static VALUE
|
|
338
248
|
NDTypes_from_object(VALUE self, VALUE type)
|
|
339
249
|
{
|
|
340
250
|
NDT_STATIC_CONTEXT(ctx);
|
|
341
251
|
const char *cp;
|
|
342
|
-
NdtObject *
|
|
252
|
+
NdtObject *self_p;
|
|
343
253
|
|
|
344
254
|
if (NDT_CHECK_TYPE(type)) {
|
|
345
255
|
return rb_funcall(type, rb_intern("dup"), 0, NULL);
|
|
@@ -347,16 +257,10 @@ NDTypes_from_object(VALUE self, VALUE type)
|
|
|
347
257
|
|
|
348
258
|
cp = StringValuePtr(type);
|
|
349
259
|
|
|
350
|
-
GET_NDT(self,
|
|
351
|
-
RBUF(ndt_p) = rbuf_allocate();
|
|
352
|
-
if (RBUF(ndt_p) == NULL) {
|
|
353
|
-
rb_raise(rb_eNoMemError, "problem in allocating RBUF object.");
|
|
354
|
-
}
|
|
355
|
-
|
|
356
|
-
rb_ndtypes_gc_guard_register(ndt_p, RBUF(ndt_p));
|
|
260
|
+
GET_NDT(self, self_p);
|
|
357
261
|
|
|
358
|
-
NDT(
|
|
359
|
-
if (NDT(
|
|
262
|
+
NDT(self_p) = ndt_from_string(cp, &ctx);
|
|
263
|
+
if (NDT(self_p) == NULL) {
|
|
360
264
|
seterr(&ctx);
|
|
361
265
|
raise_error();
|
|
362
266
|
}
|
|
@@ -365,23 +269,33 @@ NDTypes_from_object(VALUE self, VALUE type)
|
|
|
365
269
|
}
|
|
366
270
|
|
|
367
271
|
static VALUE
|
|
368
|
-
NDTypes_from_offsets_and_dtype(VALUE offsets, VALUE type)
|
|
272
|
+
NDTypes_from_offsets_and_dtype(VALUE self, VALUE offsets, VALUE type)
|
|
369
273
|
{
|
|
370
274
|
NDT_STATIC_CONTEXT(ctx);
|
|
371
|
-
VALUE self;
|
|
372
275
|
NdtObject *self_p;
|
|
276
|
+
ndt_meta_t m = {.ndims = 0, .offsets = {NULL}};
|
|
373
277
|
const char *cp;
|
|
374
278
|
|
|
375
279
|
Check_Type(type, T_STRING);
|
|
280
|
+
Check_Type(offsets, T_ARRAY);
|
|
376
281
|
|
|
377
282
|
cp = StringValuePtr(type);
|
|
378
283
|
|
|
379
|
-
self = NdtObject_alloc();
|
|
380
284
|
GET_NDT(self, self_p);
|
|
381
|
-
RBUF(self_p) = rbuf_from_offset_lists(offsets);
|
|
382
|
-
NDT(self_p) = ndt_from_metadata_and_dtype(rbuf_ndt_meta(self_p), cp, &ctx);
|
|
383
285
|
|
|
384
|
-
|
|
286
|
+
if (offsets_from_array(&m, offsets) < 0) {
|
|
287
|
+
ndt_meta_clear(&m);
|
|
288
|
+
seterr(&ctx);
|
|
289
|
+
raise_error();
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
NDT(self_p) = ndt_from_metadata_and_dtype(&m, cp, &ctx);
|
|
293
|
+
ndt_meta_clear(&m);
|
|
294
|
+
|
|
295
|
+
if (NDT(self_p) == NULL) {
|
|
296
|
+
seterr(&ctx);
|
|
297
|
+
raise_error();
|
|
298
|
+
}
|
|
385
299
|
|
|
386
300
|
return self;
|
|
387
301
|
}
|
|
@@ -407,7 +321,7 @@ NDTypes_initialize(int argc, VALUE *argv, VALUE self)
|
|
|
407
321
|
return NDTypes_from_object(self, type);
|
|
408
322
|
}
|
|
409
323
|
|
|
410
|
-
return NDTypes_from_offsets_and_dtype(offsets, type);
|
|
324
|
+
return NDTypes_from_offsets_and_dtype(self, offsets, type);
|
|
411
325
|
}
|
|
412
326
|
|
|
413
327
|
/* String representation of the type. */
|
|
@@ -436,15 +350,15 @@ NDTypes_to_s(VALUE self)
|
|
|
436
350
|
static VALUE
|
|
437
351
|
NDTypes_serialize(VALUE self)
|
|
438
352
|
{
|
|
439
|
-
NdtObject *
|
|
353
|
+
NdtObject *self_p;
|
|
440
354
|
char *bytes;
|
|
441
355
|
int64_t size;
|
|
442
356
|
VALUE str;
|
|
443
357
|
|
|
444
358
|
NDT_STATIC_CONTEXT(ctx);
|
|
445
|
-
GET_NDT(self,
|
|
359
|
+
GET_NDT(self, self_p);
|
|
446
360
|
|
|
447
|
-
size = ndt_serialize(&bytes, NDT(
|
|
361
|
+
size = ndt_serialize(&bytes, NDT(self_p), &ctx);
|
|
448
362
|
if (size < 0) {
|
|
449
363
|
seterr(&ctx);
|
|
450
364
|
raise_error();
|
|
@@ -467,7 +381,7 @@ NDTypes_ndim(VALUE self)
|
|
|
467
381
|
const ndt_t *t = NDT(ndt_p);
|
|
468
382
|
|
|
469
383
|
if (ndt_is_abstract(t)) {
|
|
470
|
-
rb_raise(
|
|
384
|
+
rb_raise(rb_eNoMethodError, "abstract type has no ndim.");
|
|
471
385
|
}
|
|
472
386
|
|
|
473
387
|
return LL2NUM(t->ndim);
|
|
@@ -502,7 +416,7 @@ NDTypes_itemsize(VALUE self)
|
|
|
502
416
|
const ndt_t *t = NDT(ndt_p);
|
|
503
417
|
|
|
504
418
|
if (ndt_is_abstract(t)) {
|
|
505
|
-
rb_raise(
|
|
419
|
+
rb_raise(rb_eNoMethodError, "abstract type has no datasize.");
|
|
506
420
|
}
|
|
507
421
|
|
|
508
422
|
switch (t->tag) {
|
|
@@ -531,7 +445,7 @@ NDTypes_align(VALUE self)
|
|
|
531
445
|
const ndt_t *t = NDT(ndt_p);
|
|
532
446
|
|
|
533
447
|
if (ndt_is_abstract(t)) {
|
|
534
|
-
rb_raise(
|
|
448
|
+
rb_raise(rb_eNoMethodError, "abstract type has no datasize.");
|
|
535
449
|
}
|
|
536
450
|
|
|
537
451
|
return LL2NUM(t->align);
|
|
@@ -631,6 +545,7 @@ NDTypes_match(VALUE self, VALUE other)
|
|
|
631
545
|
return INT2BOOL(res);
|
|
632
546
|
}
|
|
633
547
|
|
|
548
|
+
/* Implemented NDT#ast */
|
|
634
549
|
static VALUE
|
|
635
550
|
NDTypes_ast(VALUE self)
|
|
636
551
|
{
|
|
@@ -675,47 +590,241 @@ NDTypes_pretty(VALUE self)
|
|
|
675
590
|
return result;
|
|
676
591
|
}
|
|
677
592
|
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
593
|
+
/* NDT#shape */
|
|
594
|
+
static VALUE
|
|
595
|
+
NDTypes_shape(VALUE self)
|
|
596
|
+
{
|
|
597
|
+
NDT_STATIC_CONTEXT(ctx);
|
|
598
|
+
ndt_ndarray_t x;
|
|
599
|
+
NdtObject *self_p;
|
|
600
|
+
|
|
601
|
+
GET_NDT(self, self_p);
|
|
602
|
+
|
|
603
|
+
if (ndt_as_ndarray(&x, NDT(self_p), &ctx) < 0) {
|
|
604
|
+
seterr(&ctx);
|
|
605
|
+
raise_error();
|
|
606
|
+
}
|
|
607
|
+
|
|
608
|
+
return array_from_int64(x.shape, x.ndim);
|
|
609
|
+
}
|
|
681
610
|
|
|
682
|
-
/* Deserialize a byte string into an NDTypes object. */
|
|
683
611
|
static VALUE
|
|
684
|
-
|
|
612
|
+
NDTypes_strides(VALUE self)
|
|
685
613
|
{
|
|
686
|
-
NdtObject *ndt_p;
|
|
687
|
-
ResourceBufferObject *rbuf_p;
|
|
688
|
-
VALUE ndt, rbuf;
|
|
689
|
-
char *cp;
|
|
690
|
-
int64_t len;
|
|
691
614
|
NDT_STATIC_CONTEXT(ctx);
|
|
615
|
+
ndt_ndarray_t x;
|
|
616
|
+
NdtObject *self_p;
|
|
692
617
|
|
|
693
|
-
|
|
618
|
+
GET_NDT(self, self_p);
|
|
694
619
|
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
620
|
+
if (ndt_as_ndarray(&x, NDT(self_p), &ctx) < 0) {
|
|
621
|
+
seterr(&ctx);
|
|
622
|
+
raise_error();
|
|
623
|
+
}
|
|
624
|
+
|
|
625
|
+
return array_from_int64(x.strides, x.ndim);
|
|
626
|
+
}
|
|
627
|
+
|
|
628
|
+
static int
|
|
629
|
+
parse_apply_args(const ndt_t* types[NDT_MAX_ARGS], int *num_intypes, int *num_outtypes,
|
|
630
|
+
int *num_args, VALUE input_types, VALUE out_types) {
|
|
631
|
+
size_t nin, nout;
|
|
632
|
+
if (RARRAY_LEN(input_types) == 0) {
|
|
633
|
+
rb_raise(rb_eArgError, "must specify more than 0 input types.");
|
|
634
|
+
}
|
|
635
|
+
|
|
636
|
+
nin = RARRAY_LEN(input_types);
|
|
637
|
+
if (nin > NDT_MAX_ARGS) {
|
|
638
|
+
rb_raise(rb_eArgError, "maximum number of arguments cannot exceed %d, got %d.",
|
|
639
|
+
NDT_MAX_ARGS, nin);
|
|
640
|
+
}
|
|
641
|
+
|
|
642
|
+
for (int i = 0; i < nin; ++i) {
|
|
643
|
+
VALUE v = rb_ary_entry(input_types, i);
|
|
644
|
+
NdtObject *v_p;
|
|
645
|
+
|
|
646
|
+
if (!NDT_CHECK_TYPE(v)) {
|
|
647
|
+
rb_raise(rb_eArgError, "every argument must be of type NDT.");
|
|
648
|
+
}
|
|
649
|
+
|
|
650
|
+
GET_NDT(v, v_p);
|
|
651
|
+
types[i] = NDT(v_p);
|
|
698
652
|
}
|
|
699
|
-
len = RSTRING_LEN(str);
|
|
700
653
|
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
654
|
+
if (out_types == Qnil) {
|
|
655
|
+
nout = 0;
|
|
656
|
+
}
|
|
657
|
+
else {
|
|
658
|
+
if (NDT_CHECK_TYPE(out_types)) {
|
|
659
|
+
NdtObject *out_p;
|
|
660
|
+
nout = 1;
|
|
661
|
+
if (nin + nout > NDT_MAX_ARGS) {
|
|
662
|
+
rb_raise(rb_eTypeError, "max number of args is %d, got %d.", NDT_MAX_ARGS, nin+nout);
|
|
663
|
+
}
|
|
664
|
+
GET_NDT(out_types, out_p);
|
|
665
|
+
types[nin] = NDT(out_p);
|
|
666
|
+
}
|
|
667
|
+
else if (TYPE(out_types) == T_ARRAY) {
|
|
668
|
+
nout = RARRAY_LEN(out_types);
|
|
669
|
+
if (nout > NDT_MAX_ARGS || nin+nout > NDT_MAX_ARGS) {
|
|
670
|
+
rb_raise(rb_eTypeError, "max number of args is %d, got %d.", NDT_MAX_ARGS, nin+nout);
|
|
671
|
+
}
|
|
672
|
+
|
|
673
|
+
for (int i = 0; i < nout; ++i) {
|
|
674
|
+
NdtObject *v_p;
|
|
675
|
+
VALUE v = rb_ary_entry(out_types, i);
|
|
676
|
+
if (!NDT_CHECK_TYPE(v)) {
|
|
677
|
+
rb_raise(rb_eTypeError, "expected NDT arguments for all out types.");
|
|
678
|
+
}
|
|
679
|
+
GET_NDT(v, v_p);
|
|
680
|
+
types[nin+i] = NDT(v_p);
|
|
681
|
+
}
|
|
682
|
+
}
|
|
683
|
+
else {
|
|
684
|
+
rb_raise(rb_eTypeError, "'out' argument must be ndt or a tuple of ndt.");
|
|
685
|
+
}
|
|
705
686
|
}
|
|
706
687
|
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
if (NDT(ndt_p) == NULL) {
|
|
710
|
-
/* TODO: raise error for cannot deserialize */
|
|
688
|
+
for (int i = 0; i < nin+nout; ++i) {
|
|
689
|
+
ndt_incref(types[i]);
|
|
711
690
|
}
|
|
712
691
|
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
692
|
+
*num_intypes = (int)nin;
|
|
693
|
+
*num_outtypes = (int)nout;
|
|
694
|
+
*num_args = (int)nin + (int)nout;
|
|
695
|
+
|
|
696
|
+
return 0;
|
|
697
|
+
|
|
698
|
+
}
|
|
699
|
+
|
|
700
|
+
static VALUE
|
|
701
|
+
NDTypes_apply(VALUE self, VALUE input_types, VALUE out_types)
|
|
702
|
+
{
|
|
703
|
+
NDT_STATIC_CONTEXT(ctx);
|
|
704
|
+
const ndt_t *types[NDT_MAX_ARGS] = {NULL};
|
|
705
|
+
const int64_t li[NDT_MAX_ARGS] = {0};
|
|
706
|
+
ndt_apply_spec_t spec = ndt_apply_spec_empty;
|
|
707
|
+
VALUE res, flags, outer_dims, nin, nout, nargs, lst;
|
|
708
|
+
int ret;
|
|
709
|
+
int num_intypes, num_outtypes, num_args;
|
|
710
|
+
NdtObject *self_p;
|
|
711
|
+
|
|
712
|
+
Check_Type(input_types, T_ARRAY);
|
|
713
|
+
|
|
714
|
+
parse_apply_args(types, &num_intypes, &num_outtypes, &num_args, input_types, out_types);
|
|
715
|
+
GET_NDT(self, self_p);
|
|
716
|
+
const ndt_t * sig = NDT(self_p);
|
|
717
|
+
ret = ndt_typecheck(&spec, sig, types, li, num_intypes, num_outtypes, false,
|
|
718
|
+
NULL, NULL, &ctx);
|
|
719
|
+
ndt_type_array_clear(types, num_args);
|
|
717
720
|
|
|
718
|
-
|
|
721
|
+
if (ret < 0) {
|
|
722
|
+
seterr(&ctx);
|
|
723
|
+
raise_error();
|
|
724
|
+
}
|
|
725
|
+
|
|
726
|
+
flags = rb_str_new2(ndt_apply_flags_as_string(&spec));
|
|
727
|
+
lst = rb_ary_new2(spec.nargs);
|
|
728
|
+
|
|
729
|
+
for (int i = 0; i < spec.nargs; ++i) {
|
|
730
|
+
VALUE x = NdtObject_alloc();
|
|
731
|
+
NdtObject *x_p;
|
|
732
|
+
GET_NDT(x, x_p);
|
|
733
|
+
|
|
734
|
+
NDT(x_p) = spec.types[i];
|
|
735
|
+
rb_ary_store(lst, i, x);
|
|
736
|
+
}
|
|
737
|
+
|
|
738
|
+
outer_dims = LL2NUM(spec.outer_dims);
|
|
739
|
+
nin = LL2NUM(spec.nin);
|
|
740
|
+
nout = LL2NUM(spec.nout);
|
|
741
|
+
nargs = LL2NUM(spec.nargs);
|
|
742
|
+
|
|
743
|
+
return rb_funcall(rb_const_get(cNDTypes, rb_intern("ApplySpec")), rb_intern("new"),
|
|
744
|
+
6, flags, outer_dims, nin, nout, nargs, lst);
|
|
745
|
+
}
|
|
746
|
+
|
|
747
|
+
static const ndt_t *
|
|
748
|
+
from_string(VALUE v)
|
|
749
|
+
{
|
|
750
|
+
NDT_STATIC_CONTEXT(ctx);
|
|
751
|
+
const char *cp;
|
|
752
|
+
const ndt_t *t;
|
|
753
|
+
|
|
754
|
+
Check_Type(v, T_STRING);
|
|
755
|
+
|
|
756
|
+
cp = RSTRING_PTR(v);
|
|
757
|
+
t = ndt_from_string(cp, &ctx);
|
|
758
|
+
if (t == NULL) {
|
|
759
|
+
seterr(&ctx);
|
|
760
|
+
raise_error();
|
|
761
|
+
}
|
|
762
|
+
|
|
763
|
+
return t;
|
|
764
|
+
}
|
|
765
|
+
|
|
766
|
+
/* Implement NDT#_at */
|
|
767
|
+
static VALUE
|
|
768
|
+
NDTypes_at(VALUE self, VALUE obj_n, VALUE dtype)
|
|
769
|
+
{
|
|
770
|
+
NDT_STATIC_CONTEXT(ctx);
|
|
771
|
+
int n = FIX2INT(obj_n);
|
|
772
|
+
VALUE res;
|
|
773
|
+
const ndt_t *t, *dt;
|
|
774
|
+
NdtObject *dtype_p, *self_p;
|
|
775
|
+
|
|
776
|
+
if (dtype == Qnil) {
|
|
777
|
+
dt = NULL;
|
|
778
|
+
}
|
|
779
|
+
else if (NDT_CHECK_TYPE(dtype)) {
|
|
780
|
+
GET_NDT(dtype, dtype_p);
|
|
781
|
+
dt = NDT(dtype_p);
|
|
782
|
+
ndt_incref(dt);
|
|
783
|
+
}
|
|
784
|
+
else if (TYPE(dtype) == T_STRING) {
|
|
785
|
+
dt = from_string(dtype);
|
|
786
|
+
}
|
|
787
|
+
else {
|
|
788
|
+
rb_raise(rb_eTypeError, "dtype argument must be 'ndt' or 'str'");
|
|
789
|
+
}
|
|
790
|
+
|
|
791
|
+
GET_NDT(self, self_p);
|
|
792
|
+
t = ndt_copy_contiguous_at(NDT(self_p), n, dt, &ctx);
|
|
793
|
+
|
|
794
|
+
if (dt != NULL) {
|
|
795
|
+
ndt_decref(dt);
|
|
796
|
+
}
|
|
797
|
+
if (t == NULL) {
|
|
798
|
+
seterr(&ctx);
|
|
799
|
+
raise_error();
|
|
800
|
+
}
|
|
801
|
+
|
|
802
|
+
res = rb_ndtypes_from_type(t);
|
|
803
|
+
ndt_decref(t);
|
|
804
|
+
|
|
805
|
+
return res;
|
|
806
|
+
}
|
|
807
|
+
|
|
808
|
+
/****************************************************************************/
|
|
809
|
+
/* Class methods */
|
|
810
|
+
/****************************************************************************/
|
|
811
|
+
|
|
812
|
+
/* Deserialize a byte string into an NDTypes object. */
|
|
813
|
+
static VALUE
|
|
814
|
+
NDTypes_s_deserialize(VALUE klass, VALUE str)
|
|
815
|
+
{
|
|
816
|
+
NDT_STATIC_CONTEXT(ctx);
|
|
817
|
+
VALUE self;
|
|
818
|
+
NdtObject *self_p;
|
|
819
|
+
|
|
820
|
+
Check_Type(str, T_STRING);
|
|
821
|
+
|
|
822
|
+
self = NdtObject_alloc();
|
|
823
|
+
GET_NDT(self, self_p);
|
|
824
|
+
|
|
825
|
+
NDT(self_p) = ndt_deserialize(RSTRING_PTR(str), RSTRING_LEN(str), &ctx);
|
|
826
|
+
|
|
827
|
+
return self;
|
|
719
828
|
}
|
|
720
829
|
|
|
721
830
|
/* Create a typedef */
|
|
@@ -730,22 +839,17 @@ NDTypes_s_typedef(VALUE klass, VALUE new_type, VALUE old_type)
|
|
|
730
839
|
Check_Type(old_type, T_STRING);
|
|
731
840
|
|
|
732
841
|
cname = StringValueCStr(new_type);
|
|
733
|
-
if (cname == NULL) {
|
|
734
|
-
|
|
735
|
-
}
|
|
736
|
-
|
|
737
842
|
ctype = StringValueCStr(old_type);
|
|
738
|
-
if (ctype == NULL) {
|
|
739
|
-
|
|
740
|
-
}
|
|
741
843
|
|
|
742
844
|
t = ndt_from_string(ctype, &ctx);
|
|
743
845
|
if (t == NULL) {
|
|
744
|
-
|
|
846
|
+
seterr(&ctx);
|
|
847
|
+
raise_error();
|
|
745
848
|
}
|
|
746
849
|
|
|
747
850
|
if (ndt_typedef(cname, t, NULL, &ctx) < 0) {
|
|
748
|
-
|
|
851
|
+
seterr(&ctx);
|
|
852
|
+
raise_error();
|
|
749
853
|
}
|
|
750
854
|
|
|
751
855
|
return Qnil;
|
|
@@ -757,7 +861,7 @@ NDTypes_s_instantiate(VALUE klass, VALUE name, VALUE type)
|
|
|
757
861
|
{
|
|
758
862
|
const char *cname;
|
|
759
863
|
char *cp;
|
|
760
|
-
ndt_t *t
|
|
864
|
+
const ndt_t *t;//, *tp;
|
|
761
865
|
NdtObject *type_p;
|
|
762
866
|
NDT_STATIC_CONTEXT(ctx);
|
|
763
867
|
|
|
@@ -777,29 +881,53 @@ NDTypes_s_instantiate(VALUE klass, VALUE name, VALUE type)
|
|
|
777
881
|
|
|
778
882
|
GET_NDT(type, type_p);
|
|
779
883
|
|
|
780
|
-
|
|
781
|
-
if (
|
|
782
|
-
ndt_free(cp);
|
|
884
|
+
t = ndt_nominal(cp, NDT(type_p), false, &ctx);
|
|
885
|
+
if (t == NULL) {
|
|
783
886
|
seterr(&ctx);
|
|
784
887
|
raise_error();
|
|
785
888
|
}
|
|
786
889
|
|
|
787
|
-
|
|
788
|
-
|
|
890
|
+
VALUE ret = rb_ndtypes_from_type(t);
|
|
891
|
+
ndt_decref(t);
|
|
892
|
+
|
|
893
|
+
return ret;
|
|
894
|
+
}
|
|
895
|
+
|
|
896
|
+
static VALUE
|
|
897
|
+
NDTypes_s_from_format(VALUE klass, VALUE format)
|
|
898
|
+
{
|
|
899
|
+
NDT_STATIC_CONTEXT(ctx);
|
|
900
|
+
VALUE self;
|
|
901
|
+
NdtObject *self_p;
|
|
902
|
+
const char *cp;
|
|
903
|
+
|
|
904
|
+
Check_Type(format, T_STRING);
|
|
905
|
+
|
|
906
|
+
cp = StringValueCStr(format);
|
|
907
|
+
self = NdtObject_alloc();
|
|
908
|
+
|
|
909
|
+
GET_NDT(self, self_p);
|
|
910
|
+
|
|
911
|
+
NDT(self_p) = ndt_from_bpformat(cp, &ctx);
|
|
912
|
+
if (NDT(self_p) == NULL) {
|
|
789
913
|
seterr(&ctx);
|
|
790
914
|
raise_error();
|
|
791
915
|
}
|
|
792
916
|
|
|
793
|
-
return
|
|
917
|
+
return self;
|
|
794
918
|
}
|
|
795
919
|
|
|
920
|
+
|
|
796
921
|
/****************************************************************************/
|
|
797
922
|
/* Public C API */
|
|
798
923
|
/****************************************************************************/
|
|
799
924
|
|
|
800
925
|
/* Create NDT object from ndt_t type struct. */
|
|
926
|
+
/* Increments the refcnt of the NDT so can be thought of as making
|
|
927
|
+
* a copy of the object.
|
|
928
|
+
*/
|
|
801
929
|
VALUE
|
|
802
|
-
rb_ndtypes_from_type(ndt_t *type)
|
|
930
|
+
rb_ndtypes_from_type(const ndt_t *type)
|
|
803
931
|
{
|
|
804
932
|
VALUE self;
|
|
805
933
|
NdtObject *self_p;
|
|
@@ -807,6 +935,7 @@ rb_ndtypes_from_type(ndt_t *type)
|
|
|
807
935
|
self = NdtObject_alloc();
|
|
808
936
|
GET_NDT(self, self_p);
|
|
809
937
|
|
|
938
|
+
ndt_incref(type);
|
|
810
939
|
NDT(self_p) = type;
|
|
811
940
|
|
|
812
941
|
return self;
|
|
@@ -889,11 +1018,6 @@ rb_ndtypes_move_subtree(VALUE src, ndt_t *t)
|
|
|
889
1018
|
rb_raise(rb_eNoMemError, "could not allocate memory for ndt_copy().");
|
|
890
1019
|
}
|
|
891
1020
|
|
|
892
|
-
GET_NDT(src, src_p);
|
|
893
|
-
RBUF(dest_p) = RBUF(src_p);
|
|
894
|
-
|
|
895
|
-
rb_ndtypes_gc_guard_register(dest_p, RBUF(dest_p));
|
|
896
|
-
|
|
897
1021
|
return dest;
|
|
898
1022
|
}
|
|
899
1023
|
|
|
@@ -924,16 +1048,12 @@ rb_ndtypes_from_object(VALUE type)
|
|
|
924
1048
|
|
|
925
1049
|
copy = NdtObject_alloc();
|
|
926
1050
|
GET_NDT(copy, copy_p);
|
|
1051
|
+
NDT(copy_p) = ndt_from_string(cp, &ctx);
|
|
927
1052
|
|
|
928
|
-
RBUF(copy_p) = rbuf_allocate();
|
|
929
|
-
NDT(copy_p) = ndt_from_string_fill_meta(
|
|
930
|
-
rbuf_ndt_meta(copy),
|
|
931
|
-
cp, &ctx);
|
|
932
1053
|
if (NDT(copy_p) == NULL) {
|
|
933
1054
|
seterr(&ctx);
|
|
934
1055
|
raise_error();
|
|
935
1056
|
}
|
|
936
|
-
rb_ndtypes_gc_guard_register(copy_p, RBUF(copy_p));
|
|
937
1057
|
|
|
938
1058
|
return copy;
|
|
939
1059
|
}
|
|
@@ -974,6 +1094,10 @@ void Init_ruby_ndtypes(void)
|
|
|
974
1094
|
rb_define_method(cNDTypes, "match", NDTypes_match, 1);
|
|
975
1095
|
rb_define_method(cNDTypes, "ast", NDTypes_ast, 0);
|
|
976
1096
|
rb_define_method(cNDTypes, "pretty", NDTypes_pretty, 0);
|
|
1097
|
+
rb_define_method(cNDTypes, "shape", NDTypes_shape, 0);
|
|
1098
|
+
rb_define_method(cNDTypes, "strides", NDTypes_strides, 0);
|
|
1099
|
+
rb_define_method(cNDTypes, "_apply", NDTypes_apply, 2);
|
|
1100
|
+
rb_define_method(cNDTypes, "_at", NDTypes_at, 2);
|
|
977
1101
|
|
|
978
1102
|
/* Boolean functions */
|
|
979
1103
|
rb_define_method(cNDTypes, "concrete?", NDTypes_ndt_is_concrete, 0);
|
|
@@ -986,6 +1110,7 @@ void Init_ruby_ndtypes(void)
|
|
|
986
1110
|
rb_define_method(cNDTypes, "complex?", NDTypes_ndt_is_complex, 0);
|
|
987
1111
|
rb_define_method(cNDTypes, "c_contiguous?", NDTypes_ndt_is_c_contiguous, 0);
|
|
988
1112
|
rb_define_method(cNDTypes, "f_contiguous?", NDTypes_ndt_is_f_contiguous, 0);
|
|
1113
|
+
rb_define_method(cNDTypes, "var_contiguous?", NDTypes_ndt_is_var_contiguous, 0);
|
|
989
1114
|
rb_define_method(cNDTypes, "==", NDTypes_eqeq, 1);
|
|
990
1115
|
rb_define_method(cNDTypes, "!=", NDTypes_neq, 1);
|
|
991
1116
|
|
|
@@ -993,11 +1118,9 @@ void Init_ruby_ndtypes(void)
|
|
|
993
1118
|
rb_define_singleton_method(cNDTypes, "deserialize", NDTypes_s_deserialize, 1);
|
|
994
1119
|
rb_define_singleton_method(cNDTypes, "typedef", NDTypes_s_typedef, 2);
|
|
995
1120
|
rb_define_singleton_method(cNDTypes, "instantiate", NDTypes_s_instantiate, 2);
|
|
1121
|
+
rb_define_singleton_method(cNDTypes, "from_format", NDTypes_s_from_format, 1);
|
|
996
1122
|
|
|
997
1123
|
/* Constants */
|
|
998
1124
|
rb_define_const(cNDTypes, "MAX_DIM", INT2NUM(NDT_MAX_DIM));
|
|
999
|
-
|
|
1000
|
-
/* GC guard init */
|
|
1001
|
-
rb_ndtypes_init_gc_guard();
|
|
1002
1125
|
}
|
|
1003
1126
|
|