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
|
Binary file
|
|
@@ -31,6 +31,10 @@
|
|
|
31
31
|
*/
|
|
32
32
|
|
|
33
33
|
|
|
34
|
+
#ifdef _MSC_VER
|
|
35
|
+
#include <windows.h>
|
|
36
|
+
#endif
|
|
37
|
+
|
|
34
38
|
#include <stdlib.h>
|
|
35
39
|
#include <string.h>
|
|
36
40
|
#include <stdint.h>
|
|
@@ -54,6 +58,12 @@ max(uint16_t x, uint16_t y)
|
|
|
54
58
|
return x >= y ? x : y;
|
|
55
59
|
}
|
|
56
60
|
|
|
61
|
+
static inline int64_t
|
|
62
|
+
max_i64(int64_t x, int64_t y)
|
|
63
|
+
{
|
|
64
|
+
return x >= y ? x : y;
|
|
65
|
+
}
|
|
66
|
+
|
|
57
67
|
static inline int
|
|
58
68
|
ispower2(uint16_t n)
|
|
59
69
|
{
|
|
@@ -79,11 +89,29 @@ round_up(int64_t offset, uint16_t align, bool *overflow)
|
|
|
79
89
|
static uint32_t
|
|
80
90
|
ndt_subtree_flags(const ndt_t *type)
|
|
81
91
|
{
|
|
82
|
-
|
|
83
|
-
|
|
92
|
+
uint32_t flags = 0U;
|
|
93
|
+
|
|
94
|
+
if (type == NULL) {
|
|
95
|
+
return flags;
|
|
84
96
|
}
|
|
85
97
|
|
|
86
|
-
|
|
98
|
+
if (type->flags & (NDT_OPTION|NDT_SUBTREE_OPTION)) {
|
|
99
|
+
flags |= NDT_SUBTREE_OPTION;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
if (type->flags & NDT_POINTER) {
|
|
103
|
+
flags |= NDT_POINTER;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
if (type->flags & NDT_REF) {
|
|
107
|
+
flags |= NDT_REF;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
if (type->flags & NDT_CHAR) {
|
|
111
|
+
flags |= NDT_CHAR;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
return flags;
|
|
87
115
|
}
|
|
88
116
|
|
|
89
117
|
/* Determine general subtree and ellipsis flags. */
|
|
@@ -109,7 +137,7 @@ ndt_itemsize(const ndt_t *t)
|
|
|
109
137
|
switch (t->tag) {
|
|
110
138
|
case FixedDim:
|
|
111
139
|
return t->Concrete.FixedDim.itemsize;
|
|
112
|
-
case VarDim:
|
|
140
|
+
case VarDim: case VarDimElem:
|
|
113
141
|
return t->Concrete.VarDim.itemsize;
|
|
114
142
|
default:
|
|
115
143
|
return t->datasize;
|
|
@@ -121,6 +149,38 @@ ndt_itemsize(const ndt_t *t)
|
|
|
121
149
|
/* Predicates */
|
|
122
150
|
/*****************************************************************************/
|
|
123
151
|
|
|
152
|
+
bool
|
|
153
|
+
ndt_is_static(const ndt_t *t)
|
|
154
|
+
{
|
|
155
|
+
switch (t->tag) {
|
|
156
|
+
case String:
|
|
157
|
+
case Bool:
|
|
158
|
+
case SignedKind: case Int8: case Int16: case Int32: case Int64:
|
|
159
|
+
case UnsignedKind: case Uint8: case Uint16: case Uint32: case Uint64:
|
|
160
|
+
case FloatKind: case BFloat16: case Float16: case Float32: case Float64:
|
|
161
|
+
case ComplexKind: case BComplex32: case Complex32: case Complex64: case Complex128:
|
|
162
|
+
return true;
|
|
163
|
+
default:
|
|
164
|
+
return false;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
bool
|
|
169
|
+
ndt_is_static_tag(enum ndt tag)
|
|
170
|
+
{
|
|
171
|
+
switch (tag) {
|
|
172
|
+
case String:
|
|
173
|
+
case Bool:
|
|
174
|
+
case SignedKind: case Int8: case Int16: case Int32: case Int64:
|
|
175
|
+
case UnsignedKind: case Uint8: case Uint16: case Uint32: case Uint64:
|
|
176
|
+
case FloatKind: case BFloat16: case Float16: case Float32: case Float64:
|
|
177
|
+
case ComplexKind: case BComplex32: case Complex32: case Complex64: case Complex128:
|
|
178
|
+
return true;
|
|
179
|
+
default:
|
|
180
|
+
return false;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
|
|
124
184
|
/* Type field access */
|
|
125
185
|
int
|
|
126
186
|
ndt_is_abstract(const ndt_t *t)
|
|
@@ -147,6 +207,18 @@ ndt_subtree_is_optional(const ndt_t *t)
|
|
|
147
207
|
return t->flags & NDT_SUBTREE_OPTION;
|
|
148
208
|
}
|
|
149
209
|
|
|
210
|
+
int
|
|
211
|
+
ndt_is_pointer_free(const ndt_t *t)
|
|
212
|
+
{
|
|
213
|
+
return !(t->flags & NDT_POINTER);
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
int
|
|
217
|
+
ndt_is_ref_free(const ndt_t *t)
|
|
218
|
+
{
|
|
219
|
+
return !(t->flags & NDT_REF);
|
|
220
|
+
}
|
|
221
|
+
|
|
150
222
|
/* Array predicates */
|
|
151
223
|
int
|
|
152
224
|
ndt_is_ndarray(const ndt_t *t)
|
|
@@ -222,6 +294,44 @@ ndt_is_f_contiguous(const ndt_t *t)
|
|
|
222
294
|
return 1;
|
|
223
295
|
}
|
|
224
296
|
|
|
297
|
+
static int
|
|
298
|
+
_is_var_contiguous(const ndt_t *t, int32_t nitems)
|
|
299
|
+
{
|
|
300
|
+
if (t->ndim == 0) {
|
|
301
|
+
return 1;
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
switch (t->tag) {
|
|
305
|
+
case VarDim: {
|
|
306
|
+
const int32_t noffsets = t->Concrete.VarDim.offsets->n;
|
|
307
|
+
const int32_t *offsets = t->Concrete.VarDim.offsets->v;
|
|
308
|
+
|
|
309
|
+
if (noffsets != nitems+1) {
|
|
310
|
+
return 0;
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
if (t->Concrete.VarDim.nslices != 0 ||
|
|
314
|
+
t->Concrete.VarDim.slices != NULL) {
|
|
315
|
+
return 0;
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
return _is_var_contiguous(t->VarDim.type, offsets[noffsets-1]);
|
|
319
|
+
}
|
|
320
|
+
default:
|
|
321
|
+
return 0;
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
int
|
|
326
|
+
ndt_is_var_contiguous(const ndt_t *t)
|
|
327
|
+
{
|
|
328
|
+
if (ndt_is_abstract(t)) {
|
|
329
|
+
return 0;
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
return _is_var_contiguous(t, 1);
|
|
333
|
+
}
|
|
334
|
+
|
|
225
335
|
int
|
|
226
336
|
ndt_really_fortran(const ndt_t *t)
|
|
227
337
|
{
|
|
@@ -236,8 +346,8 @@ ndt_is_scalar(const ndt_t *t)
|
|
|
236
346
|
case Bool:
|
|
237
347
|
case Int8: case Int16: case Int32: case Int64:
|
|
238
348
|
case Uint8: case Uint16: case Uint32: case Uint64:
|
|
239
|
-
case Float16: case Float32: case Float64:
|
|
240
|
-
case Complex32: case Complex64: case Complex128:
|
|
349
|
+
case BFloat16: case Float16: case Float32: case Float64:
|
|
350
|
+
case BComplex32: case Complex32: case Complex64: case Complex128:
|
|
241
351
|
case FixedString: case FixedBytes:
|
|
242
352
|
case String: case Bytes:
|
|
243
353
|
case Char:
|
|
@@ -274,7 +384,7 @@ int
|
|
|
274
384
|
ndt_is_float(const ndt_t *t)
|
|
275
385
|
{
|
|
276
386
|
switch (t->tag) {
|
|
277
|
-
case Float16: case Float32: case Float64:
|
|
387
|
+
case BFloat16: case Float16: case Float32: case Float64:
|
|
278
388
|
return 1;
|
|
279
389
|
default:
|
|
280
390
|
return 0;
|
|
@@ -285,7 +395,7 @@ int
|
|
|
285
395
|
ndt_is_complex(const ndt_t *t)
|
|
286
396
|
{
|
|
287
397
|
switch (t->tag) {
|
|
288
|
-
case Complex32: case Complex64: case Complex128:
|
|
398
|
+
case BComplex32: case Complex32: case Complex64: case Complex128:
|
|
289
399
|
return 1;
|
|
290
400
|
default:
|
|
291
401
|
return 0;
|
|
@@ -304,8 +414,8 @@ ndt_is_little_endian(const ndt_t *t)
|
|
|
304
414
|
switch (t->tag) {
|
|
305
415
|
case Int8: case Int16: case Int32: case Int64:
|
|
306
416
|
case Uint8: case Uint16: case Uint32: case Uint64:
|
|
307
|
-
case Float16: case Float32: case Float64:
|
|
308
|
-
case Complex32: case Complex64: case Complex128:
|
|
417
|
+
case BFloat16: case Float16: case Float32: case Float64:
|
|
418
|
+
case BComplex32: case Complex32: case Complex64: case Complex128:
|
|
309
419
|
if (t->flags & NDT_LITTLE_ENDIAN) {
|
|
310
420
|
return 1;
|
|
311
421
|
}
|
|
@@ -324,8 +434,8 @@ ndt_is_big_endian(const ndt_t *t)
|
|
|
324
434
|
switch (t->tag) {
|
|
325
435
|
case Int16: case Int32: case Int64:
|
|
326
436
|
case Uint16: case Uint32: case Uint64:
|
|
327
|
-
case Float16: case Float32: case Float64:
|
|
328
|
-
case Complex32: case Complex64: case Complex128:
|
|
437
|
+
case BFloat16: case Float16: case Float32: case Float64:
|
|
438
|
+
case BComplex32: case Complex32: case Complex64: case Complex128:
|
|
329
439
|
if (t->flags & NDT_BIG_ENDIAN) {
|
|
330
440
|
return 1;
|
|
331
441
|
}
|
|
@@ -449,7 +559,7 @@ get_align(uint16_opt_t align, uint16_t default_align, ndt_context_t *ctx)
|
|
|
449
559
|
* 'name' is NULL for a tuple field.
|
|
450
560
|
*/
|
|
451
561
|
ndt_field_t *
|
|
452
|
-
ndt_field(char *name, ndt_t *type, uint16_opt_t align, uint16_opt_t pack,
|
|
562
|
+
ndt_field(char *name, const ndt_t *type, uint16_opt_t align, uint16_opt_t pack,
|
|
453
563
|
uint16_opt_t pad, ndt_context_t *ctx)
|
|
454
564
|
{
|
|
455
565
|
ndt_field_t *field;
|
|
@@ -462,7 +572,6 @@ ndt_field(char *name, ndt_t *type, uint16_opt_t align, uint16_opt_t pack,
|
|
|
462
572
|
min_align = min_field_align(type, align, pack, ctx);
|
|
463
573
|
if (min_align == UINT16_MAX) {
|
|
464
574
|
ndt_free(name);
|
|
465
|
-
ndt_del(type);
|
|
466
575
|
return NULL;
|
|
467
576
|
}
|
|
468
577
|
|
|
@@ -470,10 +579,11 @@ ndt_field(char *name, ndt_t *type, uint16_opt_t align, uint16_opt_t pack,
|
|
|
470
579
|
field = ndt_alloc_size(sizeof *field);
|
|
471
580
|
if (field == NULL) {
|
|
472
581
|
ndt_free(name);
|
|
473
|
-
ndt_del(type);
|
|
474
582
|
return ndt_memory_error(ctx);
|
|
475
583
|
}
|
|
476
584
|
field->name = name;
|
|
585
|
+
|
|
586
|
+
ndt_incref(type);
|
|
477
587
|
field->type = type;
|
|
478
588
|
|
|
479
589
|
/* concrete access */
|
|
@@ -493,7 +603,7 @@ ndt_field_del(ndt_field_t *field)
|
|
|
493
603
|
{
|
|
494
604
|
if (field) {
|
|
495
605
|
ndt_free(field->name);
|
|
496
|
-
|
|
606
|
+
ndt_decref(field->type);
|
|
497
607
|
ndt_free(field);
|
|
498
608
|
}
|
|
499
609
|
}
|
|
@@ -509,14 +619,14 @@ ndt_field_array_del(ndt_field_t *fields, int64_t shape)
|
|
|
509
619
|
|
|
510
620
|
for (i = 0; i < shape; i++) {
|
|
511
621
|
ndt_free(fields[i].name);
|
|
512
|
-
|
|
622
|
+
ndt_decref(fields[i].type);
|
|
513
623
|
}
|
|
514
624
|
|
|
515
625
|
ndt_free(fields);
|
|
516
626
|
}
|
|
517
627
|
|
|
518
628
|
void
|
|
519
|
-
ndt_type_array_clear(ndt_t **types, int64_t shape)
|
|
629
|
+
ndt_type_array_clear(const ndt_t **types, int64_t shape)
|
|
520
630
|
{
|
|
521
631
|
int64_t i;
|
|
522
632
|
|
|
@@ -525,15 +635,15 @@ ndt_type_array_clear(ndt_t **types, int64_t shape)
|
|
|
525
635
|
}
|
|
526
636
|
|
|
527
637
|
for (i = 0; i < shape; i++) {
|
|
528
|
-
|
|
638
|
+
ndt_decref(types[i]);
|
|
529
639
|
}
|
|
530
640
|
}
|
|
531
641
|
|
|
532
642
|
void
|
|
533
|
-
ndt_type_array_del(ndt_t **types, int64_t shape)
|
|
643
|
+
ndt_type_array_del(const ndt_t **types, int64_t shape)
|
|
534
644
|
{
|
|
535
645
|
ndt_type_array_clear(types, shape);
|
|
536
|
-
ndt_free(types);
|
|
646
|
+
ndt_free((void *)types);
|
|
537
647
|
}
|
|
538
648
|
|
|
539
649
|
|
|
@@ -542,35 +652,29 @@ ndt_type_array_del(ndt_t **types, int64_t shape)
|
|
|
542
652
|
/*****************************************************************************/
|
|
543
653
|
|
|
544
654
|
/*
|
|
545
|
-
* Add a typedef name -> type to the symbol table.
|
|
546
|
-
* reference.
|
|
655
|
+
* Add a typedef name -> type to the symbol table.
|
|
547
656
|
*/
|
|
548
657
|
int
|
|
549
|
-
ndt_typedef(const char *name, ndt_t *type, const ndt_methods_t *m, ndt_context_t *ctx)
|
|
658
|
+
ndt_typedef(const char *name, const ndt_t *type, const ndt_methods_t *m, ndt_context_t *ctx)
|
|
550
659
|
{
|
|
551
|
-
|
|
552
|
-
return -1;
|
|
553
|
-
}
|
|
554
|
-
|
|
555
|
-
return 0;
|
|
660
|
+
return ndt_typedef_add(name, type, m, ctx);
|
|
556
661
|
}
|
|
557
662
|
|
|
558
663
|
int
|
|
559
664
|
ndt_typedef_from_string(const char *name, const char *type, const ndt_methods_t *m,
|
|
560
665
|
ndt_context_t *ctx)
|
|
561
666
|
{
|
|
562
|
-
ndt_t *t;
|
|
667
|
+
const ndt_t *t;
|
|
668
|
+
int ret;
|
|
563
669
|
|
|
564
670
|
t = ndt_from_string(type, ctx);
|
|
565
671
|
if (t == NULL) {
|
|
566
672
|
return -1;
|
|
567
673
|
}
|
|
568
674
|
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
return 0;
|
|
675
|
+
ret = ndt_typedef_add(name, t, m, ctx);
|
|
676
|
+
ndt_decref(t);
|
|
677
|
+
return ret;
|
|
574
678
|
}
|
|
575
679
|
|
|
576
680
|
|
|
@@ -578,7 +682,7 @@ ndt_typedef_from_string(const char *name, const char *type, const ndt_methods_t
|
|
|
578
682
|
/* Type invariants */
|
|
579
683
|
/******************************************************************************/
|
|
580
684
|
|
|
581
|
-
/* Invariants for all types except for
|
|
685
|
+
/* Invariants for all types except for dimensions. */
|
|
582
686
|
static int
|
|
583
687
|
check_type_invariants(const ndt_t *type, ndt_context_t *ctx)
|
|
584
688
|
{
|
|
@@ -588,9 +692,29 @@ check_type_invariants(const ndt_t *type, ndt_context_t *ctx)
|
|
|
588
692
|
return 0;
|
|
589
693
|
}
|
|
590
694
|
|
|
591
|
-
if (type->
|
|
695
|
+
if (type->ndim >= NDT_MAX_DIM) {
|
|
696
|
+
ndt_err_format(ctx, NDT_TypeError, "ndim > %d", NDT_MAX_DIM);
|
|
697
|
+
return 0;
|
|
698
|
+
}
|
|
699
|
+
|
|
700
|
+
return 1;
|
|
701
|
+
}
|
|
702
|
+
|
|
703
|
+
/* Invariants for fixed dimensions. */
|
|
704
|
+
static int
|
|
705
|
+
check_fixed_invariants(const ndt_t *type, ndt_context_t *ctx)
|
|
706
|
+
{
|
|
707
|
+
if (type->tag == Module) {
|
|
592
708
|
ndt_err_format(ctx, NDT_TypeError,
|
|
593
|
-
"nested
|
|
709
|
+
"nested module types are not supported");
|
|
710
|
+
return 0;
|
|
711
|
+
}
|
|
712
|
+
|
|
713
|
+
if (type->tag == VarDim || type->tag == VarDimElem ||
|
|
714
|
+
type->tag == Array) {
|
|
715
|
+
ndt_err_format(ctx, NDT_TypeError,
|
|
716
|
+
"fixed dimensions cannot contain var dimensions "
|
|
717
|
+
"or flexible arrays");
|
|
594
718
|
return 0;
|
|
595
719
|
}
|
|
596
720
|
|
|
@@ -612,13 +736,16 @@ check_abstract_var_invariants(const ndt_t *type, ndt_context_t *ctx)
|
|
|
612
736
|
return 0;
|
|
613
737
|
}
|
|
614
738
|
|
|
615
|
-
if (type->tag == FixedDim || type->tag == SymbolicDim
|
|
739
|
+
if (type->tag == FixedDim || type->tag == SymbolicDim ||
|
|
740
|
+
type->tag == Array) {
|
|
616
741
|
ndt_err_format(ctx, NDT_TypeError,
|
|
617
|
-
"
|
|
742
|
+
"var dimensions cannot contain fixed dimensions or "
|
|
743
|
+
"flexible arrays");
|
|
618
744
|
return 0;
|
|
619
745
|
}
|
|
620
746
|
|
|
621
|
-
if (type->tag == VarDim && ndt_is_concrete(type))
|
|
747
|
+
if ((type->tag == VarDim && ndt_is_concrete(type)) ||
|
|
748
|
+
type->tag == VarDimElem) {
|
|
622
749
|
ndt_err_format(ctx, NDT_TypeError,
|
|
623
750
|
"mixing abstract and concrete var dimensions is not allowed");
|
|
624
751
|
return 0;
|
|
@@ -634,7 +761,7 @@ check_abstract_var_invariants(const ndt_t *type, ndt_context_t *ctx)
|
|
|
634
761
|
|
|
635
762
|
/* Invariants for concrete var dimensions. */
|
|
636
763
|
static int
|
|
637
|
-
check_var_invariants(
|
|
764
|
+
check_var_invariants(const ndt_t *type, ndt_context_t *ctx)
|
|
638
765
|
{
|
|
639
766
|
if (type->tag == Module) {
|
|
640
767
|
ndt_err_format(ctx, NDT_TypeError,
|
|
@@ -642,23 +769,20 @@ check_var_invariants(enum ndt_offsets flag, const ndt_t *type, ndt_context_t *ct
|
|
|
642
769
|
return 0;
|
|
643
770
|
}
|
|
644
771
|
|
|
645
|
-
if (type->tag == FixedDim || type->tag == SymbolicDim
|
|
772
|
+
if (type->tag == FixedDim || type->tag == SymbolicDim ||
|
|
773
|
+
type->tag == Array) {
|
|
646
774
|
ndt_err_format(ctx, NDT_TypeError,
|
|
647
|
-
"
|
|
775
|
+
"var dimensions cannot contain fixed dimensions or "
|
|
776
|
+
"flexible arrays");
|
|
648
777
|
return 0;
|
|
649
778
|
}
|
|
650
779
|
|
|
651
|
-
if (type->tag == VarDim) {
|
|
780
|
+
if (type->tag == VarDim || type->tag == VarDimElem) {
|
|
652
781
|
if (ndt_is_abstract(type)) {
|
|
653
782
|
ndt_err_format(ctx, NDT_TypeError,
|
|
654
783
|
"mixing abstract and concrete var dimensions is not allowed");
|
|
655
784
|
return 0;
|
|
656
785
|
}
|
|
657
|
-
if (flag != type->Concrete.VarDim.flag) {
|
|
658
|
-
ndt_err_format(ctx, NDT_TypeError,
|
|
659
|
-
"mixing internal and external offsets is not allowed");
|
|
660
|
-
return 0;
|
|
661
|
-
}
|
|
662
786
|
}
|
|
663
787
|
|
|
664
788
|
if (type->ndim >= NDT_MAX_DIM) {
|
|
@@ -669,6 +793,32 @@ check_var_invariants(enum ndt_offsets flag, const ndt_t *type, ndt_context_t *ct
|
|
|
669
793
|
return 1;
|
|
670
794
|
}
|
|
671
795
|
|
|
796
|
+
/* Invariants for array dimensions. */
|
|
797
|
+
static int
|
|
798
|
+
check_array_invariants(const ndt_t *type, ndt_context_t *ctx)
|
|
799
|
+
{
|
|
800
|
+
if (type->tag == Module) {
|
|
801
|
+
ndt_err_format(ctx, NDT_TypeError,
|
|
802
|
+
"nested module types are not supported");
|
|
803
|
+
return 0;
|
|
804
|
+
}
|
|
805
|
+
|
|
806
|
+
if (type->tag == FixedDim || type->tag == SymbolicDim ||
|
|
807
|
+
type->tag == VarDim || type->tag == VarDimElem) {
|
|
808
|
+
ndt_err_format(ctx, NDT_TypeError,
|
|
809
|
+
"cannot mix fixed or var dimensions with flexible arrays");
|
|
810
|
+
return 0;
|
|
811
|
+
}
|
|
812
|
+
|
|
813
|
+
if (!ndt_is_ref_free(type)) {
|
|
814
|
+
ndt_err_format(ctx, NDT_TypeError,
|
|
815
|
+
"flexible array elements cannot be contain references");
|
|
816
|
+
return 0;
|
|
817
|
+
}
|
|
818
|
+
|
|
819
|
+
return 1;
|
|
820
|
+
}
|
|
821
|
+
|
|
672
822
|
/* Invariants for ellipsis dimensions. */
|
|
673
823
|
static int
|
|
674
824
|
check_ellipsis_invariants(const ndt_t *type, ndt_context_t *ctx)
|
|
@@ -697,7 +847,7 @@ strcmp_null(const char *s, const char *t)
|
|
|
697
847
|
}
|
|
698
848
|
|
|
699
849
|
static int
|
|
700
|
-
check_function_invariants(ndt_t
|
|
850
|
+
check_function_invariants(const ndt_t **types, int64_t nin, int64_t nargs,
|
|
701
851
|
ndt_context_t *ctx)
|
|
702
852
|
{
|
|
703
853
|
int64_t count = 0;
|
|
@@ -746,7 +896,7 @@ error:
|
|
|
746
896
|
}
|
|
747
897
|
|
|
748
898
|
static bool
|
|
749
|
-
is_elemwise(ndt_t
|
|
899
|
+
is_elemwise(const ndt_t **types, int64_t nargs)
|
|
750
900
|
{
|
|
751
901
|
for (int64_t i = 0; i < nargs; i++) {
|
|
752
902
|
if ((types[i]->ndim == 1 && types[i]->tag == EllipsisDim) ||
|
|
@@ -765,7 +915,7 @@ is_elemwise(ndt_t * const *types, int64_t nargs)
|
|
|
765
915
|
/******************************************************************************/
|
|
766
916
|
|
|
767
917
|
ndt_t *
|
|
768
|
-
ndt_new(enum ndt tag, ndt_context_t *ctx)
|
|
918
|
+
ndt_new(enum ndt tag, uint32_t flags, ndt_context_t *ctx)
|
|
769
919
|
{
|
|
770
920
|
ndt_t *t;
|
|
771
921
|
|
|
@@ -776,17 +926,19 @@ ndt_new(enum ndt tag, ndt_context_t *ctx)
|
|
|
776
926
|
|
|
777
927
|
t->tag = tag;
|
|
778
928
|
t->access = Abstract;
|
|
779
|
-
t->flags =
|
|
929
|
+
t->flags = flags;
|
|
780
930
|
t->ndim = 0;
|
|
781
931
|
|
|
782
932
|
t->datasize = 0;
|
|
783
933
|
t->align = UINT16_MAX;
|
|
784
934
|
|
|
935
|
+
t->refcnt = 1;
|
|
936
|
+
|
|
785
937
|
return t;
|
|
786
938
|
}
|
|
787
939
|
|
|
788
940
|
static ndt_t *
|
|
789
|
-
ndt_new_extra(enum ndt tag, int64_t n, ndt_context_t *ctx)
|
|
941
|
+
ndt_new_extra(enum ndt tag, int64_t n, uint32_t flags, ndt_context_t *ctx)
|
|
790
942
|
{
|
|
791
943
|
bool overflow = 0;
|
|
792
944
|
ndt_t *t;
|
|
@@ -805,12 +957,14 @@ ndt_new_extra(enum ndt tag, int64_t n, ndt_context_t *ctx)
|
|
|
805
957
|
|
|
806
958
|
t->tag = tag;
|
|
807
959
|
t->access = Abstract;
|
|
808
|
-
t->flags =
|
|
960
|
+
t->flags = flags;
|
|
809
961
|
t->ndim = 0;
|
|
810
962
|
|
|
811
963
|
t->datasize = 0;
|
|
812
964
|
t->align = UINT16_MAX;
|
|
813
965
|
|
|
966
|
+
t->refcnt = 1;
|
|
967
|
+
|
|
814
968
|
return t;
|
|
815
969
|
}
|
|
816
970
|
|
|
@@ -828,12 +982,12 @@ ndt_function_new(int64_t nargs, ndt_context_t *ctx)
|
|
|
828
982
|
return NULL;
|
|
829
983
|
}
|
|
830
984
|
|
|
831
|
-
t = ndt_new_extra(Function, extra, ctx);
|
|
985
|
+
t = ndt_new_extra(Function, extra, 0, ctx);
|
|
832
986
|
if (t == NULL) {
|
|
833
987
|
return NULL;
|
|
834
988
|
}
|
|
835
989
|
t->Function.nargs = nargs;
|
|
836
|
-
t->Function.types = (ndt_t **)t->extra;
|
|
990
|
+
t->Function.types = (const ndt_t **)t->extra;
|
|
837
991
|
|
|
838
992
|
for (i = 0; i < nargs; i++) {
|
|
839
993
|
t->Function.types[i] = NULL;
|
|
@@ -843,7 +997,7 @@ ndt_function_new(int64_t nargs, ndt_context_t *ctx)
|
|
|
843
997
|
}
|
|
844
998
|
|
|
845
999
|
ndt_t *
|
|
846
|
-
ndt_tuple_new(enum ndt_variadic flag, int64_t shape, ndt_context_t *ctx)
|
|
1000
|
+
ndt_tuple_new(enum ndt_variadic flag, int64_t shape, bool opt, ndt_context_t *ctx)
|
|
847
1001
|
{
|
|
848
1002
|
ndt_t *t = NULL;
|
|
849
1003
|
bool overflow = 0;
|
|
@@ -870,14 +1024,14 @@ ndt_tuple_new(enum ndt_variadic flag, int64_t shape, ndt_context_t *ctx)
|
|
|
870
1024
|
return NULL;
|
|
871
1025
|
}
|
|
872
1026
|
|
|
873
|
-
t = ndt_new_extra(Tuple, extra, ctx);
|
|
1027
|
+
t = ndt_new_extra(Tuple, extra, opt, ctx);
|
|
874
1028
|
if (t == NULL) {
|
|
875
1029
|
return NULL;
|
|
876
1030
|
}
|
|
877
1031
|
|
|
878
1032
|
t->Tuple.flag = flag;
|
|
879
1033
|
t->Tuple.shape = shape;
|
|
880
|
-
t->Tuple.types = (ndt_t **)t->extra;
|
|
1034
|
+
t->Tuple.types = (const ndt_t **)t->extra;
|
|
881
1035
|
t->Concrete.Tuple.offset = (int64_t *)(t->extra + offset_offset);
|
|
882
1036
|
t->Concrete.Tuple.align = (uint16_t *)(t->extra + align_offset);
|
|
883
1037
|
t->Concrete.Tuple.pad = (uint16_t *)(t->extra + pad_offset);
|
|
@@ -893,7 +1047,7 @@ ndt_tuple_new(enum ndt_variadic flag, int64_t shape, ndt_context_t *ctx)
|
|
|
893
1047
|
}
|
|
894
1048
|
|
|
895
1049
|
ndt_t *
|
|
896
|
-
ndt_record_new(enum ndt_variadic flag, int64_t shape, ndt_context_t *ctx)
|
|
1050
|
+
ndt_record_new(enum ndt_variadic flag, int64_t shape, bool opt, ndt_context_t *ctx)
|
|
897
1051
|
{
|
|
898
1052
|
ndt_t *t = NULL;
|
|
899
1053
|
bool overflow = 0;
|
|
@@ -923,7 +1077,7 @@ ndt_record_new(enum ndt_variadic flag, int64_t shape, ndt_context_t *ctx)
|
|
|
923
1077
|
return NULL;
|
|
924
1078
|
}
|
|
925
1079
|
|
|
926
|
-
t = ndt_new_extra(Record, extra, ctx);
|
|
1080
|
+
t = ndt_new_extra(Record, extra, opt, ctx);
|
|
927
1081
|
if (t == NULL) {
|
|
928
1082
|
return NULL;
|
|
929
1083
|
}
|
|
@@ -931,7 +1085,7 @@ ndt_record_new(enum ndt_variadic flag, int64_t shape, ndt_context_t *ctx)
|
|
|
931
1085
|
t->Record.flag = flag;
|
|
932
1086
|
t->Record.shape = shape;
|
|
933
1087
|
t->Record.names = (char **)t->extra;
|
|
934
|
-
t->Record.types = (ndt_t **)(t->extra + types_offset);
|
|
1088
|
+
t->Record.types = (const ndt_t **)(t->extra + types_offset);
|
|
935
1089
|
t->Concrete.Record.offset = (int64_t *)(t->extra + offset_offset);
|
|
936
1090
|
t->Concrete.Record.align = (uint16_t *)(t->extra + align_offset);
|
|
937
1091
|
t->Concrete.Record.pad = (uint16_t *)(t->extra + pad_offset);
|
|
@@ -947,7 +1101,41 @@ ndt_record_new(enum ndt_variadic flag, int64_t shape, ndt_context_t *ctx)
|
|
|
947
1101
|
return t;
|
|
948
1102
|
}
|
|
949
1103
|
|
|
950
|
-
|
|
1104
|
+
ndt_t *
|
|
1105
|
+
ndt_union_new(int64_t ntags, bool opt, ndt_context_t *ctx)
|
|
1106
|
+
{
|
|
1107
|
+
ndt_t *t = NULL;
|
|
1108
|
+
bool overflow = 0;
|
|
1109
|
+
int64_t extra;
|
|
1110
|
+
int64_t types_offset;
|
|
1111
|
+
int64_t i;
|
|
1112
|
+
|
|
1113
|
+
types_offset = MULi64(ntags, sizeof(char *), &overflow);
|
|
1114
|
+
extra = MULi64(2, types_offset, &overflow);
|
|
1115
|
+
|
|
1116
|
+
if (overflow) {
|
|
1117
|
+
ndt_err_format(ctx, NDT_ValueError, "union size too large");
|
|
1118
|
+
return NULL;
|
|
1119
|
+
}
|
|
1120
|
+
|
|
1121
|
+
t = ndt_new_extra(Union, extra, opt, ctx);
|
|
1122
|
+
if (t == NULL) {
|
|
1123
|
+
return NULL;
|
|
1124
|
+
}
|
|
1125
|
+
|
|
1126
|
+
t->Union.ntags = ntags;
|
|
1127
|
+
t->Union.tags = (char **)t->extra;
|
|
1128
|
+
t->Union.types = (const ndt_t **)(t->extra + types_offset);
|
|
1129
|
+
|
|
1130
|
+
for (i = 0; i < ntags; i++) {
|
|
1131
|
+
t->Union.tags[i] = NULL;
|
|
1132
|
+
t->Union.types[i] = NULL;
|
|
1133
|
+
}
|
|
1134
|
+
|
|
1135
|
+
return t;
|
|
1136
|
+
}
|
|
1137
|
+
|
|
1138
|
+
static void
|
|
951
1139
|
ndt_del(ndt_t *t)
|
|
952
1140
|
{
|
|
953
1141
|
if (t == NULL) {
|
|
@@ -957,29 +1145,27 @@ ndt_del(ndt_t *t)
|
|
|
957
1145
|
switch (t->tag) {
|
|
958
1146
|
case Module: {
|
|
959
1147
|
ndt_free(t->Module.name);
|
|
960
|
-
|
|
1148
|
+
ndt_decref(t->Module.type);
|
|
961
1149
|
goto free_type;
|
|
962
1150
|
}
|
|
963
1151
|
|
|
964
1152
|
case Function: {
|
|
965
1153
|
int64_t i;
|
|
966
1154
|
for (i = 0; i < t->Function.nargs; i++) {
|
|
967
|
-
|
|
1155
|
+
ndt_decref(t->Function.types[i]);
|
|
968
1156
|
}
|
|
969
1157
|
goto free_type;
|
|
970
1158
|
}
|
|
971
1159
|
|
|
972
1160
|
case FixedDim: {
|
|
973
|
-
|
|
1161
|
+
ndt_decref(t->FixedDim.type);
|
|
974
1162
|
goto free_type;
|
|
975
1163
|
}
|
|
976
1164
|
|
|
977
|
-
case VarDim: {
|
|
978
|
-
|
|
1165
|
+
case VarDim: case VarDimElem: {
|
|
1166
|
+
ndt_decref(t->VarDim.type);
|
|
979
1167
|
if (ndt_is_concrete(t)) {
|
|
980
|
-
|
|
981
|
-
ndt_free((int32_t *)t->Concrete.VarDim.offsets);
|
|
982
|
-
}
|
|
1168
|
+
ndt_decref_offsets(t->Concrete.VarDim.offsets);
|
|
983
1169
|
ndt_free(t->Concrete.VarDim.slices);
|
|
984
1170
|
}
|
|
985
1171
|
goto free_type;
|
|
@@ -987,20 +1173,25 @@ ndt_del(ndt_t *t)
|
|
|
987
1173
|
|
|
988
1174
|
case SymbolicDim: {
|
|
989
1175
|
ndt_free(t->SymbolicDim.name);
|
|
990
|
-
|
|
1176
|
+
ndt_decref(t->SymbolicDim.type);
|
|
991
1177
|
goto free_type;
|
|
992
1178
|
}
|
|
993
1179
|
|
|
994
1180
|
case EllipsisDim: {
|
|
995
1181
|
ndt_free(t->EllipsisDim.name);
|
|
996
|
-
|
|
1182
|
+
ndt_decref(t->EllipsisDim.type);
|
|
1183
|
+
goto free_type;
|
|
1184
|
+
}
|
|
1185
|
+
|
|
1186
|
+
case Array: {
|
|
1187
|
+
ndt_decref(t->Array.type);
|
|
997
1188
|
goto free_type;
|
|
998
1189
|
}
|
|
999
1190
|
|
|
1000
1191
|
case Tuple: {
|
|
1001
1192
|
int64_t i;
|
|
1002
1193
|
for (i = 0; i < t->Tuple.shape; i++) {
|
|
1003
|
-
|
|
1194
|
+
ndt_decref(t->Tuple.types[i]);
|
|
1004
1195
|
}
|
|
1005
1196
|
goto free_type;
|
|
1006
1197
|
}
|
|
@@ -1009,25 +1200,34 @@ ndt_del(ndt_t *t)
|
|
|
1009
1200
|
int64_t i;
|
|
1010
1201
|
for (i = 0; i < t->Record.shape; i++) {
|
|
1011
1202
|
ndt_free(t->Record.names[i]);
|
|
1012
|
-
|
|
1203
|
+
ndt_decref(t->Record.types[i]);
|
|
1204
|
+
}
|
|
1205
|
+
goto free_type;
|
|
1206
|
+
}
|
|
1207
|
+
|
|
1208
|
+
case Union: {
|
|
1209
|
+
int64_t i;
|
|
1210
|
+
for (i = 0; i < t->Union.ntags; i++) {
|
|
1211
|
+
ndt_free(t->Union.tags[i]);
|
|
1212
|
+
ndt_decref(t->Union.types[i]);
|
|
1013
1213
|
}
|
|
1014
1214
|
goto free_type;
|
|
1015
1215
|
}
|
|
1016
1216
|
|
|
1017
1217
|
case Ref: {
|
|
1018
|
-
|
|
1218
|
+
ndt_decref(t->Ref.type);
|
|
1019
1219
|
goto free_type;
|
|
1020
1220
|
}
|
|
1021
1221
|
|
|
1022
1222
|
case Constr: {
|
|
1023
1223
|
ndt_free(t->Constr.name);
|
|
1024
|
-
|
|
1224
|
+
ndt_decref(t->Constr.type);
|
|
1025
1225
|
goto free_type;
|
|
1026
1226
|
}
|
|
1027
1227
|
|
|
1028
1228
|
case Nominal: {
|
|
1029
1229
|
ndt_free(t->Nominal.name);
|
|
1030
|
-
|
|
1230
|
+
ndt_decref(t->Nominal.type);
|
|
1031
1231
|
goto free_type;
|
|
1032
1232
|
}
|
|
1033
1233
|
|
|
@@ -1044,17 +1244,16 @@ ndt_del(ndt_t *t)
|
|
|
1044
1244
|
case AnyKind: case ScalarKind:
|
|
1045
1245
|
case FixedStringKind: case FixedString:
|
|
1046
1246
|
case FixedBytesKind: case FixedBytes:
|
|
1047
|
-
case
|
|
1048
|
-
case Bool:
|
|
1049
|
-
case SignedKind:
|
|
1050
|
-
case Int8: case Int16: case Int32: case Int64:
|
|
1051
|
-
case UnsignedKind:
|
|
1052
|
-
case Uint8: case Uint16: case Uint32: case Uint64:
|
|
1053
|
-
case FloatKind:
|
|
1054
|
-
case Float16: case Float32: case Float64:
|
|
1055
|
-
case ComplexKind:
|
|
1056
|
-
case Complex32: case Complex64: case Complex128:
|
|
1247
|
+
case Bytes: case Char:
|
|
1057
1248
|
goto free_type;
|
|
1249
|
+
|
|
1250
|
+
case String:
|
|
1251
|
+
case Bool:
|
|
1252
|
+
case SignedKind: case Int8: case Int16: case Int32: case Int64:
|
|
1253
|
+
case UnsignedKind: case Uint8: case Uint16: case Uint32: case Uint64:
|
|
1254
|
+
case FloatKind: case BFloat16: case Float16: case Float32: case Float64:
|
|
1255
|
+
case ComplexKind: case BComplex32: case Complex32: case Complex64: case Complex128:
|
|
1256
|
+
return;
|
|
1058
1257
|
}
|
|
1059
1258
|
|
|
1060
1259
|
/* NOT REACHED: tags should be exhaustive. */
|
|
@@ -1065,43 +1264,150 @@ free_type:
|
|
|
1065
1264
|
ndt_free(t);
|
|
1066
1265
|
}
|
|
1067
1266
|
|
|
1267
|
+
void
|
|
1268
|
+
ndt_incref(const ndt_t *t)
|
|
1269
|
+
{
|
|
1270
|
+
if (ndt_is_static(t)) {
|
|
1271
|
+
return;
|
|
1272
|
+
}
|
|
1068
1273
|
|
|
1069
|
-
|
|
1070
|
-
|
|
1071
|
-
|
|
1274
|
+
ndt_t *u = (ndt_t *)t;
|
|
1275
|
+
#ifdef _MSC_VER
|
|
1276
|
+
(void)InterlockedIncrement64(&u->refcnt);
|
|
1277
|
+
#else
|
|
1278
|
+
++u->refcnt;
|
|
1279
|
+
#endif
|
|
1280
|
+
}
|
|
1072
1281
|
|
|
1073
|
-
|
|
1074
|
-
ndt_t *
|
|
1075
|
-
ndt_option(ndt_t *t)
|
|
1282
|
+
void
|
|
1283
|
+
ndt_decref(const ndt_t *t)
|
|
1076
1284
|
{
|
|
1077
|
-
t
|
|
1078
|
-
|
|
1285
|
+
if (t == NULL || ndt_is_static(t)) {
|
|
1286
|
+
return;
|
|
1287
|
+
}
|
|
1288
|
+
|
|
1289
|
+
ndt_t *u = (ndt_t *)t;
|
|
1290
|
+
#ifdef _MSC_VER
|
|
1291
|
+
if (InterlockedDecrement64(&u->refcnt) == 0) {
|
|
1292
|
+
ndt_del(u);
|
|
1293
|
+
}
|
|
1294
|
+
#else
|
|
1295
|
+
if (--u->refcnt == 0) {
|
|
1296
|
+
ndt_del(u);
|
|
1297
|
+
}
|
|
1298
|
+
#endif
|
|
1079
1299
|
}
|
|
1080
1300
|
|
|
1301
|
+
void
|
|
1302
|
+
ndt_move(const ndt_t **dst, const ndt_t *src)
|
|
1303
|
+
{
|
|
1304
|
+
ndt_decref(*dst);
|
|
1305
|
+
*dst = src;
|
|
1306
|
+
}
|
|
1307
|
+
|
|
1308
|
+
|
|
1309
|
+
ndt_offsets_t *
|
|
1310
|
+
ndt_offsets_new(int32_t size, ndt_context_t *ctx)
|
|
1311
|
+
{
|
|
1312
|
+
ndt_offsets_t *offsets;
|
|
1313
|
+
|
|
1314
|
+
offsets = ndt_alloc(1, sizeof *offsets);
|
|
1315
|
+
if (offsets == NULL) {
|
|
1316
|
+
return ndt_memory_error(ctx);
|
|
1317
|
+
}
|
|
1318
|
+
|
|
1319
|
+
offsets->v = ndt_calloc(size, sizeof *offsets->v);
|
|
1320
|
+
if (offsets->v == NULL) {
|
|
1321
|
+
ndt_free(offsets);
|
|
1322
|
+
return ndt_memory_error(ctx);
|
|
1323
|
+
}
|
|
1324
|
+
|
|
1325
|
+
offsets->refcnt = 1;
|
|
1326
|
+
offsets->n = size;
|
|
1327
|
+
|
|
1328
|
+
return offsets;
|
|
1329
|
+
}
|
|
1330
|
+
|
|
1331
|
+
ndt_offsets_t *
|
|
1332
|
+
ndt_offsets_from_ptr(int32_t *ptr, int32_t size, ndt_context_t *ctx)
|
|
1333
|
+
{
|
|
1334
|
+
ndt_offsets_t *offsets;
|
|
1335
|
+
|
|
1336
|
+
offsets = ndt_alloc(1, sizeof *offsets);
|
|
1337
|
+
if (offsets == NULL) {
|
|
1338
|
+
ndt_free(ptr);
|
|
1339
|
+
return ndt_memory_error(ctx);
|
|
1340
|
+
}
|
|
1341
|
+
offsets->refcnt = 1;
|
|
1342
|
+
offsets->n = size;
|
|
1343
|
+
offsets->v = ptr;
|
|
1344
|
+
|
|
1345
|
+
return offsets;
|
|
1346
|
+
}
|
|
1347
|
+
|
|
1348
|
+
void
|
|
1349
|
+
ndt_incref_offsets(const ndt_offsets_t *x)
|
|
1350
|
+
{
|
|
1351
|
+
ndt_offsets_t *offsets = (ndt_offsets_t *)x;
|
|
1352
|
+
#ifdef _MSC_VER
|
|
1353
|
+
(void)InterlockedIncrement64(&offsets->refcnt);
|
|
1354
|
+
#else
|
|
1355
|
+
++offsets->refcnt;
|
|
1356
|
+
#endif
|
|
1357
|
+
}
|
|
1358
|
+
|
|
1359
|
+
void
|
|
1360
|
+
ndt_decref_offsets(const ndt_offsets_t *x)
|
|
1361
|
+
{
|
|
1362
|
+
ndt_offsets_t *offsets = (ndt_offsets_t *)x;
|
|
1363
|
+
|
|
1364
|
+
if (offsets == NULL) {
|
|
1365
|
+
return;
|
|
1366
|
+
}
|
|
1367
|
+
|
|
1368
|
+
#ifdef _MSC_VER
|
|
1369
|
+
if (InterlockedDecrement64(&offsets->refcnt) == 0) {
|
|
1370
|
+
ndt_free((void *)offsets->v);
|
|
1371
|
+
ndt_free(offsets);
|
|
1372
|
+
}
|
|
1373
|
+
#else
|
|
1374
|
+
if (--offsets->refcnt == 0) {
|
|
1375
|
+
ndt_free((void *)offsets->v);
|
|
1376
|
+
ndt_free(offsets);
|
|
1377
|
+
}
|
|
1378
|
+
#endif
|
|
1379
|
+
}
|
|
1380
|
+
|
|
1381
|
+
|
|
1382
|
+
/******************************************************************************/
|
|
1383
|
+
/* Type functions */
|
|
1384
|
+
/******************************************************************************/
|
|
1385
|
+
|
|
1081
1386
|
/* Abstract namespace type */
|
|
1082
|
-
ndt_t *
|
|
1083
|
-
ndt_module(char *name, ndt_t *type, ndt_context_t *ctx)
|
|
1387
|
+
const ndt_t *
|
|
1388
|
+
ndt_module(char *name, const ndt_t *type, ndt_context_t *ctx)
|
|
1084
1389
|
{
|
|
1085
1390
|
ndt_t *t;
|
|
1086
1391
|
|
|
1087
|
-
t = ndt_new(Module, ctx);
|
|
1392
|
+
t = ndt_new(Module, 0, ctx);
|
|
1088
1393
|
if (t == NULL) {
|
|
1089
1394
|
ndt_free(name);
|
|
1090
|
-
ndt_del(type);
|
|
1091
1395
|
return NULL;
|
|
1092
1396
|
}
|
|
1093
1397
|
|
|
1398
|
+
ndt_incref(type);
|
|
1399
|
+
|
|
1094
1400
|
/* abstract type */
|
|
1095
1401
|
t->Module.name = name;
|
|
1096
1402
|
t->Module.type = type;
|
|
1097
|
-
t->flags
|
|
1403
|
+
t->flags |= ndt_subtree_flags(type);
|
|
1098
1404
|
|
|
1099
1405
|
return t;
|
|
1100
1406
|
}
|
|
1101
1407
|
|
|
1102
1408
|
/* Abstract function signatures */
|
|
1103
|
-
ndt_t *
|
|
1104
|
-
ndt_function(ndt_t
|
|
1409
|
+
const ndt_t *
|
|
1410
|
+
ndt_function(const ndt_t **types, int64_t nargs, int64_t nin, int64_t nout,
|
|
1105
1411
|
ndt_context_t *ctx)
|
|
1106
1412
|
{
|
|
1107
1413
|
ndt_t *t;
|
|
@@ -1110,16 +1416,12 @@ ndt_function(ndt_t * const *types, int64_t nargs, int64_t nin, int64_t nout,
|
|
|
1110
1416
|
assert(0 <= nin && 0 <= nout && nargs == nin+nout);
|
|
1111
1417
|
|
|
1112
1418
|
if (!check_function_invariants(types, nin, nargs, ctx)) {
|
|
1113
|
-
ndt_type_array_clear((ndt_t **)types, nargs);
|
|
1114
1419
|
return NULL;
|
|
1115
1420
|
}
|
|
1116
1421
|
|
|
1117
1422
|
/* abstract type */
|
|
1118
1423
|
t = ndt_function_new(nargs, ctx);
|
|
1119
1424
|
if (t == NULL) {
|
|
1120
|
-
for (i = 0; i < nargs; i++) {
|
|
1121
|
-
ndt_del(types[i]);
|
|
1122
|
-
}
|
|
1123
1425
|
return NULL;
|
|
1124
1426
|
}
|
|
1125
1427
|
t->Function.elemwise = is_elemwise(types, nargs);
|
|
@@ -1127,6 +1429,7 @@ ndt_function(ndt_t * const *types, int64_t nargs, int64_t nin, int64_t nout,
|
|
|
1127
1429
|
t->Function.nout = nout;
|
|
1128
1430
|
|
|
1129
1431
|
for (i = 0; i < nargs; i++) {
|
|
1432
|
+
ndt_incref(types[i]);
|
|
1130
1433
|
t->Function.types[i] = types[i];
|
|
1131
1434
|
t->flags |= ndt_dim_flags(types[i]);
|
|
1132
1435
|
}
|
|
@@ -1134,10 +1437,10 @@ ndt_function(ndt_t * const *types, int64_t nargs, int64_t nin, int64_t nout,
|
|
|
1134
1437
|
return t;
|
|
1135
1438
|
}
|
|
1136
1439
|
|
|
1137
|
-
ndt_t *
|
|
1138
|
-
ndt_any_kind(ndt_context_t *ctx)
|
|
1440
|
+
const ndt_t *
|
|
1441
|
+
ndt_any_kind(bool opt, ndt_context_t *ctx)
|
|
1139
1442
|
{
|
|
1140
|
-
return ndt_new(AnyKind, ctx);
|
|
1443
|
+
return ndt_new(AnyKind, opt, ctx);
|
|
1141
1444
|
}
|
|
1142
1445
|
|
|
1143
1446
|
|
|
@@ -1150,10 +1453,12 @@ ndt_any_kind(ndt_context_t *ctx)
|
|
|
1150
1453
|
* is assumed to be either a dtype with ndim==0 or a FixedDim.
|
|
1151
1454
|
*/
|
|
1152
1455
|
static inline int64_t
|
|
1153
|
-
fixed_step(ndt_t *type, int64_t step, bool *overflow)
|
|
1456
|
+
fixed_step(const ndt_t *type, int64_t step, bool *overflow)
|
|
1154
1457
|
{
|
|
1155
1458
|
assert(ndt_is_concrete(type));
|
|
1156
1459
|
assert(type->tag != VarDim);
|
|
1460
|
+
assert(type->tag != VarDimElem);
|
|
1461
|
+
assert(type->tag != Array);
|
|
1157
1462
|
|
|
1158
1463
|
if (step != INT64_MAX) {
|
|
1159
1464
|
return step;
|
|
@@ -1175,7 +1480,7 @@ fixed_step(ndt_t *type, int64_t step, bool *overflow)
|
|
|
1175
1480
|
}
|
|
1176
1481
|
|
|
1177
1482
|
static inline int64_t
|
|
1178
|
-
fixed_datasize(ndt_t *type, int64_t shape, int64_t step, int64_t itemsize,
|
|
1483
|
+
fixed_datasize(const ndt_t *type, int64_t shape, int64_t step, int64_t itemsize,
|
|
1179
1484
|
bool *overflow)
|
|
1180
1485
|
{
|
|
1181
1486
|
int64_t index_range;
|
|
@@ -1191,16 +1496,18 @@ fixed_datasize(ndt_t *type, int64_t shape, int64_t step, int64_t itemsize,
|
|
|
1191
1496
|
datasize = MULi64(index_range, itemsize, overflow);
|
|
1192
1497
|
return ADDi64(datasize, type->datasize, overflow);
|
|
1193
1498
|
}
|
|
1194
|
-
|
|
1195
|
-
static ndt_t *
|
|
1499
|
+
|
|
1500
|
+
static const ndt_t *
|
|
1196
1501
|
_ndt_to_fortran(const ndt_t *t, int64_t step, ndt_context_t *ctx)
|
|
1197
1502
|
{
|
|
1198
1503
|
bool overflow = 0;
|
|
1199
|
-
ndt_t *
|
|
1504
|
+
const ndt_t *u;
|
|
1505
|
+
const ndt_t *dt;
|
|
1200
1506
|
int64_t next_step;
|
|
1201
1507
|
|
|
1202
1508
|
if (t->ndim == 0) {
|
|
1203
|
-
|
|
1509
|
+
ndt_incref(t);
|
|
1510
|
+
return t;
|
|
1204
1511
|
}
|
|
1205
1512
|
|
|
1206
1513
|
next_step = MULi64(step, t->FixedDim.shape, &overflow);
|
|
@@ -1216,11 +1523,13 @@ _ndt_to_fortran(const ndt_t *t, int64_t step, ndt_context_t *ctx)
|
|
|
1216
1523
|
return NULL;
|
|
1217
1524
|
}
|
|
1218
1525
|
|
|
1219
|
-
|
|
1526
|
+
u = ndt_fixed_dim(dt, t->FixedDim.shape, step, ctx);
|
|
1527
|
+
ndt_decref(dt);
|
|
1528
|
+
return u;
|
|
1220
1529
|
}
|
|
1221
1530
|
|
|
1222
1531
|
/* Return a copy of a C-contiguous array in Fortran order. */
|
|
1223
|
-
ndt_t *
|
|
1532
|
+
const ndt_t *
|
|
1224
1533
|
ndt_to_fortran(const ndt_t *t, ndt_context_t *ctx)
|
|
1225
1534
|
{
|
|
1226
1535
|
if (ndt_is_abstract(t)) {
|
|
@@ -1238,14 +1547,13 @@ ndt_to_fortran(const ndt_t *t, ndt_context_t *ctx)
|
|
|
1238
1547
|
return _ndt_to_fortran(t, 1, ctx);
|
|
1239
1548
|
}
|
|
1240
1549
|
|
|
1241
|
-
ndt_t *
|
|
1242
|
-
ndt_fixed_dim(ndt_t *type, int64_t shape, int64_t step, ndt_context_t *ctx)
|
|
1550
|
+
const ndt_t *
|
|
1551
|
+
ndt_fixed_dim(const ndt_t *type, int64_t shape, int64_t step, ndt_context_t *ctx)
|
|
1243
1552
|
{
|
|
1244
1553
|
ndt_t *t;
|
|
1245
1554
|
bool overflow = 0;
|
|
1246
1555
|
|
|
1247
|
-
if (!
|
|
1248
|
-
ndt_del(type);
|
|
1556
|
+
if (!check_fixed_invariants(type, ctx)) {
|
|
1249
1557
|
return NULL;
|
|
1250
1558
|
}
|
|
1251
1559
|
|
|
@@ -1255,16 +1563,18 @@ ndt_fixed_dim(ndt_t *type, int64_t shape, int64_t step, ndt_context_t *ctx)
|
|
|
1255
1563
|
}
|
|
1256
1564
|
|
|
1257
1565
|
/* abstract type */
|
|
1258
|
-
t = ndt_new(FixedDim, ctx);
|
|
1566
|
+
t = ndt_new(FixedDim, 0, ctx);
|
|
1259
1567
|
if (t == NULL) {
|
|
1260
|
-
ndt_del(type);
|
|
1261
1568
|
return NULL;
|
|
1262
1569
|
}
|
|
1263
1570
|
t->FixedDim.tag = RequireNA;
|
|
1264
1571
|
t->FixedDim.shape = shape;
|
|
1572
|
+
|
|
1573
|
+
ndt_incref(type);
|
|
1265
1574
|
t->FixedDim.type = type;
|
|
1575
|
+
|
|
1266
1576
|
t->ndim = type->ndim + 1;
|
|
1267
|
-
t->flags
|
|
1577
|
+
t->flags |= ndt_dim_flags(type);
|
|
1268
1578
|
|
|
1269
1579
|
t->Concrete.FixedDim.itemsize = 0;
|
|
1270
1580
|
t->Concrete.FixedDim.step = INT64_MAX;
|
|
@@ -1283,18 +1593,18 @@ ndt_fixed_dim(ndt_t *type, int64_t shape, int64_t step, ndt_context_t *ctx)
|
|
|
1283
1593
|
|
|
1284
1594
|
if (overflow) {
|
|
1285
1595
|
ndt_err_format(ctx, NDT_ValueError, "data size too large");
|
|
1286
|
-
|
|
1596
|
+
ndt_decref(t);
|
|
1287
1597
|
return NULL;
|
|
1288
1598
|
}
|
|
1289
1599
|
|
|
1290
1600
|
return t;
|
|
1291
1601
|
}
|
|
1292
1602
|
|
|
1293
|
-
ndt_t *
|
|
1294
|
-
ndt_fixed_dim_tag(ndt_t *type, enum ndt_contig tag, int64_t shape, int64_t step,
|
|
1603
|
+
const ndt_t *
|
|
1604
|
+
ndt_fixed_dim_tag(const ndt_t *type, enum ndt_contig tag, int64_t shape, int64_t step,
|
|
1295
1605
|
ndt_context_t *ctx)
|
|
1296
1606
|
{
|
|
1297
|
-
ndt_t *t = ndt_fixed_dim(type, shape, step, ctx);
|
|
1607
|
+
ndt_t *t = (ndt_t *)ndt_fixed_dim(type, shape, step, ctx);
|
|
1298
1608
|
if (t == NULL) {
|
|
1299
1609
|
return NULL;
|
|
1300
1610
|
}
|
|
@@ -1307,31 +1617,29 @@ ndt_fixed_dim_tag(ndt_t *type, enum ndt_contig tag, int64_t shape, int64_t step,
|
|
|
1307
1617
|
return t;
|
|
1308
1618
|
}
|
|
1309
1619
|
|
|
1310
|
-
ndt_t *
|
|
1311
|
-
ndt_abstract_var_dim(ndt_t *type, ndt_context_t *ctx)
|
|
1620
|
+
const ndt_t *
|
|
1621
|
+
ndt_abstract_var_dim(const ndt_t *type, bool opt, ndt_context_t *ctx)
|
|
1312
1622
|
{
|
|
1313
1623
|
ndt_t *t = NULL;
|
|
1314
1624
|
|
|
1315
1625
|
if (!check_abstract_var_invariants(type, ctx)) {
|
|
1316
|
-
ndt_del(type);
|
|
1317
1626
|
return NULL;
|
|
1318
1627
|
}
|
|
1319
1628
|
|
|
1320
1629
|
/* abstract type */
|
|
1321
|
-
t = ndt_new(VarDim, ctx);
|
|
1630
|
+
t = ndt_new(VarDim, opt, ctx);
|
|
1322
1631
|
if (t == NULL) {
|
|
1323
|
-
ndt_del(type);
|
|
1324
1632
|
return NULL;
|
|
1325
1633
|
}
|
|
1634
|
+
ndt_incref(type);
|
|
1326
1635
|
t->VarDim.type = type;
|
|
1636
|
+
|
|
1327
1637
|
t->ndim = type->ndim+1;
|
|
1328
|
-
t->flags
|
|
1638
|
+
t->flags |= ndt_dim_flags(type);
|
|
1329
1639
|
|
|
1330
1640
|
/* concrete access */
|
|
1331
1641
|
t->access = Abstract;
|
|
1332
|
-
t->Concrete.VarDim.flag = ExternalOffsets;
|
|
1333
1642
|
t->Concrete.VarDim.itemsize = 0;
|
|
1334
|
-
t->Concrete.VarDim.noffsets = 0;
|
|
1335
1643
|
t->Concrete.VarDim.offsets = NULL;
|
|
1336
1644
|
t->Concrete.VarDim.nslices = 0;
|
|
1337
1645
|
t->Concrete.VarDim.slices = NULL;
|
|
@@ -1355,17 +1663,16 @@ ndt_var_indices(int64_t *res_start, int64_t *res_step, const ndt_t *t,
|
|
|
1355
1663
|
int32_t i;
|
|
1356
1664
|
|
|
1357
1665
|
assert(ndt_is_concrete(t));
|
|
1358
|
-
assert(t->tag == VarDim);
|
|
1666
|
+
assert(t->tag == VarDim || t->tag == VarDimElem);
|
|
1359
1667
|
|
|
1360
|
-
if (index < 0 || index+1 >= t->Concrete.VarDim.
|
|
1361
|
-
ndt_err_format(ctx,
|
|
1362
|
-
"
|
|
1363
|
-
index, t->Concrete.VarDim.noffsets);
|
|
1668
|
+
if (index < 0 || index+1 >= t->Concrete.VarDim.offsets->n) {
|
|
1669
|
+
ndt_err_format(ctx, NDT_IndexError,
|
|
1670
|
+
"index with value %" PRIi64 " out of bounds", index);
|
|
1364
1671
|
return -1;
|
|
1365
1672
|
}
|
|
1366
1673
|
|
|
1367
|
-
list_start = t->Concrete.VarDim.offsets[index];
|
|
1368
|
-
list_stop = t->Concrete.VarDim.offsets[index+1];
|
|
1674
|
+
list_start = t->Concrete.VarDim.offsets->v[index];
|
|
1675
|
+
list_stop = t->Concrete.VarDim.offsets->v[index+1];
|
|
1369
1676
|
list_shape = list_stop - list_start;
|
|
1370
1677
|
|
|
1371
1678
|
*res_start = 0;
|
|
@@ -1387,6 +1694,52 @@ ndt_var_indices(int64_t *res_start, int64_t *res_step, const ndt_t *t,
|
|
|
1387
1694
|
return res_shape;
|
|
1388
1695
|
}
|
|
1389
1696
|
|
|
1697
|
+
/* Same as ndt_var_indices(), but skips empty slices in the stack. */
|
|
1698
|
+
int64_t
|
|
1699
|
+
ndt_var_indices_non_empty(int64_t *res_start, int64_t *res_step, const ndt_t *t,
|
|
1700
|
+
int64_t index, ndt_context_t *ctx)
|
|
1701
|
+
{
|
|
1702
|
+
int64_t list_start, list_stop, list_shape;
|
|
1703
|
+
int64_t start, stop, step;
|
|
1704
|
+
int64_t shape, res_shape;
|
|
1705
|
+
const ndt_slice_t *slices;
|
|
1706
|
+
int32_t i;
|
|
1707
|
+
|
|
1708
|
+
assert(ndt_is_concrete(t));
|
|
1709
|
+
assert(t->tag == VarDim || t->tag == VarDimElem);
|
|
1710
|
+
|
|
1711
|
+
if (index < 0 || index+1 >= t->Concrete.VarDim.offsets->n) {
|
|
1712
|
+
ndt_err_format(ctx, NDT_IndexError,
|
|
1713
|
+
"index with value %" PRIi64 " out of bounds", index);
|
|
1714
|
+
return -1;
|
|
1715
|
+
}
|
|
1716
|
+
|
|
1717
|
+
list_start = t->Concrete.VarDim.offsets->v[index];
|
|
1718
|
+
list_stop = t->Concrete.VarDim.offsets->v[index+1];
|
|
1719
|
+
list_shape = list_stop - list_start;
|
|
1720
|
+
|
|
1721
|
+
*res_start = 0;
|
|
1722
|
+
*res_step = 1;
|
|
1723
|
+
res_shape = list_shape;
|
|
1724
|
+
slices = t->Concrete.VarDim.slices;
|
|
1725
|
+
|
|
1726
|
+
for (i = 0; i < t->Concrete.VarDim.nslices; i++) {
|
|
1727
|
+
start = slices[i].start;
|
|
1728
|
+
stop = slices[i].stop;
|
|
1729
|
+
step = slices[i].step;
|
|
1730
|
+
shape = ndt_slice_adjust_indices(res_shape, &start, &stop, step);
|
|
1731
|
+
if (shape > 0) {
|
|
1732
|
+
res_shape = shape;
|
|
1733
|
+
*res_start += (start * *res_step);
|
|
1734
|
+
*res_step *= step;
|
|
1735
|
+
}
|
|
1736
|
+
}
|
|
1737
|
+
|
|
1738
|
+
*res_start += list_start;
|
|
1739
|
+
|
|
1740
|
+
return res_shape;
|
|
1741
|
+
}
|
|
1742
|
+
|
|
1390
1743
|
ndt_slice_t *
|
|
1391
1744
|
ndt_var_add_slice(int32_t *nslices, const ndt_t *t,
|
|
1392
1745
|
int64_t start, int64_t stop, int64_t step,
|
|
@@ -1395,8 +1748,12 @@ ndt_var_add_slice(int32_t *nslices, const ndt_t *t,
|
|
|
1395
1748
|
int n = t->Concrete.VarDim.nslices;
|
|
1396
1749
|
ndt_slice_t *slices;
|
|
1397
1750
|
|
|
1398
|
-
|
|
1399
|
-
|
|
1751
|
+
if (t->tag != VarDim || ndt_is_abstract(t)) {
|
|
1752
|
+
ndt_err_format(ctx, NDT_RuntimeError,
|
|
1753
|
+
"ndt_var_add_slice: internal_error: argument must be a "
|
|
1754
|
+
"concrete var dim");
|
|
1755
|
+
return NULL;
|
|
1756
|
+
}
|
|
1400
1757
|
|
|
1401
1758
|
if (n == INT_MAX) {
|
|
1402
1759
|
ndt_err_format(ctx, NDT_RuntimeError, "slice stack overflow");
|
|
@@ -1418,12 +1775,11 @@ ndt_var_add_slice(int32_t *nslices, const ndt_t *t,
|
|
|
1418
1775
|
return slices;
|
|
1419
1776
|
}
|
|
1420
1777
|
|
|
1421
|
-
ndt_t *
|
|
1422
|
-
ndt_var_dim(ndt_t *type,
|
|
1423
|
-
|
|
1424
|
-
int32_t noffsets, const int32_t *offsets,
|
|
1778
|
+
const ndt_t *
|
|
1779
|
+
ndt_var_dim(const ndt_t *type,
|
|
1780
|
+
const ndt_offsets_t *offsets,
|
|
1425
1781
|
int32_t nslices, ndt_slice_t *slices,
|
|
1426
|
-
ndt_context_t *ctx)
|
|
1782
|
+
bool opt, ndt_context_t *ctx)
|
|
1427
1783
|
{
|
|
1428
1784
|
bool overflow = 0;
|
|
1429
1785
|
ndt_t *t;
|
|
@@ -1432,37 +1788,33 @@ ndt_var_dim(ndt_t *type,
|
|
|
1432
1788
|
assert(offsets != NULL);
|
|
1433
1789
|
assert(!!nslices == !!slices);
|
|
1434
1790
|
|
|
1435
|
-
if (!check_var_invariants(
|
|
1436
|
-
ndt_del(type);
|
|
1791
|
+
if (!check_var_invariants(type, ctx)) {
|
|
1437
1792
|
goto error;
|
|
1438
1793
|
}
|
|
1439
1794
|
|
|
1440
|
-
if (
|
|
1795
|
+
if (offsets->n < 2) {
|
|
1441
1796
|
ndt_err_format(ctx, NDT_InvalidArgumentError, "var_dim: noffsets < 2");
|
|
1442
|
-
ndt_del(type);
|
|
1443
1797
|
goto error;
|
|
1444
1798
|
}
|
|
1445
1799
|
|
|
1446
1800
|
if (!ndt_is_concrete(type)) {
|
|
1447
1801
|
ndt_err_format(ctx, NDT_InvalidArgumentError,
|
|
1448
1802
|
"var_dim: expected concrete type");
|
|
1449
|
-
ndt_del(type);
|
|
1450
1803
|
goto error;
|
|
1451
1804
|
}
|
|
1452
1805
|
|
|
1453
1806
|
switch (type->tag) {
|
|
1454
|
-
case VarDim:
|
|
1455
|
-
if (offsets[
|
|
1807
|
+
case VarDim: case VarDimElem:
|
|
1808
|
+
if (offsets->v[offsets->n-1] != type->Concrete.VarDim.offsets->n-1) {
|
|
1456
1809
|
ndt_err_format(ctx, NDT_ValueError,
|
|
1457
1810
|
"var_dim: missing or invalid number of offset arguments");
|
|
1458
|
-
ndt_del(type);
|
|
1459
1811
|
goto error;
|
|
1460
1812
|
}
|
|
1461
1813
|
datasize = type->datasize;
|
|
1462
1814
|
itemsize = type->Concrete.VarDim.itemsize;
|
|
1463
1815
|
break;
|
|
1464
1816
|
default:
|
|
1465
|
-
datasize = MULi64(offsets[
|
|
1817
|
+
datasize = MULi64(offsets->v[offsets->n-1], type->datasize, &overflow);
|
|
1466
1818
|
itemsize = type->datasize;
|
|
1467
1819
|
break;
|
|
1468
1820
|
}
|
|
@@ -1470,27 +1822,26 @@ ndt_var_dim(ndt_t *type,
|
|
|
1470
1822
|
if (overflow) {
|
|
1471
1823
|
ndt_err_format(ctx, NDT_ValueError,
|
|
1472
1824
|
"overflow in creating var dimension");
|
|
1473
|
-
ndt_del(type);
|
|
1474
1825
|
goto error;
|
|
1475
1826
|
}
|
|
1476
1827
|
|
|
1477
1828
|
/* abstract type */
|
|
1478
|
-
t = ndt_new(VarDim, ctx);
|
|
1829
|
+
t = ndt_new(VarDim, opt, ctx);
|
|
1479
1830
|
if (t == NULL) {
|
|
1480
|
-
ndt_del(type);
|
|
1481
1831
|
goto error;
|
|
1482
1832
|
}
|
|
1833
|
+
ndt_incref(type);
|
|
1834
|
+
ndt_incref_offsets(offsets);
|
|
1835
|
+
|
|
1483
1836
|
t->VarDim.type = type;
|
|
1484
1837
|
t->ndim = type->ndim+1;
|
|
1485
|
-
t->flags
|
|
1838
|
+
t->flags |= ndt_dim_flags(type);
|
|
1486
1839
|
|
|
1487
1840
|
/* concrete access */
|
|
1488
1841
|
t->access = Concrete;
|
|
1489
1842
|
t->datasize = datasize;
|
|
1490
1843
|
t->align = type->align;
|
|
1491
|
-
t->Concrete.VarDim.flag = flag;
|
|
1492
1844
|
t->Concrete.VarDim.itemsize = itemsize;
|
|
1493
|
-
t->Concrete.VarDim.noffsets = noffsets;
|
|
1494
1845
|
t->Concrete.VarDim.offsets = offsets;
|
|
1495
1846
|
t->Concrete.VarDim.nslices = nslices;
|
|
1496
1847
|
t->Concrete.VarDim.slices = slices;
|
|
@@ -1499,44 +1850,42 @@ ndt_var_dim(ndt_t *type,
|
|
|
1499
1850
|
|
|
1500
1851
|
|
|
1501
1852
|
error:
|
|
1502
|
-
if (flag == InternalOffsets) {
|
|
1503
|
-
ndt_free((int32_t *)offsets);
|
|
1504
|
-
}
|
|
1505
1853
|
ndt_free(slices);
|
|
1506
1854
|
return NULL;
|
|
1507
1855
|
}
|
|
1508
1856
|
|
|
1509
|
-
ndt_t *
|
|
1510
|
-
ndt_symbolic_dim(char *name, ndt_t *type, ndt_context_t *ctx)
|
|
1857
|
+
const ndt_t *
|
|
1858
|
+
ndt_symbolic_dim(char *name, const ndt_t *type, ndt_context_t *ctx)
|
|
1511
1859
|
{
|
|
1512
1860
|
ndt_t *t;
|
|
1513
1861
|
|
|
1514
|
-
if (!
|
|
1862
|
+
if (!check_fixed_invariants(type, ctx)) {
|
|
1515
1863
|
ndt_free(name);
|
|
1516
|
-
ndt_del(type);
|
|
1517
1864
|
return NULL;
|
|
1518
1865
|
}
|
|
1519
1866
|
|
|
1520
1867
|
/* abstract type */
|
|
1521
|
-
t = ndt_new(SymbolicDim, ctx);
|
|
1868
|
+
t = ndt_new(SymbolicDim, 0, ctx);
|
|
1522
1869
|
if (t == NULL) {
|
|
1523
1870
|
ndt_free(name);
|
|
1524
|
-
ndt_del(type);
|
|
1525
1871
|
return NULL;
|
|
1526
1872
|
}
|
|
1527
1873
|
t->SymbolicDim.tag = RequireNA;
|
|
1528
1874
|
t->SymbolicDim.name = name;
|
|
1875
|
+
|
|
1876
|
+
ndt_incref(type);
|
|
1529
1877
|
t->SymbolicDim.type = type;
|
|
1878
|
+
|
|
1530
1879
|
t->ndim = type->ndim + 1;
|
|
1531
|
-
t->flags
|
|
1880
|
+
t->flags |= ndt_dim_flags(type);
|
|
1532
1881
|
|
|
1533
1882
|
return t;
|
|
1534
1883
|
}
|
|
1535
1884
|
|
|
1536
|
-
ndt_t *
|
|
1537
|
-
ndt_symbolic_dim_tag(char *name, ndt_t *type, enum ndt_contig tag, ndt_context_t *ctx)
|
|
1885
|
+
const ndt_t *
|
|
1886
|
+
ndt_symbolic_dim_tag(char *name, const ndt_t *type, enum ndt_contig tag, ndt_context_t *ctx)
|
|
1538
1887
|
{
|
|
1539
|
-
ndt_t *t = ndt_symbolic_dim(name, type, ctx);
|
|
1888
|
+
ndt_t *t = (ndt_t *)ndt_symbolic_dim(name, type, ctx);
|
|
1540
1889
|
if (t == NULL) {
|
|
1541
1890
|
return NULL;
|
|
1542
1891
|
}
|
|
@@ -1545,15 +1894,14 @@ ndt_symbolic_dim_tag(char *name, ndt_t *type, enum ndt_contig tag, ndt_context_t
|
|
|
1545
1894
|
return t;
|
|
1546
1895
|
}
|
|
1547
1896
|
|
|
1548
|
-
ndt_t *
|
|
1549
|
-
ndt_ellipsis_dim(char *name, ndt_t *type, ndt_context_t *ctx)
|
|
1897
|
+
const ndt_t *
|
|
1898
|
+
ndt_ellipsis_dim(char *name, const ndt_t *type, ndt_context_t *ctx)
|
|
1550
1899
|
{
|
|
1551
1900
|
ndt_t *t;
|
|
1552
1901
|
uint32_t flags;
|
|
1553
1902
|
|
|
1554
1903
|
if (!check_ellipsis_invariants(type, ctx)) {
|
|
1555
1904
|
ndt_free(name);
|
|
1556
|
-
ndt_del(type);
|
|
1557
1905
|
return NULL;
|
|
1558
1906
|
}
|
|
1559
1907
|
|
|
@@ -1561,30 +1909,31 @@ ndt_ellipsis_dim(char *name, ndt_t *type, ndt_context_t *ctx)
|
|
|
1561
1909
|
if (flags & NDT_ELLIPSIS) {
|
|
1562
1910
|
ndt_err_format(ctx, NDT_ValueError, "more than one ellipsis");
|
|
1563
1911
|
ndt_free(name);
|
|
1564
|
-
ndt_del(type);
|
|
1565
1912
|
return NULL;
|
|
1566
1913
|
}
|
|
1567
1914
|
|
|
1568
1915
|
/* abstract type */
|
|
1569
|
-
t = ndt_new(EllipsisDim, ctx);
|
|
1916
|
+
t = ndt_new(EllipsisDim, 0, ctx);
|
|
1570
1917
|
if (t == NULL) {
|
|
1571
1918
|
ndt_free(name);
|
|
1572
|
-
ndt_del(type);
|
|
1573
1919
|
return NULL;
|
|
1574
1920
|
}
|
|
1575
1921
|
t->EllipsisDim.tag = RequireNA;
|
|
1576
1922
|
t->EllipsisDim.name = name;
|
|
1923
|
+
|
|
1924
|
+
ndt_incref(type);
|
|
1577
1925
|
t->EllipsisDim.type = type;
|
|
1578
|
-
|
|
1926
|
+
|
|
1927
|
+
t->flags |= (flags|NDT_ELLIPSIS);
|
|
1579
1928
|
t->ndim = type->ndim + 1;
|
|
1580
1929
|
|
|
1581
1930
|
return t;
|
|
1582
1931
|
}
|
|
1583
1932
|
|
|
1584
|
-
ndt_t *
|
|
1585
|
-
ndt_ellipsis_dim_tag(char *name, ndt_t *type, enum ndt_contig tag, ndt_context_t *ctx)
|
|
1933
|
+
const ndt_t *
|
|
1934
|
+
ndt_ellipsis_dim_tag(char *name, const ndt_t *type, enum ndt_contig tag, ndt_context_t *ctx)
|
|
1586
1935
|
{
|
|
1587
|
-
ndt_t *t = ndt_ellipsis_dim(name, type, ctx);
|
|
1936
|
+
ndt_t *t = (ndt_t *)ndt_ellipsis_dim(name, type, ctx);
|
|
1588
1937
|
if (t == NULL) {
|
|
1589
1938
|
return NULL;
|
|
1590
1939
|
}
|
|
@@ -1686,9 +2035,44 @@ init_concrete_fields(ndt_t *t, int64_t *offsets, uint16_t *align, uint16_t *pad,
|
|
|
1686
2035
|
return 0;
|
|
1687
2036
|
}
|
|
1688
2037
|
|
|
1689
|
-
|
|
1690
|
-
|
|
1691
|
-
|
|
2038
|
+
/*
|
|
2039
|
+
* Initialize the access information of a concrete union.
|
|
2040
|
+
* Assumptions:
|
|
2041
|
+
* 1) t->tag == Union
|
|
2042
|
+
* 2) t->access == Concrete
|
|
2043
|
+
* 3) 0 <= i < ntags ==> fields[i].access == Concrete
|
|
2044
|
+
* 4) len(fields) == ntags
|
|
2045
|
+
*/
|
|
2046
|
+
static int
|
|
2047
|
+
init_concrete_tags(ndt_t *t, const ndt_field_t *fields, int64_t ntags,
|
|
2048
|
+
ndt_context_t *ctx)
|
|
2049
|
+
{
|
|
2050
|
+
int64_t maxsize = 0;
|
|
2051
|
+
int64_t i;
|
|
2052
|
+
|
|
2053
|
+
for (i = 0; i < ntags; i++) {
|
|
2054
|
+
assert(fields[i].access == Concrete);
|
|
2055
|
+
assert(fields[i].type->access == Concrete);
|
|
2056
|
+
|
|
2057
|
+
if (fields[i].type->flags & NDT_REF) {
|
|
2058
|
+
ndt_err_format(ctx, NDT_ValueError,
|
|
2059
|
+
"union types cannot contain references");
|
|
2060
|
+
return -1;
|
|
2061
|
+
}
|
|
2062
|
+
|
|
2063
|
+
maxsize = max_i64(fields[i].type->datasize, maxsize);
|
|
2064
|
+
}
|
|
2065
|
+
|
|
2066
|
+
assert(t->access == Concrete);
|
|
2067
|
+
t->align = 1;
|
|
2068
|
+
t->datasize = 1+maxsize;
|
|
2069
|
+
|
|
2070
|
+
return 0;
|
|
2071
|
+
}
|
|
2072
|
+
|
|
2073
|
+
const ndt_t *
|
|
2074
|
+
ndt_tuple(enum ndt_variadic flag, const ndt_field_t *fields, int64_t shape,
|
|
2075
|
+
uint16_opt_t align, uint16_opt_t pack, bool opt, ndt_context_t *ctx)
|
|
1692
2076
|
{
|
|
1693
2077
|
ndt_t *t;
|
|
1694
2078
|
int64_t i;
|
|
@@ -1697,15 +2081,13 @@ ndt_tuple(enum ndt_variadic flag, ndt_field_t *fields, int64_t shape,
|
|
|
1697
2081
|
|
|
1698
2082
|
for (i = 0; i < shape; i++) {
|
|
1699
2083
|
if (!check_type_invariants(fields[i].type, ctx)) {
|
|
1700
|
-
ndt_field_array_del(fields, shape);
|
|
1701
2084
|
return NULL;
|
|
1702
2085
|
}
|
|
1703
2086
|
}
|
|
1704
2087
|
|
|
1705
2088
|
/* abstract type */
|
|
1706
|
-
t = ndt_tuple_new(flag, shape, ctx);
|
|
2089
|
+
t = ndt_tuple_new(flag, shape, opt, ctx);
|
|
1707
2090
|
if (t == NULL) {
|
|
1708
|
-
ndt_field_array_del(fields, shape);
|
|
1709
2091
|
return NULL;
|
|
1710
2092
|
}
|
|
1711
2093
|
|
|
@@ -1724,17 +2106,16 @@ ndt_tuple(enum ndt_variadic flag, ndt_field_t *fields, int64_t shape,
|
|
|
1724
2106
|
fields[i].Concrete.explicit_align) {
|
|
1725
2107
|
ndt_err_format(ctx, NDT_InvalidArgumentError,
|
|
1726
2108
|
"explicit field alignment in abstract tuple");
|
|
1727
|
-
ndt_field_array_del(fields, shape);
|
|
1728
2109
|
ndt_free(t);
|
|
1729
2110
|
return NULL;
|
|
1730
2111
|
}
|
|
1731
2112
|
}
|
|
1732
2113
|
for (i = 0; i < shape; i++) {
|
|
1733
2114
|
assert(fields[i].name == NULL);
|
|
2115
|
+
ndt_incref(fields[i].type);
|
|
1734
2116
|
t->Tuple.types[i] = fields[i].type;
|
|
1735
2117
|
t->flags |= ndt_subtree_flags(fields[i].type);
|
|
1736
2118
|
}
|
|
1737
|
-
ndt_free(fields);
|
|
1738
2119
|
return t;
|
|
1739
2120
|
}
|
|
1740
2121
|
else {
|
|
@@ -1743,23 +2124,22 @@ ndt_tuple(enum ndt_variadic flag, ndt_field_t *fields, int64_t shape,
|
|
|
1743
2124
|
t->Concrete.Tuple.align,
|
|
1744
2125
|
t->Concrete.Tuple.pad,
|
|
1745
2126
|
fields, shape, align, pack, ctx) < 0) {
|
|
1746
|
-
ndt_field_array_del(fields, shape);
|
|
1747
2127
|
ndt_free(t);
|
|
1748
2128
|
return NULL;
|
|
1749
2129
|
}
|
|
1750
2130
|
for (i = 0; i < shape; i++) {
|
|
1751
2131
|
assert(fields[i].name == NULL);
|
|
2132
|
+
ndt_incref(fields[i].type);
|
|
1752
2133
|
t->Tuple.types[i] = fields[i].type;
|
|
1753
2134
|
t->flags |= ndt_subtree_flags(fields[i].type);
|
|
1754
2135
|
}
|
|
1755
|
-
ndt_free(fields);
|
|
1756
2136
|
return t;
|
|
1757
2137
|
}
|
|
1758
2138
|
}
|
|
1759
2139
|
|
|
1760
|
-
ndt_t *
|
|
1761
|
-
ndt_record(enum ndt_variadic flag, ndt_field_t *fields, int64_t shape,
|
|
1762
|
-
uint16_opt_t align, uint16_opt_t pack, ndt_context_t *ctx)
|
|
2140
|
+
const ndt_t *
|
|
2141
|
+
ndt_record(enum ndt_variadic flag, const ndt_field_t *fields, int64_t shape,
|
|
2142
|
+
uint16_opt_t align, uint16_opt_t pack, bool opt, ndt_context_t *ctx)
|
|
1763
2143
|
{
|
|
1764
2144
|
ndt_t *t;
|
|
1765
2145
|
int64_t i;
|
|
@@ -1768,15 +2148,13 @@ ndt_record(enum ndt_variadic flag, ndt_field_t *fields, int64_t shape,
|
|
|
1768
2148
|
|
|
1769
2149
|
for (i = 0; i < shape; i++) {
|
|
1770
2150
|
if (!check_type_invariants(fields[i].type, ctx)) {
|
|
1771
|
-
ndt_field_array_del(fields, shape);
|
|
1772
2151
|
return NULL;
|
|
1773
2152
|
}
|
|
1774
2153
|
}
|
|
1775
2154
|
|
|
1776
2155
|
/* abstract type */
|
|
1777
|
-
t = ndt_record_new(flag, shape, ctx);
|
|
2156
|
+
t = ndt_record_new(flag, shape, opt, ctx);
|
|
1778
2157
|
if (t == NULL) {
|
|
1779
|
-
ndt_field_array_del(fields, shape);
|
|
1780
2158
|
return NULL;
|
|
1781
2159
|
}
|
|
1782
2160
|
|
|
@@ -1795,18 +2173,23 @@ ndt_record(enum ndt_variadic flag, ndt_field_t *fields, int64_t shape,
|
|
|
1795
2173
|
fields[i].Concrete.explicit_align) {
|
|
1796
2174
|
ndt_err_format(ctx, NDT_InvalidArgumentError,
|
|
1797
2175
|
"explicit field alignment in abstract tuple");
|
|
1798
|
-
/* at this point names and types still belong to the fields */
|
|
1799
|
-
ndt_field_array_del(fields, shape);
|
|
1800
2176
|
ndt_free(t);
|
|
1801
2177
|
return NULL;
|
|
1802
2178
|
}
|
|
1803
2179
|
}
|
|
1804
2180
|
for (i = 0; i < shape; i++) {
|
|
1805
|
-
|
|
2181
|
+
char *s = ndt_strdup(fields[i].name, ctx);
|
|
2182
|
+
if (s == NULL) {
|
|
2183
|
+
ndt_decref(t);
|
|
2184
|
+
return NULL;
|
|
2185
|
+
}
|
|
2186
|
+
t->Record.names[i] = s;
|
|
2187
|
+
|
|
2188
|
+
ndt_incref(fields[i].type);
|
|
1806
2189
|
t->Record.types[i] = fields[i].type;
|
|
2190
|
+
|
|
1807
2191
|
t->flags |= ndt_subtree_flags(fields[i].type);
|
|
1808
2192
|
}
|
|
1809
|
-
ndt_free(fields);
|
|
1810
2193
|
return t;
|
|
1811
2194
|
}
|
|
1812
2195
|
else {
|
|
@@ -1815,39 +2198,159 @@ ndt_record(enum ndt_variadic flag, ndt_field_t *fields, int64_t shape,
|
|
|
1815
2198
|
t->Concrete.Record.align,
|
|
1816
2199
|
t->Concrete.Record.pad,
|
|
1817
2200
|
fields, shape, align, pack, ctx) < 0) {
|
|
1818
|
-
/* at this point names and types still belong to the fields */
|
|
1819
|
-
ndt_field_array_del(fields, shape);
|
|
1820
2201
|
ndt_free(t);
|
|
1821
2202
|
return NULL;
|
|
1822
2203
|
}
|
|
1823
2204
|
for (i = 0; i < shape; i++) {
|
|
1824
|
-
|
|
2205
|
+
char *s = ndt_strdup(fields[i].name, ctx);
|
|
2206
|
+
if (s == NULL) {
|
|
2207
|
+
ndt_decref(t);
|
|
2208
|
+
return NULL;
|
|
2209
|
+
}
|
|
2210
|
+
t->Record.names[i] = s;
|
|
2211
|
+
|
|
2212
|
+
ndt_incref(fields[i].type);
|
|
1825
2213
|
t->Record.types[i] = fields[i].type;
|
|
2214
|
+
|
|
1826
2215
|
t->flags |= ndt_subtree_flags(fields[i].type);
|
|
1827
2216
|
}
|
|
1828
|
-
ndt_free(fields);
|
|
1829
2217
|
return t;
|
|
1830
2218
|
}
|
|
1831
2219
|
}
|
|
1832
2220
|
|
|
1833
|
-
ndt_t *
|
|
1834
|
-
|
|
2221
|
+
const ndt_t *
|
|
2222
|
+
ndt_union(const ndt_field_t *fields, int64_t ntags, bool opt,
|
|
2223
|
+
ndt_context_t *ctx)
|
|
2224
|
+
{
|
|
2225
|
+
ndt_t *t;
|
|
2226
|
+
int64_t i;
|
|
2227
|
+
|
|
2228
|
+
if (ntags == 0 || fields == NULL) {
|
|
2229
|
+
ndt_err_format(ctx, NDT_ValueError, "unions cannot be empty");
|
|
2230
|
+
return NULL;
|
|
2231
|
+
}
|
|
2232
|
+
|
|
2233
|
+
if (ntags > 255) {
|
|
2234
|
+
ndt_err_format(ctx, NDT_ValueError, "union too large (max 255 members)");
|
|
2235
|
+
return NULL;
|
|
2236
|
+
}
|
|
2237
|
+
|
|
2238
|
+
for (i = 0; i < ntags; i++) {
|
|
2239
|
+
if (!check_type_invariants(fields[i].type, ctx)) {
|
|
2240
|
+
return NULL;
|
|
2241
|
+
}
|
|
2242
|
+
}
|
|
2243
|
+
|
|
2244
|
+
/* abstract type */
|
|
2245
|
+
t = ndt_union_new(ntags, opt, ctx);
|
|
2246
|
+
if (t == NULL) {
|
|
2247
|
+
return NULL;
|
|
2248
|
+
}
|
|
2249
|
+
|
|
2250
|
+
/* check concrete access */
|
|
2251
|
+
t->access = Concrete;
|
|
2252
|
+
for (i = 0; i < ntags; i++) {
|
|
2253
|
+
if (fields[i].access == Abstract) {
|
|
2254
|
+
t->access = Abstract;
|
|
2255
|
+
}
|
|
2256
|
+
}
|
|
2257
|
+
|
|
2258
|
+
if (t->access == Abstract) {
|
|
2259
|
+
/* check if any field has explicit 'align' or 'pack' attributes */
|
|
2260
|
+
for (i = 0; i < ntags; i++) {
|
|
2261
|
+
if (fields[i].access == Concrete &&
|
|
2262
|
+
fields[i].Concrete.explicit_align) {
|
|
2263
|
+
ndt_err_format(ctx, NDT_InvalidArgumentError,
|
|
2264
|
+
"explicit field alignment in abstract tuple");
|
|
2265
|
+
ndt_free(t);
|
|
2266
|
+
return NULL;
|
|
2267
|
+
}
|
|
2268
|
+
}
|
|
2269
|
+
for (i = 0; i < ntags; i++) {
|
|
2270
|
+
char *s = ndt_strdup(fields[i].name, ctx);
|
|
2271
|
+
if (s == NULL) {
|
|
2272
|
+
ndt_decref(t);
|
|
2273
|
+
return NULL;
|
|
2274
|
+
}
|
|
2275
|
+
t->Union.tags[i] = s;
|
|
2276
|
+
|
|
2277
|
+
ndt_incref(fields[i].type);
|
|
2278
|
+
t->Union.types[i] = fields[i].type;
|
|
2279
|
+
|
|
2280
|
+
t->flags |= ndt_subtree_flags(fields[i].type);
|
|
2281
|
+
}
|
|
2282
|
+
return t;
|
|
2283
|
+
}
|
|
2284
|
+
else {
|
|
2285
|
+
if (init_concrete_tags(t, fields, ntags, ctx) < 0) {
|
|
2286
|
+
ndt_free(t);
|
|
2287
|
+
return NULL;
|
|
2288
|
+
}
|
|
2289
|
+
|
|
2290
|
+
for (i = 0; i < ntags; i++) {
|
|
2291
|
+
char *s = ndt_strdup(fields[i].name, ctx);
|
|
2292
|
+
if (s == NULL) {
|
|
2293
|
+
ndt_decref(t);
|
|
2294
|
+
return NULL;
|
|
2295
|
+
}
|
|
2296
|
+
t->Union.tags[i] = s;
|
|
2297
|
+
|
|
2298
|
+
ndt_incref(fields[i].type);
|
|
2299
|
+
t->Union.types[i] = fields[i].type;
|
|
2300
|
+
|
|
2301
|
+
t->flags |= ndt_subtree_flags(fields[i].type);
|
|
2302
|
+
}
|
|
2303
|
+
return t;
|
|
2304
|
+
}
|
|
2305
|
+
}
|
|
2306
|
+
|
|
2307
|
+
const ndt_t *
|
|
2308
|
+
ndt_array(const ndt_t *type, bool opt, ndt_context_t *ctx)
|
|
2309
|
+
{
|
|
2310
|
+
ndt_t *t;
|
|
2311
|
+
|
|
2312
|
+
if (!check_array_invariants(type, ctx)) {
|
|
2313
|
+
return NULL;
|
|
2314
|
+
}
|
|
2315
|
+
|
|
2316
|
+
/* abstract type */
|
|
2317
|
+
t = ndt_new(Array, opt|NDT_POINTER, ctx);
|
|
2318
|
+
if (t == NULL) {
|
|
2319
|
+
return NULL;
|
|
2320
|
+
}
|
|
2321
|
+
ndt_incref(type);
|
|
2322
|
+
t->Array.itemsize = type->datasize;
|
|
2323
|
+
t->Array.type = type;
|
|
2324
|
+
|
|
2325
|
+
t->flags |= ndt_subtree_flags(type);
|
|
2326
|
+
t->ndim = type->ndim + 1;
|
|
2327
|
+
|
|
2328
|
+
/* concrete access */
|
|
2329
|
+
t->access = type->access;
|
|
2330
|
+
t->datasize = sizeof(ndt_array_t);
|
|
2331
|
+
t->align = alignof(ndt_array_t);
|
|
2332
|
+
|
|
2333
|
+
return t;
|
|
2334
|
+
}
|
|
2335
|
+
|
|
2336
|
+
const ndt_t *
|
|
2337
|
+
ndt_ref(const ndt_t *type, bool opt, ndt_context_t *ctx)
|
|
1835
2338
|
{
|
|
1836
2339
|
ndt_t *t;
|
|
1837
2340
|
|
|
1838
2341
|
if (!check_type_invariants(type, ctx)) {
|
|
1839
|
-
ndt_del(type);
|
|
1840
2342
|
return NULL;
|
|
1841
2343
|
}
|
|
1842
2344
|
|
|
1843
2345
|
/* abstract type */
|
|
1844
|
-
t = ndt_new(Ref, ctx);
|
|
2346
|
+
t = ndt_new(Ref, opt|NDT_POINTER|NDT_REF, ctx);
|
|
1845
2347
|
if (t == NULL) {
|
|
1846
|
-
ndt_del(type);
|
|
1847
2348
|
return NULL;
|
|
1848
2349
|
}
|
|
2350
|
+
ndt_incref(type);
|
|
1849
2351
|
t->Ref.type = type;
|
|
1850
|
-
|
|
2352
|
+
|
|
2353
|
+
t->flags |= ndt_subtree_flags(type);
|
|
1851
2354
|
|
|
1852
2355
|
/* concrete access */
|
|
1853
2356
|
t->access = type->access;
|
|
@@ -1857,28 +2360,29 @@ ndt_ref(ndt_t *type, ndt_context_t *ctx)
|
|
|
1857
2360
|
return t;
|
|
1858
2361
|
}
|
|
1859
2362
|
|
|
1860
|
-
ndt_t *
|
|
1861
|
-
ndt_constr(char *name, ndt_t *type, ndt_context_t *ctx)
|
|
2363
|
+
const ndt_t *
|
|
2364
|
+
ndt_constr(char *name, const ndt_t *type, bool opt, ndt_context_t *ctx)
|
|
1862
2365
|
{
|
|
1863
2366
|
ndt_t *t;
|
|
1864
2367
|
|
|
1865
2368
|
if (!check_type_invariants(type, ctx)) {
|
|
1866
2369
|
ndt_free(name);
|
|
1867
|
-
ndt_del(type);
|
|
1868
2370
|
return NULL;
|
|
1869
2371
|
}
|
|
1870
2372
|
|
|
1871
|
-
t = ndt_new(Constr, ctx);
|
|
2373
|
+
t = ndt_new(Constr, opt, ctx);
|
|
1872
2374
|
if (t == NULL) {
|
|
1873
2375
|
ndt_free(name);
|
|
1874
|
-
ndt_del(type);
|
|
1875
2376
|
return NULL;
|
|
1876
2377
|
}
|
|
1877
2378
|
|
|
1878
2379
|
/* abstract type */
|
|
1879
2380
|
t->Constr.name = name;
|
|
2381
|
+
|
|
2382
|
+
ndt_incref(type);
|
|
1880
2383
|
t->Constr.type = type;
|
|
1881
|
-
|
|
2384
|
+
|
|
2385
|
+
t->flags |= ndt_subtree_flags(type);
|
|
1882
2386
|
|
|
1883
2387
|
/* concrete access */
|
|
1884
2388
|
t->access = type->access;
|
|
@@ -1890,8 +2394,8 @@ ndt_constr(char *name, ndt_t *type, ndt_context_t *ctx)
|
|
|
1890
2394
|
return t;
|
|
1891
2395
|
}
|
|
1892
2396
|
|
|
1893
|
-
ndt_t *
|
|
1894
|
-
ndt_nominal(char *name, ndt_t *type, ndt_context_t *ctx)
|
|
2397
|
+
const ndt_t *
|
|
2398
|
+
ndt_nominal(char *name, const ndt_t *type, bool opt, ndt_context_t *ctx)
|
|
1895
2399
|
{
|
|
1896
2400
|
const ndt_typedef_t *d;
|
|
1897
2401
|
ndt_t *t;
|
|
@@ -1899,7 +2403,6 @@ ndt_nominal(char *name, ndt_t *type, ndt_context_t *ctx)
|
|
|
1899
2403
|
d = ndt_typedef_find(name, ctx);
|
|
1900
2404
|
if (d == NULL) {
|
|
1901
2405
|
ndt_free(name);
|
|
1902
|
-
ndt_del(type);
|
|
1903
2406
|
return NULL;
|
|
1904
2407
|
}
|
|
1905
2408
|
|
|
@@ -1911,29 +2414,25 @@ ndt_nominal(char *name, ndt_t *type, ndt_context_t *ctx)
|
|
|
1911
2414
|
"type is not an instance of %s", name);
|
|
1912
2415
|
}
|
|
1913
2416
|
ndt_free(name);
|
|
1914
|
-
ndt_del(type);
|
|
1915
2417
|
return NULL;
|
|
1916
2418
|
}
|
|
1917
2419
|
}
|
|
1918
2420
|
else {
|
|
1919
|
-
type =
|
|
1920
|
-
if (type == NULL) {
|
|
1921
|
-
ndt_free(name);
|
|
1922
|
-
return NULL;
|
|
1923
|
-
}
|
|
2421
|
+
type = d->type;
|
|
1924
2422
|
}
|
|
2423
|
+
ndt_incref(type);
|
|
1925
2424
|
|
|
1926
2425
|
/* abstract type */
|
|
1927
|
-
t = ndt_new(Nominal, ctx);
|
|
2426
|
+
t = ndt_new(Nominal, opt, ctx);
|
|
1928
2427
|
if (t == NULL) {
|
|
1929
2428
|
ndt_free(name);
|
|
1930
|
-
|
|
2429
|
+
ndt_decref(type);
|
|
1931
2430
|
return NULL;
|
|
1932
2431
|
}
|
|
1933
2432
|
t->Nominal.name = name;
|
|
1934
2433
|
t->Nominal.type = type;
|
|
1935
2434
|
t->Nominal.meth = &d->meth;
|
|
1936
|
-
t->flags
|
|
2435
|
+
t->flags |= ndt_subtree_flags(type);
|
|
1937
2436
|
|
|
1938
2437
|
/* concrete access */
|
|
1939
2438
|
t->access = type->access;
|
|
@@ -1948,10 +2447,10 @@ ndt_nominal(char *name, ndt_t *type, ndt_context_t *ctx)
|
|
|
1948
2447
|
/* Scalar types */
|
|
1949
2448
|
/******************************************************************************/
|
|
1950
2449
|
|
|
1951
|
-
ndt_t *
|
|
1952
|
-
ndt_scalar_kind(ndt_context_t *ctx)
|
|
2450
|
+
const ndt_t *
|
|
2451
|
+
ndt_scalar_kind(bool opt, ndt_context_t *ctx)
|
|
1953
2452
|
{
|
|
1954
|
-
return ndt_new(ScalarKind, ctx);
|
|
2453
|
+
return ndt_new(ScalarKind, opt, ctx);
|
|
1955
2454
|
}
|
|
1956
2455
|
|
|
1957
2456
|
/* Define a sort order for the typed values in the categorical set. */
|
|
@@ -1964,8 +2463,8 @@ cmp(const void *x, const void *y)
|
|
|
1964
2463
|
return ndt_value_compare(p, q);
|
|
1965
2464
|
}
|
|
1966
2465
|
|
|
1967
|
-
ndt_t *
|
|
1968
|
-
ndt_categorical(ndt_value_t *types, int64_t ntypes, ndt_context_t *ctx)
|
|
2466
|
+
const ndt_t *
|
|
2467
|
+
ndt_categorical(const ndt_value_t *types, int64_t ntypes, bool opt, ndt_context_t *ctx)
|
|
1969
2468
|
{
|
|
1970
2469
|
ndt_value_t *tmp;
|
|
1971
2470
|
ndt_t *t;
|
|
@@ -1993,7 +2492,7 @@ ndt_categorical(ndt_value_t *types, int64_t ntypes, ndt_context_t *ctx)
|
|
|
1993
2492
|
ndt_free(tmp);
|
|
1994
2493
|
|
|
1995
2494
|
/* abstract type */
|
|
1996
|
-
t = ndt_new(Categorical, ctx);
|
|
2495
|
+
t = ndt_new(Categorical, opt, ctx);
|
|
1997
2496
|
if (t == NULL) {
|
|
1998
2497
|
ndt_value_array_del(types, ntypes);
|
|
1999
2498
|
return NULL;
|
|
@@ -2009,20 +2508,20 @@ ndt_categorical(ndt_value_t *types, int64_t ntypes, ndt_context_t *ctx)
|
|
|
2009
2508
|
return t;
|
|
2010
2509
|
}
|
|
2011
2510
|
|
|
2012
|
-
ndt_t *
|
|
2013
|
-
ndt_fixed_string_kind(ndt_context_t *ctx)
|
|
2511
|
+
const ndt_t *
|
|
2512
|
+
ndt_fixed_string_kind(bool opt, ndt_context_t *ctx)
|
|
2014
2513
|
{
|
|
2015
|
-
return ndt_new(FixedStringKind, ctx);
|
|
2514
|
+
return ndt_new(FixedStringKind, opt, ctx);
|
|
2016
2515
|
}
|
|
2017
2516
|
|
|
2018
|
-
ndt_t *
|
|
2019
|
-
ndt_fixed_string(int64_t size, enum ndt_encoding encoding, ndt_context_t *ctx)
|
|
2517
|
+
const ndt_t *
|
|
2518
|
+
ndt_fixed_string(int64_t size, enum ndt_encoding encoding, bool opt, ndt_context_t *ctx)
|
|
2020
2519
|
{
|
|
2021
2520
|
bool overflow = 0;
|
|
2022
2521
|
ndt_t *t;
|
|
2023
2522
|
|
|
2024
2523
|
/* abstract type */
|
|
2025
|
-
t = ndt_new(FixedString, ctx);
|
|
2524
|
+
t = ndt_new(FixedString, opt, ctx);
|
|
2026
2525
|
if (t == NULL) {
|
|
2027
2526
|
return NULL;
|
|
2028
2527
|
}
|
|
@@ -2037,21 +2536,21 @@ ndt_fixed_string(int64_t size, enum ndt_encoding encoding, ndt_context_t *ctx)
|
|
|
2037
2536
|
if (overflow) {
|
|
2038
2537
|
ndt_err_format(ctx, NDT_ValueError,
|
|
2039
2538
|
"overflow while creating fixed string");
|
|
2040
|
-
|
|
2539
|
+
ndt_decref(t);
|
|
2041
2540
|
return NULL;
|
|
2042
2541
|
}
|
|
2043
2542
|
|
|
2044
2543
|
return t;
|
|
2045
2544
|
}
|
|
2046
2545
|
|
|
2047
|
-
ndt_t *
|
|
2048
|
-
ndt_fixed_bytes_kind(ndt_context_t *ctx)
|
|
2546
|
+
const ndt_t *
|
|
2547
|
+
ndt_fixed_bytes_kind(bool opt, ndt_context_t *ctx)
|
|
2049
2548
|
{
|
|
2050
|
-
return ndt_new(FixedBytesKind, ctx);
|
|
2549
|
+
return ndt_new(FixedBytesKind, opt, ctx);
|
|
2051
2550
|
}
|
|
2052
2551
|
|
|
2053
|
-
ndt_t *
|
|
2054
|
-
ndt_fixed_bytes(int64_t size, uint16_opt_t align_attr, ndt_context_t *ctx)
|
|
2552
|
+
const ndt_t *
|
|
2553
|
+
ndt_fixed_bytes(int64_t size, uint16_opt_t align_attr, bool opt, ndt_context_t *ctx)
|
|
2055
2554
|
{
|
|
2056
2555
|
ndt_t *t;
|
|
2057
2556
|
uint16_t align;
|
|
@@ -2068,7 +2567,7 @@ ndt_fixed_bytes(int64_t size, uint16_opt_t align_attr, ndt_context_t *ctx)
|
|
|
2068
2567
|
}
|
|
2069
2568
|
|
|
2070
2569
|
/* abstract type */
|
|
2071
|
-
t = ndt_new(FixedBytes, ctx);
|
|
2570
|
+
t = ndt_new(FixedBytes, opt, ctx);
|
|
2072
2571
|
if (t == NULL) {
|
|
2073
2572
|
return NULL;
|
|
2074
2573
|
}
|
|
@@ -2083,27 +2582,8 @@ ndt_fixed_bytes(int64_t size, uint16_opt_t align_attr, ndt_context_t *ctx)
|
|
|
2083
2582
|
return t;
|
|
2084
2583
|
}
|
|
2085
2584
|
|
|
2086
|
-
ndt_t *
|
|
2087
|
-
|
|
2088
|
-
{
|
|
2089
|
-
ndt_t *t;
|
|
2090
|
-
|
|
2091
|
-
/* abstract type */
|
|
2092
|
-
t = ndt_new(String, ctx);
|
|
2093
|
-
if (t == NULL) {
|
|
2094
|
-
return NULL;
|
|
2095
|
-
}
|
|
2096
|
-
|
|
2097
|
-
/* concrete access */
|
|
2098
|
-
t->access = Concrete;
|
|
2099
|
-
t->datasize = sizeof(char *);
|
|
2100
|
-
t->align = alignof(char *);
|
|
2101
|
-
|
|
2102
|
-
return t;
|
|
2103
|
-
}
|
|
2104
|
-
|
|
2105
|
-
ndt_t *
|
|
2106
|
-
ndt_bytes(uint16_opt_t target_align, ndt_context_t *ctx)
|
|
2585
|
+
const ndt_t *
|
|
2586
|
+
ndt_bytes(uint16_opt_t target_align, bool opt, ndt_context_t *ctx)
|
|
2107
2587
|
{
|
|
2108
2588
|
ndt_t *t;
|
|
2109
2589
|
uint16_t align;
|
|
@@ -2114,7 +2594,7 @@ ndt_bytes(uint16_opt_t target_align, ndt_context_t *ctx)
|
|
|
2114
2594
|
}
|
|
2115
2595
|
|
|
2116
2596
|
/* abstract type */
|
|
2117
|
-
t = ndt_new(Bytes, ctx);
|
|
2597
|
+
t = ndt_new(Bytes, opt|NDT_POINTER, ctx);
|
|
2118
2598
|
if (t == NULL) {
|
|
2119
2599
|
return NULL;
|
|
2120
2600
|
}
|
|
@@ -2128,13 +2608,13 @@ ndt_bytes(uint16_opt_t target_align, ndt_context_t *ctx)
|
|
|
2128
2608
|
return t;
|
|
2129
2609
|
}
|
|
2130
2610
|
|
|
2131
|
-
ndt_t *
|
|
2132
|
-
ndt_char(enum ndt_encoding encoding, ndt_context_t *ctx)
|
|
2611
|
+
const ndt_t *
|
|
2612
|
+
ndt_char(enum ndt_encoding encoding, bool opt, ndt_context_t *ctx)
|
|
2133
2613
|
{
|
|
2134
2614
|
ndt_t *t;
|
|
2135
2615
|
|
|
2136
2616
|
/* abstract type */
|
|
2137
|
-
t = ndt_new(Char, ctx);
|
|
2617
|
+
t = ndt_new(Char, opt|NDT_CHAR, ctx);
|
|
2138
2618
|
if (t == NULL) {
|
|
2139
2619
|
return NULL;
|
|
2140
2620
|
}
|
|
@@ -2148,122 +2628,7 @@ ndt_char(enum ndt_encoding encoding, ndt_context_t *ctx)
|
|
|
2148
2628
|
return t;
|
|
2149
2629
|
}
|
|
2150
2630
|
|
|
2151
|
-
ndt_t *
|
|
2152
|
-
ndt_signed_kind(ndt_context_t *ctx)
|
|
2153
|
-
{
|
|
2154
|
-
return ndt_new(SignedKind, ctx);
|
|
2155
|
-
}
|
|
2156
|
-
|
|
2157
|
-
ndt_t *
|
|
2158
|
-
ndt_unsigned_kind(ndt_context_t *ctx)
|
|
2159
|
-
{
|
|
2160
|
-
return ndt_new(UnsignedKind, ctx);
|
|
2161
|
-
}
|
|
2162
|
-
|
|
2163
|
-
ndt_t *
|
|
2164
|
-
ndt_float_kind(ndt_context_t *ctx)
|
|
2165
|
-
{
|
|
2166
|
-
return ndt_new(FloatKind, ctx);
|
|
2167
|
-
}
|
|
2168
|
-
|
|
2169
|
-
ndt_t *
|
|
2170
|
-
ndt_complex_kind(ndt_context_t *ctx)
|
|
2171
|
-
{
|
|
2172
|
-
return ndt_new(ComplexKind, ctx);
|
|
2173
|
-
}
|
|
2174
|
-
|
|
2175
|
-
ndt_t *
|
|
2176
|
-
ndt_primitive(enum ndt tag, uint32_t flags, ndt_context_t *ctx)
|
|
2177
|
-
{
|
|
2178
|
-
ndt_t *t;
|
|
2179
|
-
|
|
2180
|
-
if (flags != 0 && flags != NDT_LITTLE_ENDIAN && flags != NDT_BIG_ENDIAN) {
|
|
2181
|
-
ndt_err_format(ctx, NDT_ValueError,
|
|
2182
|
-
"flags argument must be 0 or NDT_LITTLE_ENDIAN or NDT_BIG_ENDIAN");
|
|
2183
|
-
return NULL;
|
|
2184
|
-
}
|
|
2185
|
-
|
|
2186
|
-
/* abstract type */
|
|
2187
|
-
t = ndt_new(tag, ctx);
|
|
2188
|
-
if (t == NULL) {
|
|
2189
|
-
return NULL;
|
|
2190
|
-
}
|
|
2191
|
-
t->flags |= flags;
|
|
2192
|
-
|
|
2193
|
-
/* concrete access */
|
|
2194
|
-
t->access = Concrete;
|
|
2195
|
-
|
|
2196
|
-
switch(tag) {
|
|
2197
|
-
case Bool:
|
|
2198
|
-
t->datasize = sizeof(bool);
|
|
2199
|
-
t->align = alignof(bool);
|
|
2200
|
-
break;
|
|
2201
|
-
case Int8:
|
|
2202
|
-
t->datasize = sizeof(int8_t);
|
|
2203
|
-
t->align = alignof(int8_t);
|
|
2204
|
-
break;
|
|
2205
|
-
case Int16:
|
|
2206
|
-
t->datasize = sizeof(int16_t);
|
|
2207
|
-
t->align = alignof(int16_t);
|
|
2208
|
-
break;
|
|
2209
|
-
case Int32:
|
|
2210
|
-
t->datasize = sizeof(int32_t);
|
|
2211
|
-
t->align = alignof(int32_t);
|
|
2212
|
-
break;
|
|
2213
|
-
case Int64:
|
|
2214
|
-
t->datasize = sizeof(int64_t);
|
|
2215
|
-
t->align = alignof(int64_t);
|
|
2216
|
-
break;
|
|
2217
|
-
case Uint8:
|
|
2218
|
-
t->datasize = sizeof(uint8_t);
|
|
2219
|
-
t->align = alignof(uint8_t);
|
|
2220
|
-
break;
|
|
2221
|
-
case Uint16:
|
|
2222
|
-
t->datasize = sizeof(uint16_t);
|
|
2223
|
-
t->align = alignof(uint16_t);
|
|
2224
|
-
break;
|
|
2225
|
-
case Uint32:
|
|
2226
|
-
t->datasize = sizeof(uint32_t);
|
|
2227
|
-
t->align = alignof(uint32_t);
|
|
2228
|
-
break;
|
|
2229
|
-
case Uint64:
|
|
2230
|
-
t->datasize = sizeof(uint64_t);
|
|
2231
|
-
t->align = alignof(uint64_t);
|
|
2232
|
-
break;
|
|
2233
|
-
case Float16:
|
|
2234
|
-
t->datasize = 2;
|
|
2235
|
-
t->align = 2;
|
|
2236
|
-
break;
|
|
2237
|
-
case Float32:
|
|
2238
|
-
t->datasize = sizeof(float);
|
|
2239
|
-
t->align = alignof(float);
|
|
2240
|
-
break;
|
|
2241
|
-
case Float64:
|
|
2242
|
-
t->datasize = sizeof(double);
|
|
2243
|
-
t->align = alignof(double);
|
|
2244
|
-
break;
|
|
2245
|
-
case Complex32:
|
|
2246
|
-
t->datasize = 4;
|
|
2247
|
-
t->align = 2;
|
|
2248
|
-
break;
|
|
2249
|
-
case Complex64:
|
|
2250
|
-
t->datasize = sizeof(ndt_complex64_t);
|
|
2251
|
-
t->align = alignof(ndt_complex64_t);
|
|
2252
|
-
break;
|
|
2253
|
-
case Complex128:
|
|
2254
|
-
t->datasize = sizeof(ndt_complex128_t);
|
|
2255
|
-
t->align = alignof(ndt_complex128_t);
|
|
2256
|
-
break;
|
|
2257
|
-
default:
|
|
2258
|
-
ndt_err_format(ctx, NDT_ValueError, "not a primitive type"),
|
|
2259
|
-
ndt_free(t);
|
|
2260
|
-
return NULL;
|
|
2261
|
-
}
|
|
2262
|
-
|
|
2263
|
-
return t;
|
|
2264
|
-
}
|
|
2265
|
-
|
|
2266
|
-
ndt_t *
|
|
2631
|
+
const ndt_t *
|
|
2267
2632
|
ndt_signed(int size, uint32_t flags, ndt_context_t *ctx)
|
|
2268
2633
|
{
|
|
2269
2634
|
switch (size) {
|
|
@@ -2278,7 +2643,7 @@ ndt_signed(int size, uint32_t flags, ndt_context_t *ctx)
|
|
|
2278
2643
|
}
|
|
2279
2644
|
}
|
|
2280
2645
|
|
|
2281
|
-
ndt_t *
|
|
2646
|
+
const ndt_t *
|
|
2282
2647
|
ndt_unsigned(int size, uint32_t flags, ndt_context_t *ctx)
|
|
2283
2648
|
{
|
|
2284
2649
|
switch (size) {
|
|
@@ -2293,7 +2658,7 @@ ndt_unsigned(int size, uint32_t flags, ndt_context_t *ctx)
|
|
|
2293
2658
|
}
|
|
2294
2659
|
}
|
|
2295
2660
|
|
|
2296
|
-
ndt_t *
|
|
2661
|
+
const ndt_t *
|
|
2297
2662
|
ndt_from_alias(enum ndt_alias tag, uint32_t flags, ndt_context_t *ctx)
|
|
2298
2663
|
{
|
|
2299
2664
|
switch (tag) {
|
|
@@ -2306,13 +2671,13 @@ ndt_from_alias(enum ndt_alias tag, uint32_t flags, ndt_context_t *ctx)
|
|
|
2306
2671
|
}
|
|
2307
2672
|
}
|
|
2308
2673
|
|
|
2309
|
-
ndt_t *
|
|
2674
|
+
const ndt_t *
|
|
2310
2675
|
ndt_typevar(char *name, ndt_context_t *ctx)
|
|
2311
2676
|
{
|
|
2312
2677
|
ndt_t *t;
|
|
2313
2678
|
|
|
2314
2679
|
/* abstract type */
|
|
2315
|
-
t = ndt_new(Typevar, ctx);
|
|
2680
|
+
t = ndt_new(Typevar, 0, ctx);
|
|
2316
2681
|
if (t == NULL) {
|
|
2317
2682
|
ndt_free(name);
|
|
2318
2683
|
return NULL;
|