ndtypes 0.2.0dev5 → 0.2.0dev6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (130) hide show
  1. checksums.yaml +4 -4
  2. data/CONTRIBUTING.md +12 -0
  3. data/Rakefile +8 -0
  4. data/ext/ruby_ndtypes/GPATH +0 -0
  5. data/ext/ruby_ndtypes/GRTAGS +0 -0
  6. data/ext/ruby_ndtypes/GTAGS +0 -0
  7. data/ext/ruby_ndtypes/extconf.rb +1 -1
  8. data/ext/ruby_ndtypes/include/ndtypes.h +231 -122
  9. data/ext/ruby_ndtypes/include/ruby_ndtypes.h +1 -1
  10. data/ext/ruby_ndtypes/lib/libndtypes.a +0 -0
  11. data/ext/ruby_ndtypes/lib/libndtypes.so.0.2.0dev3 +0 -0
  12. data/ext/ruby_ndtypes/ndtypes/Makefile +87 -0
  13. data/ext/ruby_ndtypes/ndtypes/config.h +68 -0
  14. data/ext/ruby_ndtypes/ndtypes/config.log +477 -0
  15. data/ext/ruby_ndtypes/ndtypes/config.status +1027 -0
  16. data/ext/ruby_ndtypes/ndtypes/doc/_static/style.css +7 -0
  17. data/ext/ruby_ndtypes/ndtypes/doc/_templates/layout.html +2 -0
  18. data/ext/ruby_ndtypes/ndtypes/doc/conf.py +40 -4
  19. data/ext/ruby_ndtypes/ndtypes/doc/images/xndlogo.png +0 -0
  20. data/ext/ruby_ndtypes/ndtypes/doc/ndtypes/types.rst +1 -1
  21. data/ext/ruby_ndtypes/ndtypes/doc/requirements.txt +2 -0
  22. data/ext/ruby_ndtypes/ndtypes/libndtypes/Makefile +287 -0
  23. data/ext/ruby_ndtypes/ndtypes/libndtypes/Makefile.in +20 -4
  24. data/ext/ruby_ndtypes/ndtypes/libndtypes/Makefile.vc +22 -3
  25. data/ext/ruby_ndtypes/ndtypes/libndtypes/alloc.c +1 -1
  26. data/ext/ruby_ndtypes/ndtypes/libndtypes/alloc.o +0 -0
  27. data/ext/ruby_ndtypes/ndtypes/libndtypes/attr.o +0 -0
  28. data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/Makefile +73 -0
  29. data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/bpgrammar.c +246 -229
  30. data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/bpgrammar.h +15 -11
  31. data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/bpgrammar.o +0 -0
  32. data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/bpgrammar.y +38 -28
  33. data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/bplexer.c +91 -91
  34. data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/bplexer.h +1 -1
  35. data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/bplexer.l +4 -3
  36. data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/bplexer.o +0 -0
  37. data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/export.c +8 -7
  38. data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/export.o +0 -0
  39. data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/import.c +2 -2
  40. data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/import.o +0 -0
  41. data/ext/ruby_ndtypes/ndtypes/libndtypes/context.o +0 -0
  42. data/ext/ruby_ndtypes/ndtypes/libndtypes/copy.c +263 -182
  43. data/ext/ruby_ndtypes/ndtypes/libndtypes/copy.o +0 -0
  44. data/ext/ruby_ndtypes/ndtypes/libndtypes/encodings.o +0 -0
  45. data/ext/ruby_ndtypes/ndtypes/libndtypes/equal.c +67 -7
  46. data/ext/ruby_ndtypes/ndtypes/libndtypes/equal.o +0 -0
  47. data/ext/ruby_ndtypes/ndtypes/libndtypes/grammar.c +1112 -1000
  48. data/ext/ruby_ndtypes/ndtypes/libndtypes/grammar.h +69 -58
  49. data/ext/ruby_ndtypes/ndtypes/libndtypes/grammar.o +0 -0
  50. data/ext/ruby_ndtypes/ndtypes/libndtypes/grammar.y +150 -99
  51. data/ext/ruby_ndtypes/ndtypes/libndtypes/io.c +185 -15
  52. data/ext/ruby_ndtypes/ndtypes/libndtypes/io.o +0 -0
  53. data/ext/ruby_ndtypes/ndtypes/libndtypes/lexer.c +301 -276
  54. data/ext/ruby_ndtypes/ndtypes/libndtypes/lexer.h +1 -1
  55. data/ext/ruby_ndtypes/ndtypes/libndtypes/lexer.l +9 -4
  56. data/ext/ruby_ndtypes/ndtypes/libndtypes/lexer.o +0 -0
  57. data/ext/ruby_ndtypes/ndtypes/libndtypes/libndtypes.a +0 -0
  58. data/ext/ruby_ndtypes/ndtypes/libndtypes/libndtypes.so +1 -0
  59. data/ext/ruby_ndtypes/ndtypes/libndtypes/libndtypes.so.0 +1 -0
  60. data/ext/ruby_ndtypes/ndtypes/libndtypes/libndtypes.so.0.2.0dev3 +0 -0
  61. data/ext/ruby_ndtypes/ndtypes/libndtypes/match.c +729 -228
  62. data/ext/ruby_ndtypes/ndtypes/libndtypes/match.o +0 -0
  63. data/ext/ruby_ndtypes/ndtypes/libndtypes/ndtypes.c +768 -403
  64. data/ext/ruby_ndtypes/ndtypes/libndtypes/ndtypes.h +1002 -0
  65. data/ext/ruby_ndtypes/ndtypes/libndtypes/ndtypes.h.in +231 -122
  66. data/ext/ruby_ndtypes/ndtypes/libndtypes/ndtypes.o +0 -0
  67. data/ext/ruby_ndtypes/ndtypes/libndtypes/parsefuncs.c +176 -84
  68. data/ext/ruby_ndtypes/ndtypes/libndtypes/parsefuncs.h +26 -14
  69. data/ext/ruby_ndtypes/ndtypes/libndtypes/parsefuncs.o +0 -0
  70. data/ext/ruby_ndtypes/ndtypes/libndtypes/parser.c +57 -35
  71. data/ext/ruby_ndtypes/ndtypes/libndtypes/parser.o +0 -0
  72. data/ext/ruby_ndtypes/ndtypes/libndtypes/primitive.c +420 -0
  73. data/ext/ruby_ndtypes/ndtypes/libndtypes/primitive.o +0 -0
  74. data/ext/ruby_ndtypes/ndtypes/libndtypes/seq.c +8 -8
  75. data/ext/ruby_ndtypes/ndtypes/libndtypes/seq.h +1 -1
  76. data/ext/ruby_ndtypes/ndtypes/libndtypes/seq.o +0 -0
  77. data/ext/ruby_ndtypes/ndtypes/libndtypes/serialize/Makefile +48 -0
  78. data/ext/ruby_ndtypes/ndtypes/libndtypes/serialize/deserialize.c +200 -116
  79. data/ext/ruby_ndtypes/ndtypes/libndtypes/serialize/deserialize.o +0 -0
  80. data/ext/ruby_ndtypes/ndtypes/libndtypes/serialize/serialize.c +46 -4
  81. data/ext/ruby_ndtypes/ndtypes/libndtypes/serialize/serialize.o +0 -0
  82. data/ext/ruby_ndtypes/ndtypes/libndtypes/substitute.c +58 -27
  83. data/ext/ruby_ndtypes/ndtypes/libndtypes/substitute.h +1 -1
  84. data/ext/ruby_ndtypes/ndtypes/libndtypes/substitute.o +0 -0
  85. data/ext/ruby_ndtypes/ndtypes/libndtypes/symtable.c +3 -5
  86. data/ext/ruby_ndtypes/ndtypes/libndtypes/symtable.h +12 -4
  87. data/ext/ruby_ndtypes/ndtypes/libndtypes/symtable.o +0 -0
  88. data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/Makefile +55 -0
  89. data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/Makefile.in +8 -8
  90. data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/Makefile.vc +5 -5
  91. data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/runtest.c +274 -172
  92. data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test.h +24 -4
  93. data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_array.c +2 -2
  94. data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_buffer.c +14 -14
  95. data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_match.c +32 -30
  96. data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_parse.c +37 -0
  97. data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_parse_error.c +36 -0
  98. data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_parse_roundtrip.c +16 -0
  99. data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_record.c +5 -5
  100. data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_typecheck.c +706 -253
  101. data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_unify.c +132 -0
  102. data/ext/ruby_ndtypes/ndtypes/libndtypes/unify.c +703 -0
  103. data/ext/ruby_ndtypes/ndtypes/libndtypes/unify.o +0 -0
  104. data/ext/ruby_ndtypes/ndtypes/libndtypes/util.c +335 -127
  105. data/ext/ruby_ndtypes/ndtypes/libndtypes/util.o +0 -0
  106. data/ext/ruby_ndtypes/ndtypes/libndtypes/values.c +2 -2
  107. data/ext/ruby_ndtypes/ndtypes/libndtypes/values.o +0 -0
  108. data/ext/ruby_ndtypes/ndtypes/python/ndt_randtype.py +88 -71
  109. data/ext/ruby_ndtypes/ndtypes/python/ndt_support.py +0 -1
  110. data/ext/ruby_ndtypes/ndtypes/python/ndtypes/__init__.py +10 -13
  111. data/ext/ruby_ndtypes/ndtypes/python/ndtypes/_ndtypes.c +395 -314
  112. data/ext/ruby_ndtypes/ndtypes/python/ndtypes/libndtypes.a +0 -0
  113. data/ext/ruby_ndtypes/ndtypes/python/ndtypes/libndtypes.so +1 -0
  114. data/ext/ruby_ndtypes/ndtypes/python/ndtypes/libndtypes.so.0 +1 -0
  115. data/ext/ruby_ndtypes/ndtypes/python/ndtypes/libndtypes.so.0.2.0dev3 +0 -0
  116. data/ext/ruby_ndtypes/ndtypes/python/ndtypes/ndtypes.h +1002 -0
  117. data/ext/ruby_ndtypes/ndtypes/python/ndtypes/pyndtypes.h +15 -33
  118. data/ext/ruby_ndtypes/ndtypes/python/test_ndtypes.py +340 -132
  119. data/ext/ruby_ndtypes/ndtypes/setup.py +11 -2
  120. data/ext/ruby_ndtypes/ruby_ndtypes.c +364 -241
  121. data/ext/ruby_ndtypes/ruby_ndtypes.h +1 -1
  122. data/ext/ruby_ndtypes/ruby_ndtypes_internal.h +0 -1
  123. data/lib/ndtypes.rb +11 -0
  124. data/lib/ndtypes/version.rb +2 -2
  125. data/lib/ruby_ndtypes.so +0 -0
  126. data/ndtypes.gemspec +3 -0
  127. data/spec/ndtypes_spec.rb +6 -0
  128. metadata +98 -4
  129. data/ext/ruby_ndtypes/gc_guard.c +0 -36
  130. data/ext/ruby_ndtypes/gc_guard.h +0 -12
@@ -231,17 +231,35 @@ static int64_t
231
231
  write_var_dim(char * const ptr, int64_t offset, const ndt_t * const t,
232
232
  bool *overflow)
233
233
  {
234
- const int32_t noffsets = t->Concrete.VarDim.noffsets;
234
+ const ndt_offsets_t *offsets = t->Concrete.VarDim.offsets;
235
+ const int32_t noffsets = offsets ? offsets->n : 0;
236
+ const int32_t *offset_array = offsets ? offsets->v : NULL;
235
237
  const int32_t nslices = t->Concrete.VarDim.nslices;
236
238
 
237
239
  offset = write_int64(ptr, offset, t->Concrete.VarDim.itemsize, overflow);
238
240
  offset = write_int32(ptr, offset, noffsets, overflow);
239
241
  offset = write_int32(ptr, offset, t->Concrete.VarDim.nslices, overflow);
240
- offset = write_int32_array(ptr, offset, t->Concrete.VarDim.offsets, noffsets, overflow);
242
+ offset = write_int32_array(ptr, offset, offset_array, noffsets, overflow);
241
243
  offset = write_ndt_slice_array(ptr, offset, t->Concrete.VarDim.slices, nslices, overflow);
242
244
  return write_type(ptr, offset, t->VarDim.type, overflow);
243
245
  }
244
246
 
247
+ static int64_t
248
+ write_var_dim_elem(char * const ptr, int64_t offset, const ndt_t * const t,
249
+ bool *overflow)
250
+ {
251
+ offset = write_int64(ptr, offset, t->VarDimElem.index, overflow);
252
+ return write_var_dim(ptr, offset, t, overflow);
253
+ }
254
+
255
+ static int64_t
256
+ write_array(char * const ptr, int64_t offset, const ndt_t * const t,
257
+ bool *overflow)
258
+ {
259
+ offset = write_int64(ptr, offset, t->Array.itemsize, overflow);
260
+ return write_type(ptr, offset, t->Array.type, overflow);
261
+ }
262
+
245
263
  static int64_t
246
264
  write_tuple(char * const ptr, int64_t offset, const ndt_t * const t,
247
265
  bool *overflow)
@@ -291,6 +309,27 @@ write_record(char * const ptr, int64_t offset, const ndt_t * const t,
291
309
  return offset;
292
310
  }
293
311
 
312
+ static int64_t
313
+ write_union(char * const ptr, int64_t offset, const ndt_t * const t,
314
+ bool *overflow)
315
+ {
316
+ const int64_t ntags = t->Union.ntags;
317
+ int64_t metaoffset;
318
+
319
+ offset = write_int64(ptr, offset, ntags, overflow);
320
+ offset = write_string_array(ptr, offset, t->Union.tags, ntags, overflow);
321
+
322
+ metaoffset = offset;
323
+ offset = alloc_int64_array(offset, ntags, overflow);
324
+
325
+ for (int64_t i = 0; i < ntags; i++) {
326
+ metaoffset = write_int64(ptr, metaoffset, offset, overflow);
327
+ offset = write_type(ptr, offset, t->Union.types[i], overflow);
328
+ }
329
+
330
+ return offset;
331
+ }
332
+
294
333
  static int64_t
295
334
  write_ref(char * const ptr, int64_t offset, const ndt_t * const t,
296
335
  bool *overflow)
@@ -376,8 +415,11 @@ write_type(char * const ptr, int64_t offset, const ndt_t * const t,
376
415
  case SymbolicDim: return write_symbolic_dim(ptr, offset, t, overflow);
377
416
  case EllipsisDim: return write_ellipsis_dim(ptr, offset, t, overflow);
378
417
  case VarDim: return write_var_dim(ptr, offset, t, overflow);
418
+ case VarDimElem: return write_var_dim_elem(ptr, offset, t, overflow);
419
+ case Array: return write_array(ptr, offset, t, overflow);
379
420
  case Tuple: return write_tuple(ptr, offset, t, overflow);
380
421
  case Record: return write_record(ptr, offset, t, overflow);
422
+ case Union: return write_union(ptr, offset, t, overflow);
381
423
  case Ref: return write_ref(ptr, offset, t, overflow);
382
424
  case Constr: return write_constr(ptr, offset, t, overflow);
383
425
  case Nominal: return write_nominal(ptr, offset, t, overflow);
@@ -391,8 +433,8 @@ write_type(char * const ptr, int64_t offset, const ndt_t * const t,
391
433
  case Bool:
392
434
  case Int8: case Int16: case Int32: case Int64:
393
435
  case Uint8: case Uint16: case Uint32: case Uint64:
394
- case Float16: case Float32: case Float64:
395
- case Complex32: case Complex64: case Complex128:
436
+ case BFloat16: case Float16: case Float32: case Float64:
437
+ case BComplex32: case Complex32: case Complex64: case Complex128:
396
438
  case String:
397
439
 
398
440
  case AnyKind:
@@ -44,11 +44,11 @@
44
44
  #include "substitute.h"
45
45
 
46
46
 
47
- static ndt_t *
47
+ static const ndt_t *
48
48
  substitute_named_ellipsis(const ndt_t *t, const symtable_t *tbl, ndt_context_t *ctx)
49
49
  {
50
50
  symtable_entry_t v;
51
- ndt_t *u;
51
+ const ndt_t *u;
52
52
  int i;
53
53
 
54
54
  assert(t->tag == EllipsisDim && t->EllipsisDim.name != NULL);
@@ -67,7 +67,8 @@ substitute_named_ellipsis(const ndt_t *t, const symtable_t *tbl, ndt_context_t *
67
67
  assert(ndt_is_concrete(w));
68
68
  assert(w->tag == FixedDim);
69
69
 
70
- u = ndt_fixed_dim(u, w->FixedDim.shape, INT64_MAX, ctx);
70
+ const ndt_t *x = ndt_fixed_dim(u, w->FixedDim.shape, INT64_MAX, ctx);
71
+ ndt_move(&u, x);
71
72
  if (u == NULL) {
72
73
  return NULL;
73
74
  }
@@ -81,25 +82,44 @@ substitute_named_ellipsis(const ndt_t *t, const symtable_t *tbl, ndt_context_t *
81
82
  }
82
83
  else {
83
84
  const ndt_t *w = v.VarSeq.dims[0];
84
- return ndt_copy_contiguous_dtype(w, u, ctx);
85
+ const ndt_t *x = ndt_copy_contiguous_dtype(w, u, v.VarSeq.linear_index, ctx);
86
+ ndt_decref(u);
87
+ return x;
85
88
  }
86
89
  }
90
+ case ArraySeq: {
91
+ for (i = v.ArraySeq.size-1; i >= 0; i--) {
92
+ const ndt_t *w = v.ArraySeq.dims[i];
93
+ assert(ndt_is_concrete(w));
94
+ assert(w->tag == Array);
95
+
96
+ const ndt_t *x = ndt_array(u, false, ctx);
97
+ ndt_move(&u, x);
98
+ if (u == NULL) {
99
+ return NULL;
100
+ }
101
+ }
102
+
103
+ return u;
104
+ }
87
105
  default:
88
106
  ndt_err_format(ctx, NDT_ValueError,
89
107
  "variable not found or has incorrect type");
90
- ndt_del(u);
108
+ ndt_decref(u);
91
109
  return NULL;
92
110
  }
93
111
  }
94
112
 
95
- ndt_t *
113
+ const ndt_t *
96
114
  ndt_substitute(const ndt_t *t, const symtable_t *tbl, const bool req_concrete,
97
115
  ndt_context_t *ctx)
98
116
  {
99
- ndt_t *u;
117
+ bool opt = ndt_is_optional(t);
118
+ const ndt_t *u, *w;
100
119
 
101
120
  if (ndt_is_concrete(t)) {
102
- return ndt_copy(t, ctx);
121
+ ndt_incref(t);
122
+ return t;
103
123
  }
104
124
 
105
125
  switch (t->tag) {
@@ -109,8 +129,10 @@ ndt_substitute(const ndt_t *t, const symtable_t *tbl, const bool req_concrete,
109
129
  return NULL;
110
130
  }
111
131
 
112
- return ndt_fixed_dim(u, t->FixedDim.shape, t->Concrete.FixedDim.step,
113
- ctx);
132
+ w = ndt_fixed_dim(u, t->FixedDim.shape, t->Concrete.FixedDim.step,
133
+ ctx);
134
+ ndt_decref(u);
135
+ return w;
114
136
  }
115
137
 
116
138
  case VarDim: {
@@ -119,7 +141,9 @@ ndt_substitute(const ndt_t *t, const symtable_t *tbl, const bool req_concrete,
119
141
  return NULL;
120
142
  }
121
143
 
122
- return ndt_copy_abstract_var_dtype(t, u, ctx);
144
+ w = ndt_copy_abstract_var_dtype(t, u, ctx);
145
+ ndt_decref(u);
146
+ return w;
123
147
  }
124
148
 
125
149
  case SymbolicDim: {
@@ -131,21 +155,25 @@ ndt_substitute(const ndt_t *t, const symtable_t *tbl, const bool req_concrete,
131
155
  const int64_t shape = symtable_find_shape(tbl, t->SymbolicDim.name, ctx);
132
156
  if (shape < 0) {
133
157
  if (req_concrete) {
134
- ndt_del(u);
158
+ ndt_decref(u);
135
159
  return NULL;
136
160
  }
137
161
  else {
138
162
  ndt_err_clear(ctx);
139
163
  char *name = ndt_strdup(t->SymbolicDim.name, ctx);
140
164
  if (name == NULL) {
141
- ndt_del(u);
165
+ ndt_decref(u);
142
166
  return NULL;
143
167
  }
144
- return ndt_symbolic_dim(name, u, ctx);
168
+ w = ndt_symbolic_dim(name, u, ctx);
169
+ ndt_decref(u);
170
+ return w;
145
171
  }
146
172
  }
147
173
 
148
- return ndt_fixed_dim(u, shape, INT64_MAX, ctx);
174
+ w = ndt_fixed_dim(u, shape, INT64_MAX, ctx);
175
+ ndt_decref(u);
176
+ return w;
149
177
  }
150
178
 
151
179
  case EllipsisDim: {
@@ -188,7 +216,9 @@ ndt_substitute(const ndt_t *t, const symtable_t *tbl, const bool req_concrete,
188
216
  return NULL;
189
217
  }
190
218
 
191
- return ndt_constr(name, u, ctx);
219
+ w = ndt_constr(name, u, opt, ctx);
220
+ ndt_decref(u);
221
+ return w;
192
222
  }
193
223
 
194
224
  case Nominal: {
@@ -203,31 +233,32 @@ ndt_substitute(const ndt_t *t, const symtable_t *tbl, const bool req_concrete,
203
233
  return NULL;
204
234
  }
205
235
 
206
- return ndt_nominal(name, u, ctx);
236
+ w = ndt_nominal(name, u, opt, ctx);
237
+ ndt_decref(u);
238
+ return w;
207
239
  }
208
240
 
209
- case Ref:
241
+ case Ref: {
210
242
  u = ndt_substitute(t->Ref.type, tbl, req_concrete, ctx);
211
243
  if (u == NULL) {
212
244
  return NULL;
213
245
  }
214
246
 
215
- return ndt_ref(u, ctx);
247
+ w = ndt_ref(u, opt, ctx);
248
+ ndt_decref(u);
249
+ return w;
250
+ }
216
251
 
217
252
  case Bool:
218
253
  case Int8: case Int16: case Int32: case Int64:
219
254
  case Uint8: case Uint16: case Uint32: case Uint64:
220
- case Float16: case Float32: case Float64:
221
- case Complex32: case Complex64: case Complex128:
255
+ case BFloat16: case Float16: case Float32: case Float64:
256
+ case BComplex32: case Complex32: case Complex64: case Complex128:
222
257
  case FixedString: case FixedBytes:
223
258
  case String: case Bytes:
224
259
  case Char: {
225
- u = ndt_new(t->tag, ctx);
226
- if (u == NULL) {
227
- return NULL;
228
- }
229
- *u = *t;
230
- return u;
260
+ ndt_incref(t);
261
+ return t;
231
262
  }
232
263
 
233
264
  default:
@@ -41,7 +41,7 @@
41
41
  /* LOCAL SCOPE */
42
42
  NDT_PRAGMA(NDT_HIDE_SYMBOLS_START)
43
43
 
44
- ndt_t *ndt_substitute(const ndt_t *t, const symtable_t *tbl, const bool req_concrete, ndt_context_t *ctx);
44
+ const ndt_t *ndt_substitute(const ndt_t *t, const symtable_t *tbl, const bool req_concrete, ndt_context_t *ctx);
45
45
 
46
46
  /* END LOCAL SCOPE */
47
47
  NDT_PRAGMA(NDT_HIDE_SYMBOLS_END)
@@ -106,7 +106,7 @@ typedef_trie_del(typedef_trie_t *t)
106
106
  return;
107
107
  }
108
108
 
109
- ndt_del((ndt_t *)t->def.type);
109
+ ndt_decref(t->def.type);
110
110
 
111
111
  for (i = 0; i < ALPHABET_LEN; i++) {
112
112
  typedef_trie_del(t->next[i]);
@@ -116,7 +116,7 @@ typedef_trie_del(typedef_trie_t *t)
116
116
  }
117
117
 
118
118
  int
119
- ndt_typedef_add(const char *key, ndt_t *type, const ndt_methods_t *m, ndt_context_t *ctx)
119
+ ndt_typedef_add(const char *key, const ndt_t *type, const ndt_methods_t *m, ndt_context_t *ctx)
120
120
  {
121
121
  typedef_trie_t *t = typedef_map;
122
122
  const unsigned char *cp;
@@ -127,14 +127,12 @@ ndt_typedef_add(const char *key, ndt_t *type, const ndt_methods_t *m, ndt_contex
127
127
  if (i == UCHAR_MAX) {
128
128
  ndt_err_format(ctx, NDT_ValueError,
129
129
  "invalid character in typedef: '%c'", *cp);
130
- ndt_del(type);
131
130
  return -1;
132
131
  }
133
132
 
134
133
  if (t->next[i] == NULL) {
135
134
  typedef_trie_t *u = typedef_trie_new(ctx);
136
135
  if (u == NULL) {
137
- ndt_del(type);
138
136
  return -1;
139
137
  }
140
138
  t->next[i] = u;
@@ -147,10 +145,10 @@ ndt_typedef_add(const char *key, ndt_t *type, const ndt_methods_t *m, ndt_contex
147
145
 
148
146
  if (t->def.type) {
149
147
  ndt_err_format(ctx, NDT_ValueError, "duplicate typedef '%s'", key);
150
- ndt_del(type);
151
148
  return -1;
152
149
  }
153
150
 
151
+ ndt_incref(type);
154
152
  t->def.type = type;
155
153
 
156
154
  if (m != NULL) {
@@ -46,13 +46,20 @@ enum symtable_entry {
46
46
  Type,
47
47
  BroadcastSeq,
48
48
  FixedSeq,
49
- VarSeq
49
+ VarSeq,
50
+ ArraySeq
50
51
  };
51
52
 
52
53
  typedef struct {
53
54
  int size;
54
55
  const ndt_t *dims[NDT_MAX_DIM];
55
- } dim_list_t;
56
+ } fixed_list_t;
57
+
58
+ typedef struct {
59
+ int size;
60
+ int64_t linear_index;
61
+ const ndt_t *dims[NDT_MAX_DIM];
62
+ } var_list_t;
56
63
 
57
64
  typedef struct {
58
65
  int size;
@@ -66,8 +73,9 @@ typedef struct {
66
73
  const char *Symbol;
67
74
  const ndt_t *Type;
68
75
  broadcast_list_t BroadcastSeq;
69
- dim_list_t FixedSeq;
70
- dim_list_t VarSeq;
76
+ fixed_list_t FixedSeq;
77
+ var_list_t VarSeq;
78
+ fixed_list_t ArraySeq;
71
79
  };
72
80
  } symtable_entry_t;
73
81
 
@@ -0,0 +1,55 @@
1
+
2
+ SRCDIR = ..
3
+
4
+ CC = gcc
5
+
6
+ LIBSTATIC = libndtypes.a
7
+ LIBSHARED = libndtypes.so.0.2.0dev3
8
+
9
+ CONFIGURE_CFLAGS = -I.. -Wall -Wextra -std=c11 -pedantic -O2 -g
10
+ NDT_CFLAGS = $(strip $(CONFIGURE_CFLAGS) $(CFLAGS))
11
+
12
+ CONFIGURE_COV_CFLAGS = -I.. -Wall -Wextra -std=c11 -pedantic -O0 -g -fno-inline -fprofile-arcs -ftest-coverage
13
+ CONFIGURE_COV_LDFLAGS = -shared -Wl,-soname,libndtypes.so.0 -fprofile-arcs
14
+ ifeq ($(MAKECMDGOALS), coverage)
15
+ NDT_CFLAGS = $(strip $(CONFIGURE_COV_CFLAGS) $(CFLAGS))
16
+ NDT_LDFLAGS = $(strip $(CONFIGURE_COV_LDFLAGS) $(LDFLAGS))
17
+ endif
18
+
19
+
20
+ default: runtest runtest_shared
21
+
22
+ coverage: runtest runtest_shared
23
+
24
+
25
+ runtest:\
26
+ Makefile runtest.c alloc_fail.c test_parse.c test_parse_error.c test_parse_roundtrip.c \
27
+ test_indent.c test_typecheck.c test_numba.c test_typedef.c test_match.c test_unify.c \
28
+ test_record.c test_buffer.c test.h alloc_fail.h \
29
+ $(SRCDIR)/ndtypes.h $(SRCDIR)/$(LIBSTATIC)
30
+ $(CC) -DTEST_ALLOC $(NDT_CFLAGS) -o runtest runtest.c \
31
+ alloc_fail.c test_parse.c test_parse_error.c test_parse_roundtrip.c \
32
+ test_indent.c test_typedef.c test_match.c test_unify.c test_typecheck.c \
33
+ test_numba.c test_record.c test_array.c test_buffer.c $(SRCDIR)/$(LIBSTATIC)
34
+
35
+ runtest_shared:\
36
+ Makefile runtest.c alloc_fail.c test_parse.c test_parse_error.c test_parse_roundtrip.c \
37
+ test_indent.c test_typecheck.c test_numba.c test_typedef.c test_match.c test_unify.c \
38
+ test_record.c test_buffer.c test.h alloc_fail.h \
39
+ $(SRCDIR)/ndtypes.h $(SRCDIR)/$(LIBSHARED)
40
+ $(CC) -L$(SRCDIR) -DTEST_ALLOC $(NDT_CFLAGS) -o runtest_shared runtest.c \
41
+ alloc_fail.c test_parse.c test_parse_error.c test_parse_roundtrip.c \
42
+ test_indent.c test_typedef.c test_match.c test_unify.c test_typecheck.c \
43
+ test_numba.c test_record.c test_array.c test_buffer.c -lndtypes
44
+
45
+
46
+ FORCE:
47
+
48
+ clean: FORCE
49
+ rm -f *.o *.gch *.gcda *.gcno *.gcov *.dyn *.dpi *.lock
50
+ rm -f runtest runtest_shared
51
+
52
+ distclean: clean
53
+ rm -rf Makefile
54
+
55
+
@@ -24,23 +24,23 @@ coverage: runtest runtest_shared
24
24
 
25
25
  runtest:\
26
26
  Makefile runtest.c alloc_fail.c test_parse.c test_parse_error.c test_parse_roundtrip.c \
27
- test_indent.c test_typecheck.c test_numba.c test_typedef.c test_match.c test_record.c \
28
- test_buffer.c test.h alloc_fail.h \
27
+ test_indent.c test_typecheck.c test_numba.c test_typedef.c test_match.c test_unify.c \
28
+ test_record.c test_buffer.c test.h alloc_fail.h \
29
29
  $(SRCDIR)/ndtypes.h $(SRCDIR)/$(LIBSTATIC)
30
30
  $(CC) -DTEST_ALLOC $(NDT_CFLAGS) -o runtest runtest.c \
31
31
  alloc_fail.c test_parse.c test_parse_error.c test_parse_roundtrip.c \
32
- test_indent.c test_typedef.c test_match.c test_typecheck.c test_numba.c \
33
- test_record.c test_array.c test_buffer.c $(SRCDIR)/$(LIBSTATIC)
32
+ test_indent.c test_typedef.c test_match.c test_unify.c test_typecheck.c \
33
+ test_numba.c test_record.c test_array.c test_buffer.c $(SRCDIR)/$(LIBSTATIC)
34
34
 
35
35
  runtest_shared:\
36
36
  Makefile runtest.c alloc_fail.c test_parse.c test_parse_error.c test_parse_roundtrip.c \
37
- test_indent.c test_typecheck.c test_numba.c test_typedef.c test_match.c test_record.c \
38
- test_buffer.c test.h alloc_fail.h \
37
+ test_indent.c test_typecheck.c test_numba.c test_typedef.c test_match.c test_unify.c \
38
+ test_record.c test_buffer.c test.h alloc_fail.h \
39
39
  $(SRCDIR)/ndtypes.h $(SRCDIR)/$(LIBSHARED)
40
40
  $(CC) -L$(SRCDIR) -DTEST_ALLOC $(NDT_CFLAGS) -o runtest_shared runtest.c \
41
41
  alloc_fail.c test_parse.c test_parse_error.c test_parse_roundtrip.c \
42
- test_indent.c test_typedef.c test_match.c test_typecheck.c test_numba.c \
43
- test_record.c test_array.c test_buffer.c -lndtypes
42
+ test_indent.c test_typedef.c test_match.c test_unify.c test_typecheck.c \
43
+ test_numba.c test_record.c test_array.c test_buffer.c -lndtypes
44
44
 
45
45
 
46
46
  FORCE: