ndtypes 0.2.0dev4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/CONTRIBUTING.md +50 -0
- data/Gemfile +2 -0
- data/History.md +0 -0
- data/README.md +19 -0
- data/Rakefile +125 -0
- data/ext/ruby_ndtypes/extconf.rb +55 -0
- data/ext/ruby_ndtypes/gc_guard.c +36 -0
- data/ext/ruby_ndtypes/gc_guard.h +12 -0
- data/ext/ruby_ndtypes/ndtypes/AUTHORS.txt +5 -0
- data/ext/ruby_ndtypes/ndtypes/INSTALL.txt +101 -0
- data/ext/ruby_ndtypes/ndtypes/LICENSE.txt +29 -0
- data/ext/ruby_ndtypes/ndtypes/MANIFEST.in +3 -0
- data/ext/ruby_ndtypes/ndtypes/Makefile.in +87 -0
- data/ext/ruby_ndtypes/ndtypes/README.rst +47 -0
- data/ext/ruby_ndtypes/ndtypes/config.guess +1530 -0
- data/ext/ruby_ndtypes/ndtypes/config.h.in +67 -0
- data/ext/ruby_ndtypes/ndtypes/config.sub +1782 -0
- data/ext/ruby_ndtypes/ndtypes/configure +5260 -0
- data/ext/ruby_ndtypes/ndtypes/configure.ac +161 -0
- data/ext/ruby_ndtypes/ndtypes/doc/Makefile +14 -0
- data/ext/ruby_ndtypes/ndtypes/doc/_static/copybutton.js +66 -0
- data/ext/ruby_ndtypes/ndtypes/doc/conf.py +26 -0
- data/ext/ruby_ndtypes/ndtypes/doc/grammar/grammar.rst +27 -0
- data/ext/ruby_ndtypes/ndtypes/doc/index.rst +56 -0
- data/ext/ruby_ndtypes/ndtypes/doc/libndtypes/context.rst +131 -0
- data/ext/ruby_ndtypes/ndtypes/doc/libndtypes/encodings.rst +68 -0
- data/ext/ruby_ndtypes/ndtypes/doc/libndtypes/fields-values.rst +175 -0
- data/ext/ruby_ndtypes/ndtypes/doc/libndtypes/functions.rst +72 -0
- data/ext/ruby_ndtypes/ndtypes/doc/libndtypes/index.rst +43 -0
- data/ext/ruby_ndtypes/ndtypes/doc/libndtypes/init.rst +48 -0
- data/ext/ruby_ndtypes/ndtypes/doc/libndtypes/io.rst +100 -0
- data/ext/ruby_ndtypes/ndtypes/doc/libndtypes/memory.rst +124 -0
- data/ext/ruby_ndtypes/ndtypes/doc/libndtypes/predicates.rst +110 -0
- data/ext/ruby_ndtypes/ndtypes/doc/libndtypes/typedef.rst +31 -0
- data/ext/ruby_ndtypes/ndtypes/doc/libndtypes/types.rst +594 -0
- data/ext/ruby_ndtypes/ndtypes/doc/libndtypes/util.rst +166 -0
- data/ext/ruby_ndtypes/ndtypes/doc/ndtypes/buffer-protocol.rst +27 -0
- data/ext/ruby_ndtypes/ndtypes/doc/ndtypes/index.rst +21 -0
- data/ext/ruby_ndtypes/ndtypes/doc/ndtypes/pattern-matching.rst +330 -0
- data/ext/ruby_ndtypes/ndtypes/doc/ndtypes/quickstart.rst +144 -0
- data/ext/ruby_ndtypes/ndtypes/doc/ndtypes/types.rst +544 -0
- data/ext/ruby_ndtypes/ndtypes/doc/releases/index.rst +35 -0
- data/ext/ruby_ndtypes/ndtypes/install-sh +527 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/Makefile.in +271 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/Makefile.vc +269 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/alloc.c +230 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/attr.c +268 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/attr.h +109 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/Makefile.in +73 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/Makefile.vc +70 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/README.txt +16 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/bpgrammar.c +2179 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/bpgrammar.h +134 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/bpgrammar.y +428 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/bplexer.c +2543 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/bplexer.h +735 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/bplexer.l +176 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/export.c +543 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/import.c +110 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/context.c +228 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/copy.c +634 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/encodings.c +116 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/equal.c +288 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/grammar.c +3067 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/grammar.h +180 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/grammar.y +417 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/io.c +1658 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/lexer.c +2773 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/lexer.h +734 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/lexer.l +222 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/match.c +1132 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/ndtypes.c +2323 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/ndtypes.h.in +893 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/overflow.h +161 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/parsefuncs.c +473 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/parsefuncs.h +92 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/parser.c +246 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/seq.c +269 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/seq.h +197 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/serialize/Makefile.in +48 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/serialize/Makefile.vc +46 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/serialize/deserialize.c +1007 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/serialize/serialize.c +442 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/slice.h +42 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/substitute.c +238 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/substitute.h +50 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/symtable.c +371 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/symtable.h +100 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/Makefile.in +55 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/Makefile.vc +45 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/alloc_fail.c +82 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/alloc_fail.h +49 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/runtest.c +1657 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test.h +85 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_array.c +115 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_buffer.c +137 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_indent.c +201 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_match.c +2397 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_numba.c +57 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_parse.c +349 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_parse_error.c +27839 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_parse_roundtrip.c +350 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_record.c +231 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_typecheck.c +375 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_typedef.c +65 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/valgrind.supp +30 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tools/bench.c +79 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tools/indent.c +94 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tools/print_ast.c +96 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/util.c +474 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/values.c +228 -0
- data/ext/ruby_ndtypes/ndtypes/python/bench.py +49 -0
- data/ext/ruby_ndtypes/ndtypes/python/ndt_randtype.py +409 -0
- data/ext/ruby_ndtypes/ndtypes/python/ndt_support.py +14 -0
- data/ext/ruby_ndtypes/ndtypes/python/ndtypes/__init__.py +70 -0
- data/ext/ruby_ndtypes/ndtypes/python/ndtypes/_ndtypes.c +1332 -0
- data/ext/ruby_ndtypes/ndtypes/python/ndtypes/docstrings.h +319 -0
- data/ext/ruby_ndtypes/ndtypes/python/ndtypes/pyndtypes.h +154 -0
- data/ext/ruby_ndtypes/ndtypes/python/test_ndtypes.py +1977 -0
- data/ext/ruby_ndtypes/ndtypes/setup.py +288 -0
- data/ext/ruby_ndtypes/ndtypes/vcbuild/INSTALL.txt +41 -0
- data/ext/ruby_ndtypes/ndtypes/vcbuild/runtest32.bat +15 -0
- data/ext/ruby_ndtypes/ndtypes/vcbuild/runtest64.bat +13 -0
- data/ext/ruby_ndtypes/ndtypes/vcbuild/vcbuild32.bat +38 -0
- data/ext/ruby_ndtypes/ndtypes/vcbuild/vcbuild64.bat +38 -0
- data/ext/ruby_ndtypes/ndtypes/vcbuild/vcclean.bat +13 -0
- data/ext/ruby_ndtypes/ndtypes/vcbuild/vcdistclean.bat +14 -0
- data/ext/ruby_ndtypes/ruby_ndtypes.c +1003 -0
- data/ext/ruby_ndtypes/ruby_ndtypes.h +37 -0
- data/ext/ruby_ndtypes/ruby_ndtypes_internal.h +28 -0
- data/lib/ndtypes.rb +45 -0
- data/lib/ndtypes/errors.rb +2 -0
- data/lib/ndtypes/version.rb +6 -0
- data/ndtypes.gemspec +47 -0
- data/spec/gc_table_spec.rb +10 -0
- data/spec/ndtypes_spec.rb +289 -0
- data/spec/spec_helper.rb +241 -0
- metadata +242 -0
@@ -0,0 +1,197 @@
|
|
1
|
+
/*
|
2
|
+
* BSD 3-Clause License
|
3
|
+
*
|
4
|
+
* Copyright (c) 2017-2018, plures
|
5
|
+
* All rights reserved.
|
6
|
+
*
|
7
|
+
* Redistribution and use in source and binary forms, with or without
|
8
|
+
* modification, are permitted provided that the following conditions are met:
|
9
|
+
*
|
10
|
+
* 1. Redistributions of source code must retain the above copyright notice,
|
11
|
+
* this list of conditions and the following disclaimer.
|
12
|
+
*
|
13
|
+
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
14
|
+
* this list of conditions and the following disclaimer in the documentation
|
15
|
+
* and/or other materials provided with the distribution.
|
16
|
+
*
|
17
|
+
* 3. Neither the name of the copyright holder nor the names of its
|
18
|
+
* contributors may be used to endorse or promote products derived from
|
19
|
+
* this software without specific prior written permission.
|
20
|
+
*
|
21
|
+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
22
|
+
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
23
|
+
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
24
|
+
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
25
|
+
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
26
|
+
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
27
|
+
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
28
|
+
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
29
|
+
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
30
|
+
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
31
|
+
*/
|
32
|
+
|
33
|
+
|
34
|
+
#ifndef SEQ_H
|
35
|
+
#define SEQ_H
|
36
|
+
|
37
|
+
|
38
|
+
#include "ndtypes.h"
|
39
|
+
|
40
|
+
|
41
|
+
/*****************************************************************************/
|
42
|
+
/* Strongly typed sequences */
|
43
|
+
/*****************************************************************************/
|
44
|
+
|
45
|
+
/* Create a new sequence with one initial element. Steal the element. */
|
46
|
+
#define NDT_SEQ_NEW(elem) \
|
47
|
+
elem##_seq_t * \
|
48
|
+
elem##_seq_new(elem##_t *elt, ndt_context_t *ctx) \
|
49
|
+
{ \
|
50
|
+
elem##_seq_t *seq; \
|
51
|
+
elem##_t *ptr; \
|
52
|
+
\
|
53
|
+
seq = ndt_alloc(1, sizeof *seq); \
|
54
|
+
if (seq == NULL) { \
|
55
|
+
elem##_del(elt); \
|
56
|
+
return ndt_memory_error(ctx); \
|
57
|
+
} \
|
58
|
+
\
|
59
|
+
ptr = ndt_alloc(2, sizeof *ptr); \
|
60
|
+
if (ptr == NULL) { \
|
61
|
+
ndt_free(seq); \
|
62
|
+
elem##_del(elt); \
|
63
|
+
return ndt_memory_error(ctx); \
|
64
|
+
} \
|
65
|
+
\
|
66
|
+
ptr[0] = *elt; \
|
67
|
+
seq->len = 1; \
|
68
|
+
seq->reserved = 2; \
|
69
|
+
seq->ptr = ptr; \
|
70
|
+
\
|
71
|
+
ndt_free(elt); \
|
72
|
+
return seq; \
|
73
|
+
}
|
74
|
+
|
75
|
+
/* Delete a sequence */
|
76
|
+
#define NDT_SEQ_DEL(elem) \
|
77
|
+
void \
|
78
|
+
elem##_seq_del(elem##_seq_t *seq) \
|
79
|
+
{ \
|
80
|
+
if (seq != NULL) { \
|
81
|
+
elem##_array_del(seq->ptr, seq->len); \
|
82
|
+
ndt_free(seq); \
|
83
|
+
} \
|
84
|
+
}
|
85
|
+
|
86
|
+
/* Grow a sequence */
|
87
|
+
#define NDT_SEQ_GROW(elem) \
|
88
|
+
static int \
|
89
|
+
elem##_seq_grow(elem##_seq_t *seq, ndt_context_t *ctx) \
|
90
|
+
{ \
|
91
|
+
elem##_t *ptr; \
|
92
|
+
\
|
93
|
+
ptr = ndt_realloc(seq->ptr, seq->reserved, 2 * (sizeof *ptr)); \
|
94
|
+
if (ptr == NULL) { \
|
95
|
+
ndt_err_format(ctx, NDT_MemoryError, "out of memory"); \
|
96
|
+
return -1; \
|
97
|
+
} \
|
98
|
+
\
|
99
|
+
seq->ptr = ptr; \
|
100
|
+
seq->reserved = 2 * seq->reserved; \
|
101
|
+
\
|
102
|
+
return 0; \
|
103
|
+
}
|
104
|
+
|
105
|
+
/* Append an element to a sequence */
|
106
|
+
#define NDT_SEQ_APPEND(elem) \
|
107
|
+
elem##_seq_t * \
|
108
|
+
elem##_seq_append(elem##_seq_t *seq, elem##_t *elt, ndt_context_t *ctx) \
|
109
|
+
{ \
|
110
|
+
assert(seq->len <= seq->reserved); \
|
111
|
+
\
|
112
|
+
if (seq->len == seq->reserved) { \
|
113
|
+
if (elem##_seq_grow(seq, ctx) < 0) { \
|
114
|
+
elem##_seq_del(seq); \
|
115
|
+
elem##_del(elt); \
|
116
|
+
return NULL; \
|
117
|
+
} \
|
118
|
+
} \
|
119
|
+
\
|
120
|
+
seq->ptr[seq->len] = *elt; \
|
121
|
+
seq->len++; \
|
122
|
+
\
|
123
|
+
ndt_free(elt); \
|
124
|
+
return seq; \
|
125
|
+
}
|
126
|
+
|
127
|
+
#define NDT_SEQ_FINALIZE(elem) \
|
128
|
+
elem##_seq_t * \
|
129
|
+
elem##_seq_finalize(elem##_seq_t *seq) \
|
130
|
+
{ \
|
131
|
+
elem##_t *ptr; \
|
132
|
+
\
|
133
|
+
if (seq == NULL) { \
|
134
|
+
return NULL; \
|
135
|
+
} \
|
136
|
+
\
|
137
|
+
assert(seq->len <= seq->reserved); \
|
138
|
+
\
|
139
|
+
ptr = ndt_realloc(seq->ptr, seq->len, sizeof *ptr); \
|
140
|
+
if (ptr == NULL) { \
|
141
|
+
return seq; /* seq is still valid */ \
|
142
|
+
} \
|
143
|
+
\
|
144
|
+
seq->ptr = ptr; \
|
145
|
+
seq->reserved = seq->len; \
|
146
|
+
\
|
147
|
+
return seq; \
|
148
|
+
}
|
149
|
+
|
150
|
+
typedef struct {
|
151
|
+
int64_t len;
|
152
|
+
int64_t reserved;
|
153
|
+
ndt_field_t *ptr;
|
154
|
+
} ndt_field_seq_t;
|
155
|
+
|
156
|
+
typedef struct {
|
157
|
+
int64_t len;
|
158
|
+
int64_t reserved;
|
159
|
+
ndt_value_t *ptr;
|
160
|
+
} ndt_value_seq_t;
|
161
|
+
|
162
|
+
typedef struct {
|
163
|
+
int64_t len;
|
164
|
+
int64_t reserved;
|
165
|
+
char **ptr;
|
166
|
+
} ndt_string_seq_t;
|
167
|
+
|
168
|
+
typedef struct {
|
169
|
+
int64_t len;
|
170
|
+
int64_t reserved;
|
171
|
+
ndt_t **ptr;
|
172
|
+
} ndt_type_seq_t;
|
173
|
+
|
174
|
+
|
175
|
+
ndt_field_seq_t *ndt_field_seq_new(ndt_field_t *, ndt_context_t *ctx);
|
176
|
+
void ndt_field_seq_del(ndt_field_seq_t *);
|
177
|
+
ndt_field_seq_t *ndt_field_seq_append(ndt_field_seq_t *, ndt_field_t *, ndt_context_t *ctx);
|
178
|
+
ndt_field_seq_t *ndt_field_seq_finalize(ndt_field_seq_t *);
|
179
|
+
|
180
|
+
ndt_value_seq_t *ndt_value_seq_new(ndt_value_t *, ndt_context_t *ctx);
|
181
|
+
void ndt_value_seq_del(ndt_value_seq_t *);
|
182
|
+
ndt_value_seq_t *ndt_value_seq_append(ndt_value_seq_t *, ndt_value_t *, ndt_context_t *ctx);
|
183
|
+
ndt_value_seq_t *ndt_value_seq_finalize(ndt_value_seq_t *);
|
184
|
+
|
185
|
+
ndt_string_seq_t *ndt_string_seq_new(char *, ndt_context_t *ctx);
|
186
|
+
void ndt_string_seq_del(ndt_string_seq_t *);
|
187
|
+
ndt_string_seq_t *ndt_string_seq_append(ndt_string_seq_t *, char *, ndt_context_t *ctx);
|
188
|
+
ndt_string_seq_t *ndt_string_seq_finalize(ndt_string_seq_t *);
|
189
|
+
|
190
|
+
ndt_type_seq_t *ndt_type_seq_empty(ndt_context_t *ctx);
|
191
|
+
ndt_type_seq_t *ndt_type_seq_new(ndt_t *, ndt_context_t *ctx);
|
192
|
+
void ndt_type_seq_del(ndt_type_seq_t *);
|
193
|
+
ndt_type_seq_t *ndt_type_seq_append(ndt_type_seq_t *, ndt_t *, ndt_context_t *ctx);
|
194
|
+
ndt_type_seq_t *ndt_type_seq_finalize(ndt_type_seq_t *);
|
195
|
+
|
196
|
+
|
197
|
+
#endif /* SEQ_H */
|
@@ -0,0 +1,48 @@
|
|
1
|
+
|
2
|
+
CC = @CC@
|
3
|
+
LD = @LD@
|
4
|
+
|
5
|
+
CONFIGURE_CFLAGS = @CONFIGURE_CFLAGS@
|
6
|
+
NDT_CFLAGS = $(strip $(CONFIGURE_CFLAGS) $(CFLAGS))
|
7
|
+
NDT_CFLAGS_SHARED = $(NDT_CFLAGS) -fPIC
|
8
|
+
|
9
|
+
CONFIGURE_COV_CFLAGS = @CONFIGURE_COV_CFLAGS@
|
10
|
+
ifeq ($(MAKECMDGOALS), coverage)
|
11
|
+
NDT_CFLAGS = $(strip $(CONFIGURE_COV_CFLAGS) $(CFLAGS))
|
12
|
+
endif
|
13
|
+
|
14
|
+
|
15
|
+
OBJS = serialize.o deserialize.o
|
16
|
+
SHARED_OBJS = .objs/serialize.o .objs/deserialize.o
|
17
|
+
|
18
|
+
|
19
|
+
default: $(OBJS) $(SHARED_OBJS)
|
20
|
+
|
21
|
+
|
22
|
+
serialize.o:\
|
23
|
+
Makefile serialize.c ../ndtypes.h
|
24
|
+
$(CC) $(NDT_CFLAGS) -c serialize.c
|
25
|
+
|
26
|
+
.objs/serialize.o:\
|
27
|
+
Makefile serialize.c ../ndtypes.h
|
28
|
+
$(CC) $(NDT_CFLAGS_SHARED) -c serialize.c -o .objs/serialize.o
|
29
|
+
|
30
|
+
deserialize.o:\
|
31
|
+
Makefile deserialize.c ../ndtypes.h
|
32
|
+
$(CC) $(NDT_CFLAGS) -c deserialize.c
|
33
|
+
|
34
|
+
.objs/deserialize.o:\
|
35
|
+
Makefile deserialize.c ../ndtypes.h
|
36
|
+
$(CC) $(NDT_CFLAGS_SHARED) -c deserialize.c -o .objs/deserialize.o
|
37
|
+
|
38
|
+
|
39
|
+
FORCE:
|
40
|
+
|
41
|
+
clean: FORCE
|
42
|
+
rm -f *.o *.so *.gch *.gcda *.gcno *.gcov *.dyn *.dpi *.lock
|
43
|
+
cd .objs && rm -f *.o *.so *.gch *.gcda *.gcno *.gcov *.dyn *.dpi *.lock
|
44
|
+
|
45
|
+
distclean: clean
|
46
|
+
rm -f Makefile
|
47
|
+
|
48
|
+
|
@@ -0,0 +1,46 @@
|
|
1
|
+
|
2
|
+
SRCDIR = ..
|
3
|
+
|
4
|
+
OPT = /MT /Ox /GS /EHsc
|
5
|
+
OPT_SHARED = /DNDT_EXPORT /MD /Ox /GS /EHsc /Fo.objs^\
|
6
|
+
|
7
|
+
COMMON_CFLAGS = -I$(SRCDIR) /nologo /W4 /wd4200 /wd4201 /wd4204 /D_CRT_SECURE_NO_WARNINGS
|
8
|
+
|
9
|
+
CFLAGS = $(COMMON_CFLAGS) $(OPT)
|
10
|
+
CFLAGS_SHARED = $(COMMON_CFLAGS) $(OPT_SHARED)
|
11
|
+
|
12
|
+
|
13
|
+
OBJS = serialize.obj deserialize.obj
|
14
|
+
SHARED_OBJS = .objs\serialize.obj .objs\deserialize.obj
|
15
|
+
|
16
|
+
|
17
|
+
default: $(OBJS) $(SHARED_OBJS)
|
18
|
+
|
19
|
+
|
20
|
+
serialize.obj:\
|
21
|
+
Makefile serialize.c ..\ndtypes.h
|
22
|
+
$(CC) $(CFLAGS) -c serialize.c
|
23
|
+
|
24
|
+
.objs\serialize.obj:\
|
25
|
+
Makefile serialize.c ..\ndtypes.h
|
26
|
+
$(CC) $(CFLAGS_SHARED) -c serialize.c
|
27
|
+
|
28
|
+
deserialize.obj:\
|
29
|
+
Makefile deserialize.c ..\ndtypes.h
|
30
|
+
$(CC) $(CFLAGS) -c deserialize.c
|
31
|
+
|
32
|
+
.objs\deserialize.obj:\
|
33
|
+
Makefile deserialize.c ..\ndtypes.h
|
34
|
+
$(CC) $(CFLAGS_SHARED) -c deserialize.c
|
35
|
+
|
36
|
+
|
37
|
+
FORCE:
|
38
|
+
|
39
|
+
clean: FORCE
|
40
|
+
del /q /f *.exe *.obj *.lib *.dll *.exp *.manifest 2>NUL
|
41
|
+
cd .objs && del /q /f *.obj 2>NUL
|
42
|
+
|
43
|
+
distclean: clean
|
44
|
+
del Makefile 2>NUL
|
45
|
+
|
46
|
+
|
@@ -0,0 +1,1007 @@
|
|
1
|
+
/*
|
2
|
+
* BSD 3-Clause License
|
3
|
+
*
|
4
|
+
* Copyright (c) 2017-2018, plures
|
5
|
+
* All rights reserved.
|
6
|
+
*
|
7
|
+
* Redistribution and use in source and binary forms, with or without
|
8
|
+
* modification, are permitted provided that the following conditions are met:
|
9
|
+
*
|
10
|
+
* 1. Redistributions of source code must retain the above copyright notice,
|
11
|
+
* this list of conditions and the following disclaimer.
|
12
|
+
*
|
13
|
+
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
14
|
+
* this list of conditions and the following disclaimer in the documentation
|
15
|
+
* and/or other materials provided with the distribution.
|
16
|
+
*
|
17
|
+
* 3. Neither the name of the copyright holder nor the names of its
|
18
|
+
* contributors may be used to endorse or promote products derived from
|
19
|
+
* this software without specific prior written permission.
|
20
|
+
*
|
21
|
+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
22
|
+
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
23
|
+
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
24
|
+
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
25
|
+
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
26
|
+
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
27
|
+
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
28
|
+
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
29
|
+
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
30
|
+
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
31
|
+
*/
|
32
|
+
|
33
|
+
|
34
|
+
#include <stdlib.h>
|
35
|
+
#include <stdint.h>
|
36
|
+
#include <inttypes.h>
|
37
|
+
#include <string.h>
|
38
|
+
#include <assert.h>
|
39
|
+
#include "ndtypes.h"
|
40
|
+
#include "overflow.h"
|
41
|
+
|
42
|
+
|
43
|
+
static ndt_t *read_type(ndt_meta_t *m, const char * const ptr, int64_t offset,
|
44
|
+
const int64_t len, ndt_context_t *ctx);
|
45
|
+
|
46
|
+
|
47
|
+
|
48
|
+
typedef double float64_t;
|
49
|
+
typedef bool bool_t;
|
50
|
+
|
51
|
+
typedef enum ndt ndt_tag;
|
52
|
+
typedef enum ndt_access ndt_access;
|
53
|
+
typedef enum ndt_variadic ndt_variadic;
|
54
|
+
typedef enum ndt_encoding ndt_encoding;
|
55
|
+
typedef enum ndt_value ndt_value;
|
56
|
+
typedef enum ndt_contig ndt_contig;
|
57
|
+
|
58
|
+
typedef struct {
|
59
|
+
enum ndt tag;
|
60
|
+
enum ndt_access access;
|
61
|
+
uint32_t flags;
|
62
|
+
int ndim;
|
63
|
+
int64_t datasize;
|
64
|
+
uint16_t align;
|
65
|
+
} common_t;
|
66
|
+
|
67
|
+
|
68
|
+
/*****************************************************************************/
|
69
|
+
/* Read values from the bytes buffer */
|
70
|
+
/*****************************************************************************/
|
71
|
+
|
72
|
+
static inline int64_t
|
73
|
+
next_offset(const int64_t offset, const size_t size, const int64_t len,
|
74
|
+
ndt_context_t *ctx)
|
75
|
+
{
|
76
|
+
bool overflow = 0;
|
77
|
+
int64_t next;
|
78
|
+
|
79
|
+
next = ADDi64(offset, (int64_t)size, &overflow);
|
80
|
+
if (overflow || next > len) {
|
81
|
+
ndt_err_format(ctx, NDT_ValueError,
|
82
|
+
"buffer overflow in type deserialization");
|
83
|
+
return -1;
|
84
|
+
}
|
85
|
+
|
86
|
+
return next;
|
87
|
+
}
|
88
|
+
|
89
|
+
static inline size_t
|
90
|
+
array_size(const int64_t nmemb, const size_t size, ndt_context_t *ctx)
|
91
|
+
{
|
92
|
+
bool overflow = 0;
|
93
|
+
size_t array_size;
|
94
|
+
|
95
|
+
array_size = MULi64_size(nmemb, (int64_t)size, &overflow);
|
96
|
+
if (nmemb < 0 || overflow) {
|
97
|
+
ndt_err_format(ctx, NDT_ValueError,
|
98
|
+
"corrupted data or buffer overflow in type deserialization");
|
99
|
+
return SIZE_MAX;
|
100
|
+
}
|
101
|
+
|
102
|
+
return array_size;
|
103
|
+
}
|
104
|
+
|
105
|
+
static inline int64_t
|
106
|
+
string_size(const char * const ptr, const int64_t offset, const int64_t len,
|
107
|
+
ndt_context_t *ctx)
|
108
|
+
{
|
109
|
+
const int64_t n = len-offset;
|
110
|
+
const char *end = memchr(ptr+offset, '\0', (size_t)n);
|
111
|
+
|
112
|
+
if (end == NULL) {
|
113
|
+
ndt_err_format(ctx, NDT_ValueError,
|
114
|
+
"buffer overflow in type deserialization");
|
115
|
+
return -1;
|
116
|
+
}
|
117
|
+
|
118
|
+
return end-(ptr+offset)+1;
|
119
|
+
}
|
120
|
+
|
121
|
+
#define READ(type) \
|
122
|
+
static inline int64_t \
|
123
|
+
read_##type(type##_t * const value, const char * const ptr, \
|
124
|
+
const int64_t offset, const int64_t len, \
|
125
|
+
ndt_context_t *ctx ) \
|
126
|
+
{ \
|
127
|
+
const size_t size = sizeof(type##_t); \
|
128
|
+
const int64_t next = next_offset(offset, size, len, ctx); \
|
129
|
+
if (next < 0) { \
|
130
|
+
return -1; \
|
131
|
+
} \
|
132
|
+
\
|
133
|
+
memcpy(value, ptr+offset, size); \
|
134
|
+
return next; \
|
135
|
+
}
|
136
|
+
|
137
|
+
#define READ_POS(type) \
|
138
|
+
static inline int64_t \
|
139
|
+
read_pos_##type(type##_t * const value, const char * const ptr, \
|
140
|
+
const int64_t offset, const int64_t len, \
|
141
|
+
ndt_context_t *ctx) \
|
142
|
+
{ \
|
143
|
+
const size_t size = sizeof(type##_t); \
|
144
|
+
const int64_t next = next_offset(offset, size, len, ctx); \
|
145
|
+
if (next < 0) { \
|
146
|
+
return -1; \
|
147
|
+
} \
|
148
|
+
\
|
149
|
+
memcpy(value, ptr+offset, size); \
|
150
|
+
if (*value < 0) { \
|
151
|
+
ndt_err_format(ctx, NDT_ValueError, \
|
152
|
+
"unexpected negative value in deserialization (corrupt data?)"); \
|
153
|
+
return -1; \
|
154
|
+
} \
|
155
|
+
return next; \
|
156
|
+
}
|
157
|
+
|
158
|
+
#define READ_CAST(dtype, stype) \
|
159
|
+
static inline int64_t \
|
160
|
+
dtype##_from_##stype(dtype * const value, const char * const ptr, \
|
161
|
+
const int64_t offset, const int64_t len, \
|
162
|
+
ndt_context_t *ctx) \
|
163
|
+
{ \
|
164
|
+
stype##_t x; \
|
165
|
+
const size_t size = sizeof x; \
|
166
|
+
const int64_t next = next_offset(offset, size, len, ctx); \
|
167
|
+
if (next < 0) { \
|
168
|
+
return -1; \
|
169
|
+
} \
|
170
|
+
\
|
171
|
+
memcpy(&x, ptr+offset, size); \
|
172
|
+
*value = (dtype)x; \
|
173
|
+
return next; \
|
174
|
+
}
|
175
|
+
|
176
|
+
#define READ_ARRAY(type) \
|
177
|
+
static inline int64_t \
|
178
|
+
read_##type##_array(type##_t * const v, const int64_t nmemb, \
|
179
|
+
const char * const ptr, const int64_t offset, \
|
180
|
+
const int64_t len, ndt_context_t *ctx) \
|
181
|
+
{ \
|
182
|
+
const size_t size = array_size(nmemb, sizeof(type##_t), ctx); \
|
183
|
+
if (size == SIZE_MAX) { \
|
184
|
+
return -1; \
|
185
|
+
} \
|
186
|
+
\
|
187
|
+
const int64_t next = next_offset(offset, size, len, ctx); \
|
188
|
+
if (next < 0) { \
|
189
|
+
return -1; \
|
190
|
+
} \
|
191
|
+
\
|
192
|
+
memcpy(v, ptr+offset, size); \
|
193
|
+
return next; \
|
194
|
+
}
|
195
|
+
|
196
|
+
READ_CAST(ndt_tag, uint8)
|
197
|
+
READ_CAST(ndt_access, uint8)
|
198
|
+
READ_CAST(ndt_variadic, uint8)
|
199
|
+
READ_CAST(ndt_encoding, uint8)
|
200
|
+
READ_CAST(ndt_value, uint8)
|
201
|
+
READ_CAST(bool, uint8)
|
202
|
+
READ_CAST(ndt_contig, uint8)
|
203
|
+
|
204
|
+
READ_POS(int64)
|
205
|
+
READ_POS(int32)
|
206
|
+
|
207
|
+
READ(uint16)
|
208
|
+
READ(uint32)
|
209
|
+
READ(int64)
|
210
|
+
READ(float64)
|
211
|
+
READ_ARRAY(uint16)
|
212
|
+
READ_ARRAY(int32)
|
213
|
+
READ_ARRAY(int64)
|
214
|
+
READ_ARRAY(ndt_slice)
|
215
|
+
|
216
|
+
static inline int64_t
|
217
|
+
next_metaoffset(int64_t *offset, const char * const ptr,
|
218
|
+
int64_t metaoffset, const int64_t len,
|
219
|
+
ndt_context_t *ctx)
|
220
|
+
{
|
221
|
+
metaoffset = read_pos_int64(offset, ptr, metaoffset, len, ctx);
|
222
|
+
if (metaoffset < 0 || *offset >= len) {
|
223
|
+
ndt_err_format(ctx, NDT_ValueError,
|
224
|
+
"corrupt data or buffer overflow in type deserialization");
|
225
|
+
return -1;
|
226
|
+
}
|
227
|
+
|
228
|
+
return metaoffset;
|
229
|
+
}
|
230
|
+
|
231
|
+
|
232
|
+
/*****************************************************************************/
|
233
|
+
/* Deserialize types */
|
234
|
+
/*****************************************************************************/
|
235
|
+
|
236
|
+
static void
|
237
|
+
copy_common(ndt_t *t, const common_t *f)
|
238
|
+
{
|
239
|
+
t->tag = f->tag;
|
240
|
+
t->access = f->access;
|
241
|
+
t->flags = f->flags;
|
242
|
+
t->ndim = f->ndim;
|
243
|
+
t->datasize = f->datasize;
|
244
|
+
t->align = f->align;
|
245
|
+
}
|
246
|
+
|
247
|
+
static ndt_t *
|
248
|
+
new_copy_common(const common_t *f, ndt_context_t *ctx)
|
249
|
+
{
|
250
|
+
ndt_t *t = ndt_new(f->tag, ctx);
|
251
|
+
if (t == NULL) {
|
252
|
+
return NULL;
|
253
|
+
}
|
254
|
+
|
255
|
+
copy_common(t, f);
|
256
|
+
return t;
|
257
|
+
}
|
258
|
+
|
259
|
+
static int64_t
|
260
|
+
read_string(char **dest, const char * const ptr, const int64_t offset,
|
261
|
+
const int64_t len, ndt_context_t *ctx)
|
262
|
+
{
|
263
|
+
const int64_t size = string_size(ptr, offset, len, ctx);
|
264
|
+
if (size < 0) {
|
265
|
+
return -1;
|
266
|
+
}
|
267
|
+
|
268
|
+
*dest = ndt_strdup(ptr+offset, ctx);
|
269
|
+
if (*dest == NULL) {
|
270
|
+
return -1;
|
271
|
+
}
|
272
|
+
|
273
|
+
return offset + size;
|
274
|
+
}
|
275
|
+
|
276
|
+
static int64_t
|
277
|
+
read_string_array(char *s[], int64_t shape, const char * const ptr,
|
278
|
+
int64_t offset, const int64_t len,
|
279
|
+
ndt_context_t *ctx)
|
280
|
+
{
|
281
|
+
for (int64_t i = 0; i < shape; i++) {
|
282
|
+
offset = read_string(&s[i], ptr, offset, len, ctx);
|
283
|
+
if (offset < 0) {
|
284
|
+
for (int64_t k = 0; k < i; k++) {
|
285
|
+
ndt_free(s[k]);
|
286
|
+
s[k] = NULL;
|
287
|
+
}
|
288
|
+
return -1;
|
289
|
+
}
|
290
|
+
}
|
291
|
+
|
292
|
+
return offset;
|
293
|
+
}
|
294
|
+
|
295
|
+
static inline int64_t
|
296
|
+
read_ndt_value_array(ndt_value_t *v, const int64_t nmemb,
|
297
|
+
const char * const ptr,
|
298
|
+
int64_t offset, const int64_t len,
|
299
|
+
ndt_context_t *ctx)
|
300
|
+
{
|
301
|
+
for (int64_t i = 0; i < nmemb; i++) {
|
302
|
+
offset = ndt_value_from_uint8(&v[i].tag, ptr, offset, len, ctx);
|
303
|
+
if (offset < 0) return -1;
|
304
|
+
|
305
|
+
switch (v[i].tag) {
|
306
|
+
case ValNA:
|
307
|
+
break;
|
308
|
+
case ValBool:
|
309
|
+
offset = bool_from_uint8(&v[i].ValBool, ptr, offset, len, ctx);
|
310
|
+
if (offset < 0) return -1;
|
311
|
+
break;
|
312
|
+
case ValInt64:
|
313
|
+
offset = read_int64(&v[i].ValInt64, ptr, offset, len, ctx);
|
314
|
+
if (offset < 0) return -1;
|
315
|
+
break;
|
316
|
+
case ValFloat64:
|
317
|
+
offset = read_float64(&v[i].ValFloat64, ptr, offset, len, ctx);
|
318
|
+
if (offset < 0) return -1;
|
319
|
+
break;
|
320
|
+
case ValString:
|
321
|
+
offset = read_string(&v[i].ValString, ptr, offset, len, ctx);
|
322
|
+
if (offset < 0) return -1;
|
323
|
+
break;
|
324
|
+
}
|
325
|
+
}
|
326
|
+
|
327
|
+
return offset;
|
328
|
+
}
|
329
|
+
|
330
|
+
static int64_t
|
331
|
+
read_common_fields(common_t *fields, const char * const ptr,
|
332
|
+
int64_t offset, const int64_t len,
|
333
|
+
ndt_context_t *ctx)
|
334
|
+
{
|
335
|
+
offset = ndt_tag_from_uint8(&fields->tag, ptr, offset, len, ctx);
|
336
|
+
if (offset < 0) return -1;
|
337
|
+
|
338
|
+
offset = ndt_access_from_uint8(&fields->access, ptr, offset, len, ctx);
|
339
|
+
if (offset < 0) return -1;
|
340
|
+
|
341
|
+
offset = read_uint32(&fields->flags, ptr, offset, len, ctx);
|
342
|
+
if (offset < 0) return -1;
|
343
|
+
|
344
|
+
offset = read_pos_int32(&fields->ndim, ptr, offset, len, ctx);
|
345
|
+
if (offset < 0) return -1;
|
346
|
+
|
347
|
+
offset = read_pos_int64(&fields->datasize, ptr, offset, len, ctx);
|
348
|
+
if (offset < 0) return -1;
|
349
|
+
|
350
|
+
return read_uint16(&fields->align, ptr, offset, len, ctx);
|
351
|
+
}
|
352
|
+
|
353
|
+
static ndt_t *
|
354
|
+
read_module(ndt_meta_t *m, const common_t *fields, const char * const ptr,
|
355
|
+
int64_t offset, const int64_t len, ndt_context_t *ctx)
|
356
|
+
{
|
357
|
+
char *name;
|
358
|
+
ndt_t *type;
|
359
|
+
ndt_t *t;
|
360
|
+
|
361
|
+
offset = read_string(&name, ptr, offset, len, ctx);
|
362
|
+
if (offset < 0) {
|
363
|
+
return NULL;
|
364
|
+
}
|
365
|
+
|
366
|
+
type = read_type(m, ptr, offset, len, ctx);
|
367
|
+
if (type == NULL) {
|
368
|
+
ndt_free(name);
|
369
|
+
return NULL;
|
370
|
+
}
|
371
|
+
|
372
|
+
t = new_copy_common(fields, ctx);
|
373
|
+
if (t == NULL) {
|
374
|
+
ndt_del(type);
|
375
|
+
ndt_free(name);
|
376
|
+
return NULL;
|
377
|
+
}
|
378
|
+
t->Module.name = name;
|
379
|
+
t->Module.type = type;
|
380
|
+
|
381
|
+
return t;
|
382
|
+
}
|
383
|
+
|
384
|
+
static ndt_t *
|
385
|
+
read_function(ndt_meta_t *m, common_t *fields, const char * const ptr,
|
386
|
+
int64_t offset, const int64_t len, ndt_context_t *ctx)
|
387
|
+
{
|
388
|
+
int64_t metaoffset;
|
389
|
+
int64_t nin;
|
390
|
+
int64_t nout;
|
391
|
+
int64_t nargs;
|
392
|
+
ndt_t *t;
|
393
|
+
|
394
|
+
offset = read_pos_int64(&nin, ptr, offset, len, ctx);
|
395
|
+
if (offset < 0) return NULL;
|
396
|
+
|
397
|
+
offset = read_pos_int64(&nout, ptr, offset, len, ctx);
|
398
|
+
if (offset < 0) return NULL;
|
399
|
+
|
400
|
+
offset = read_pos_int64(&nargs, ptr, offset, len, ctx);
|
401
|
+
if (offset < 0) return NULL;
|
402
|
+
|
403
|
+
|
404
|
+
t = ndt_function_new(nargs, ctx);
|
405
|
+
if (t == NULL) {
|
406
|
+
return NULL;
|
407
|
+
}
|
408
|
+
copy_common(t, fields);
|
409
|
+
|
410
|
+
metaoffset = offset;
|
411
|
+
for (int64_t i = 0; i < nargs; i++) {
|
412
|
+
metaoffset = next_metaoffset(&offset, ptr, metaoffset, len, ctx);
|
413
|
+
if (metaoffset < 0) return NULL;
|
414
|
+
|
415
|
+
t->Function.types[i] = read_type(m, ptr, offset, len, ctx);
|
416
|
+
if (t->Function.types[i] == NULL) {
|
417
|
+
ndt_del(t);
|
418
|
+
return NULL;
|
419
|
+
}
|
420
|
+
}
|
421
|
+
|
422
|
+
t->Function.nin = nin;
|
423
|
+
t->Function.nout = nout;
|
424
|
+
|
425
|
+
return t;
|
426
|
+
}
|
427
|
+
|
428
|
+
static ndt_t *
|
429
|
+
read_fixed_dim(ndt_meta_t *m, const common_t *fields, const char * const ptr,
|
430
|
+
int64_t offset, const int64_t len, ndt_context_t *ctx)
|
431
|
+
{
|
432
|
+
ndt_contig tag;
|
433
|
+
int64_t shape;
|
434
|
+
int64_t step;
|
435
|
+
int64_t itemsize;
|
436
|
+
ndt_t *type;
|
437
|
+
ndt_t *t;
|
438
|
+
|
439
|
+
offset = ndt_contig_from_uint8(&tag, ptr, offset, len, ctx);
|
440
|
+
if (offset < 0) return NULL;
|
441
|
+
|
442
|
+
offset = read_pos_int64(&shape, ptr, offset, len, ctx);
|
443
|
+
if (offset < 0) return NULL;
|
444
|
+
|
445
|
+
offset = read_int64(&step, ptr, offset, len, ctx);
|
446
|
+
if (offset < 0) return NULL;
|
447
|
+
|
448
|
+
offset = read_pos_int64(&itemsize, ptr, offset, len, ctx);
|
449
|
+
if (offset < 0) return NULL;
|
450
|
+
|
451
|
+
type = read_type(m, ptr, offset, len, ctx);
|
452
|
+
if (type == NULL) {
|
453
|
+
return NULL;
|
454
|
+
}
|
455
|
+
|
456
|
+
t = new_copy_common(fields, ctx);
|
457
|
+
if (t == NULL) {
|
458
|
+
ndt_del(type);
|
459
|
+
return NULL;
|
460
|
+
}
|
461
|
+
t->FixedDim.tag = tag;
|
462
|
+
t->FixedDim.shape = shape;
|
463
|
+
t->FixedDim.type = type;
|
464
|
+
t->Concrete.FixedDim.step = step;
|
465
|
+
t->Concrete.FixedDim.itemsize = itemsize;
|
466
|
+
|
467
|
+
return t;
|
468
|
+
}
|
469
|
+
|
470
|
+
static ndt_t *
|
471
|
+
read_symbolic_dim(ndt_meta_t *m, const common_t *fields, const char * const ptr,
|
472
|
+
int64_t offset, const int64_t len, ndt_context_t *ctx)
|
473
|
+
{
|
474
|
+
ndt_contig tag;
|
475
|
+
char *name;
|
476
|
+
ndt_t *type;
|
477
|
+
ndt_t *t;
|
478
|
+
|
479
|
+
offset = ndt_contig_from_uint8(&tag, ptr, offset, len, ctx);
|
480
|
+
if (offset < 0) {
|
481
|
+
return NULL;
|
482
|
+
}
|
483
|
+
|
484
|
+
offset = read_string(&name, ptr, offset, len, ctx);
|
485
|
+
if (offset < 0) {
|
486
|
+
return NULL;
|
487
|
+
}
|
488
|
+
|
489
|
+
type = read_type(m, ptr, offset, len, ctx);
|
490
|
+
if (type == NULL) {
|
491
|
+
ndt_free(name);
|
492
|
+
return NULL;
|
493
|
+
}
|
494
|
+
|
495
|
+
t = new_copy_common(fields, ctx);
|
496
|
+
if (t == NULL) {
|
497
|
+
ndt_del(type);
|
498
|
+
ndt_free(name);
|
499
|
+
return NULL;
|
500
|
+
}
|
501
|
+
t->SymbolicDim.tag = tag;
|
502
|
+
t->SymbolicDim.name = name;
|
503
|
+
t->SymbolicDim.type = type;
|
504
|
+
|
505
|
+
return t;
|
506
|
+
}
|
507
|
+
|
508
|
+
static ndt_t *
|
509
|
+
read_ellipsis_dim(ndt_meta_t *m, const common_t *fields, const char * const ptr,
|
510
|
+
int64_t offset, const int64_t len, ndt_context_t *ctx)
|
511
|
+
{
|
512
|
+
ndt_contig tag;
|
513
|
+
char *name;
|
514
|
+
ndt_t *type;
|
515
|
+
ndt_t *t;
|
516
|
+
|
517
|
+
offset = ndt_contig_from_uint8(&tag, ptr, offset, len, ctx);
|
518
|
+
if (offset < 0) {
|
519
|
+
return NULL;
|
520
|
+
}
|
521
|
+
|
522
|
+
offset = read_string(&name, ptr, offset, len, ctx);
|
523
|
+
if (offset < 0) {
|
524
|
+
return NULL;
|
525
|
+
}
|
526
|
+
if (name[0] == '\0') {
|
527
|
+
ndt_free(name);
|
528
|
+
name = NULL;
|
529
|
+
}
|
530
|
+
|
531
|
+
type = read_type(m, ptr, offset, len, ctx);
|
532
|
+
if (type == NULL) {
|
533
|
+
ndt_free(name);
|
534
|
+
return NULL;
|
535
|
+
}
|
536
|
+
|
537
|
+
t = new_copy_common(fields, ctx);
|
538
|
+
if (t == NULL) {
|
539
|
+
ndt_del(type);
|
540
|
+
ndt_free(name);
|
541
|
+
return NULL;
|
542
|
+
}
|
543
|
+
t->EllipsisDim.tag = tag;
|
544
|
+
t->EllipsisDim.name = name;
|
545
|
+
t->EllipsisDim.type = type;
|
546
|
+
|
547
|
+
return t;
|
548
|
+
}
|
549
|
+
|
550
|
+
static ndt_t *
|
551
|
+
read_var_dim(ndt_meta_t *m, const common_t *fields, const char * const ptr,
|
552
|
+
int64_t offset, const int64_t len, ndt_context_t *ctx)
|
553
|
+
{
|
554
|
+
int64_t itemsize;
|
555
|
+
int32_t noffsets;
|
556
|
+
int32_t *offsets;
|
557
|
+
int32_t nslices = 0;
|
558
|
+
ndt_slice_t *slices = NULL;
|
559
|
+
ndt_t *type;
|
560
|
+
ndt_t *t;
|
561
|
+
|
562
|
+
offset = read_pos_int64(&itemsize, ptr, offset, len, ctx);
|
563
|
+
if (offset < 0) return NULL;
|
564
|
+
|
565
|
+
offset = read_pos_int32(&noffsets, ptr, offset, len, ctx);
|
566
|
+
if (offset < 0) return NULL;
|
567
|
+
|
568
|
+
offset = read_pos_int32(&nslices, ptr, offset, len, ctx);
|
569
|
+
if (offset < 0) return NULL;
|
570
|
+
|
571
|
+
offsets = ndt_alloc(noffsets, sizeof *offsets);
|
572
|
+
if (offsets == NULL) {
|
573
|
+
return ndt_memory_error(ctx);
|
574
|
+
}
|
575
|
+
|
576
|
+
offset = read_int32_array(offsets, noffsets, ptr, offset, len, ctx);
|
577
|
+
if (offset < 0) {
|
578
|
+
ndt_free(offsets);
|
579
|
+
return NULL;
|
580
|
+
}
|
581
|
+
|
582
|
+
slices = ndt_alloc(nslices, sizeof *slices);
|
583
|
+
if (slices == NULL) {
|
584
|
+
ndt_free(offsets);
|
585
|
+
return ndt_memory_error(ctx);
|
586
|
+
}
|
587
|
+
|
588
|
+
offset = read_ndt_slice_array(slices, nslices, ptr, offset, len, ctx);
|
589
|
+
if (offset < 0) {
|
590
|
+
ndt_free(offsets);
|
591
|
+
ndt_free(slices);
|
592
|
+
return NULL;
|
593
|
+
}
|
594
|
+
|
595
|
+
if (nslices == 0) {
|
596
|
+
ndt_free(slices);
|
597
|
+
slices = NULL;
|
598
|
+
}
|
599
|
+
|
600
|
+
type = read_type(m, ptr, offset, len, ctx);
|
601
|
+
if (type == NULL) {
|
602
|
+
ndt_free(offsets);
|
603
|
+
ndt_free(slices);
|
604
|
+
return NULL;
|
605
|
+
}
|
606
|
+
|
607
|
+
t = new_copy_common(fields, ctx);
|
608
|
+
if (t == NULL) {
|
609
|
+
ndt_free(offsets);
|
610
|
+
ndt_free(slices);
|
611
|
+
ndt_del(type);
|
612
|
+
return NULL;
|
613
|
+
}
|
614
|
+
t->VarDim.type = type;
|
615
|
+
t->Concrete.VarDim.flag = ExternalOffsets;
|
616
|
+
t->Concrete.VarDim.itemsize = itemsize;
|
617
|
+
t->Concrete.VarDim.noffsets = noffsets;
|
618
|
+
t->Concrete.VarDim.offsets = offsets;
|
619
|
+
t->Concrete.VarDim.nslices = nslices;
|
620
|
+
t->Concrete.VarDim.slices = slices;
|
621
|
+
|
622
|
+
m->noffsets[m->ndims] = noffsets;
|
623
|
+
m->offsets[m->ndims] = offsets;
|
624
|
+
m->ndims++;
|
625
|
+
|
626
|
+
return t;
|
627
|
+
}
|
628
|
+
|
629
|
+
static ndt_t *
|
630
|
+
read_tuple(ndt_meta_t *m, const common_t *fields, const char * const ptr,
|
631
|
+
int64_t offset, const int64_t len, ndt_context_t *ctx)
|
632
|
+
{
|
633
|
+
int64_t metaoffset;
|
634
|
+
enum ndt_variadic flag;
|
635
|
+
int64_t shape;
|
636
|
+
ndt_t *t;
|
637
|
+
|
638
|
+
offset = ndt_variadic_from_uint8(&flag, ptr, offset, len, ctx);
|
639
|
+
if (offset < 0) return NULL;
|
640
|
+
|
641
|
+
offset = read_pos_int64(&shape, ptr, offset, len, ctx);
|
642
|
+
if (offset < 0) return NULL;
|
643
|
+
|
644
|
+
t = ndt_tuple_new(flag, shape, ctx);
|
645
|
+
if (t == NULL) {
|
646
|
+
return NULL;
|
647
|
+
}
|
648
|
+
copy_common(t, fields);
|
649
|
+
|
650
|
+
offset = read_int64_array(t->Concrete.Tuple.offset, shape, ptr, offset, len, ctx);
|
651
|
+
if (offset < 0) goto error;
|
652
|
+
|
653
|
+
offset = read_uint16_array(t->Concrete.Tuple.align, shape, ptr, offset, len, ctx);
|
654
|
+
if (offset < 0) goto error;
|
655
|
+
|
656
|
+
offset = read_uint16_array(t->Concrete.Tuple.pad, shape, ptr, offset, len, ctx);
|
657
|
+
if (offset < 0) goto error;
|
658
|
+
|
659
|
+
metaoffset = offset;
|
660
|
+
for (int64_t i = 0; i < shape; i++) {
|
661
|
+
metaoffset = next_metaoffset(&offset, ptr, metaoffset, len, ctx);
|
662
|
+
if (metaoffset < 0) goto error;
|
663
|
+
|
664
|
+
t->Tuple.types[i] = read_type(m, ptr, offset, len, ctx);
|
665
|
+
if (t->Tuple.types[i] == NULL) {
|
666
|
+
goto error;
|
667
|
+
}
|
668
|
+
}
|
669
|
+
|
670
|
+
return t;
|
671
|
+
|
672
|
+
error:
|
673
|
+
ndt_del(t);
|
674
|
+
return NULL;
|
675
|
+
}
|
676
|
+
|
677
|
+
static ndt_t *
|
678
|
+
read_record(ndt_meta_t *m, const common_t *fields, const char * const ptr,
|
679
|
+
int64_t offset, const int64_t len, ndt_context_t *ctx)
|
680
|
+
{
|
681
|
+
int64_t metaoffset;
|
682
|
+
enum ndt_variadic flag;
|
683
|
+
int64_t shape;
|
684
|
+
ndt_t *t;
|
685
|
+
|
686
|
+
offset = ndt_variadic_from_uint8(&flag, ptr, offset, len, ctx);
|
687
|
+
if (offset < 0) return NULL;
|
688
|
+
|
689
|
+
offset = read_pos_int64(&shape, ptr, offset, len, ctx);
|
690
|
+
if (offset < 0) return NULL;
|
691
|
+
|
692
|
+
t = ndt_record_new(flag, shape, ctx);
|
693
|
+
if (t == NULL) {
|
694
|
+
return NULL;
|
695
|
+
}
|
696
|
+
copy_common(t, fields);
|
697
|
+
|
698
|
+
offset = read_int64_array(t->Concrete.Record.offset, shape, ptr, offset, len, ctx);
|
699
|
+
if (offset < 0) goto error;
|
700
|
+
|
701
|
+
offset = read_uint16_array(t->Concrete.Record.align, shape, ptr, offset, len, ctx);
|
702
|
+
if (offset < 0) goto error;
|
703
|
+
|
704
|
+
offset = read_uint16_array(t->Concrete.Tuple.pad, shape, ptr, offset, len, ctx);
|
705
|
+
if (offset < 0) goto error;
|
706
|
+
|
707
|
+
offset = read_string_array(t->Record.names, shape, ptr, offset, len, ctx);
|
708
|
+
if (offset < 0) goto error;
|
709
|
+
|
710
|
+
metaoffset = offset;
|
711
|
+
for (int64_t i = 0; i < shape; i++) {
|
712
|
+
metaoffset = next_metaoffset(&offset, ptr, metaoffset, len, ctx);
|
713
|
+
if (metaoffset < 0) goto error;
|
714
|
+
|
715
|
+
t->Record.types[i] = read_type(m, ptr, offset, len, ctx);
|
716
|
+
if (t->Record.types[i] == NULL) {
|
717
|
+
goto error;
|
718
|
+
}
|
719
|
+
}
|
720
|
+
|
721
|
+
return t;
|
722
|
+
|
723
|
+
error:
|
724
|
+
ndt_del(t);
|
725
|
+
return NULL;
|
726
|
+
}
|
727
|
+
|
728
|
+
static ndt_t *
|
729
|
+
read_ref(ndt_meta_t *m, const common_t *fields, const char * const ptr,
|
730
|
+
int64_t offset, const int64_t len, ndt_context_t *ctx)
|
731
|
+
{
|
732
|
+
ndt_t *type;
|
733
|
+
ndt_t *t;
|
734
|
+
|
735
|
+
type = read_type(m, ptr, offset, len, ctx);
|
736
|
+
if (type == NULL) {
|
737
|
+
return NULL;
|
738
|
+
}
|
739
|
+
|
740
|
+
t = new_copy_common(fields, ctx);
|
741
|
+
if (t == NULL) {
|
742
|
+
ndt_del(type);
|
743
|
+
return NULL;
|
744
|
+
}
|
745
|
+
t->Ref.type = type;
|
746
|
+
|
747
|
+
return t;
|
748
|
+
}
|
749
|
+
|
750
|
+
static ndt_t *
|
751
|
+
read_constr(ndt_meta_t *m, const common_t *fields, const char * const ptr,
|
752
|
+
int64_t offset, const int64_t len, ndt_context_t *ctx)
|
753
|
+
{
|
754
|
+
char *name;
|
755
|
+
ndt_t *type;
|
756
|
+
ndt_t *t;
|
757
|
+
|
758
|
+
offset = read_string(&name, ptr, offset, len, ctx);
|
759
|
+
if (offset < 0) return NULL;
|
760
|
+
|
761
|
+
type = read_type(m, ptr, offset, len, ctx);
|
762
|
+
if (type == NULL) {
|
763
|
+
ndt_free(name);
|
764
|
+
return NULL;
|
765
|
+
}
|
766
|
+
|
767
|
+
t = new_copy_common(fields, ctx);
|
768
|
+
if (t == NULL) {
|
769
|
+
ndt_del(type);
|
770
|
+
ndt_free(name);
|
771
|
+
return NULL;
|
772
|
+
}
|
773
|
+
t->Constr.name = name;
|
774
|
+
t->Constr.type = type;
|
775
|
+
|
776
|
+
return t;
|
777
|
+
}
|
778
|
+
|
779
|
+
static ndt_t *
|
780
|
+
read_nominal(ndt_meta_t *m, const common_t *fields, const char * const ptr,
|
781
|
+
int64_t offset, const int64_t len, ndt_context_t *ctx)
|
782
|
+
{
|
783
|
+
char *name;
|
784
|
+
ndt_t *type;
|
785
|
+
const ndt_typedef_t *d;
|
786
|
+
ndt_t *t;
|
787
|
+
|
788
|
+
offset = read_string(&name, ptr, offset, len, ctx);
|
789
|
+
if (offset < 0) return NULL;
|
790
|
+
|
791
|
+
type = read_type(m, ptr, offset, len, ctx);
|
792
|
+
if (type == NULL) {
|
793
|
+
ndt_free(name);
|
794
|
+
return NULL;
|
795
|
+
}
|
796
|
+
|
797
|
+
d = ndt_typedef_find(name, ctx);
|
798
|
+
if (d == NULL) {
|
799
|
+
ndt_free(name);
|
800
|
+
ndt_del(type);
|
801
|
+
return NULL;
|
802
|
+
}
|
803
|
+
|
804
|
+
t = new_copy_common(fields, ctx);
|
805
|
+
if (t == NULL) {
|
806
|
+
ndt_free(name);
|
807
|
+
ndt_del(type);
|
808
|
+
return NULL;
|
809
|
+
}
|
810
|
+
t->Nominal.name = name;
|
811
|
+
t->Nominal.type = type;
|
812
|
+
t->Nominal.meth = &d->meth;
|
813
|
+
|
814
|
+
return t;
|
815
|
+
}
|
816
|
+
|
817
|
+
static ndt_t *
|
818
|
+
read_categorical(const common_t *fields, const char * const ptr, int64_t offset,
|
819
|
+
const int64_t len, ndt_context_t *ctx)
|
820
|
+
{
|
821
|
+
int64_t ntypes;
|
822
|
+
ndt_value_t *types;
|
823
|
+
ndt_t *t;
|
824
|
+
|
825
|
+
offset = read_pos_int64(&ntypes, ptr, offset, len, ctx);
|
826
|
+
if (offset < 0) return NULL;
|
827
|
+
|
828
|
+
types = ndt_calloc(ntypes, sizeof *types);
|
829
|
+
if (types == NULL) {
|
830
|
+
return ndt_memory_error(ctx);
|
831
|
+
}
|
832
|
+
|
833
|
+
offset = read_ndt_value_array(types, ntypes, ptr, offset, len, ctx);
|
834
|
+
if (offset < 0) {
|
835
|
+
ndt_value_array_del(types, ntypes);
|
836
|
+
return NULL;
|
837
|
+
}
|
838
|
+
|
839
|
+
t = new_copy_common(fields, ctx);
|
840
|
+
if (t == NULL) {
|
841
|
+
ndt_value_array_del(types, ntypes);
|
842
|
+
return NULL;
|
843
|
+
}
|
844
|
+
t->Categorical.ntypes = ntypes;
|
845
|
+
t->Categorical.types = types;
|
846
|
+
|
847
|
+
return t;
|
848
|
+
}
|
849
|
+
|
850
|
+
static ndt_t *
|
851
|
+
read_fixed_string(const common_t *fields, const char * const ptr, int64_t offset,
|
852
|
+
const int64_t len, ndt_context_t *ctx)
|
853
|
+
{
|
854
|
+
int64_t size;
|
855
|
+
enum ndt_encoding encoding;
|
856
|
+
ndt_t *t;
|
857
|
+
|
858
|
+
offset = read_pos_int64(&size, ptr, offset, len, ctx);
|
859
|
+
if (offset < 0) return NULL;
|
860
|
+
|
861
|
+
offset = ndt_encoding_from_uint8(&encoding, ptr, offset, len, ctx);
|
862
|
+
if (offset < 0) return NULL;
|
863
|
+
|
864
|
+
t = new_copy_common(fields, ctx);
|
865
|
+
if (t == NULL) {
|
866
|
+
return NULL;
|
867
|
+
}
|
868
|
+
t->FixedString.size = size;
|
869
|
+
t->FixedString.encoding = encoding;
|
870
|
+
|
871
|
+
return t;
|
872
|
+
}
|
873
|
+
|
874
|
+
static ndt_t *
|
875
|
+
read_fixed_bytes(const common_t *fields, const char * const ptr, int64_t offset,
|
876
|
+
const int64_t len, ndt_context_t *ctx)
|
877
|
+
{
|
878
|
+
int64_t size;
|
879
|
+
uint16_t align;
|
880
|
+
ndt_t *t;
|
881
|
+
|
882
|
+
offset = read_pos_int64(&size, ptr, offset, len, ctx);
|
883
|
+
if (offset < 0) return NULL;
|
884
|
+
|
885
|
+
offset = read_uint16(&align, ptr, offset, len, ctx);
|
886
|
+
if (offset < 0) return NULL;
|
887
|
+
|
888
|
+
t = new_copy_common(fields, ctx);
|
889
|
+
if (t == NULL) {
|
890
|
+
return NULL;
|
891
|
+
}
|
892
|
+
t->FixedBytes.size = size;
|
893
|
+
t->FixedBytes.align = align;
|
894
|
+
|
895
|
+
return t;
|
896
|
+
}
|
897
|
+
|
898
|
+
static ndt_t *
|
899
|
+
read_bytes(const common_t *fields, const char * const ptr, int64_t offset,
|
900
|
+
const int64_t len, ndt_context_t *ctx)
|
901
|
+
{
|
902
|
+
uint16_t align;
|
903
|
+
ndt_t *t;
|
904
|
+
|
905
|
+
offset = read_uint16(&align, ptr, offset, len, ctx);
|
906
|
+
if (offset < 0) return NULL;
|
907
|
+
|
908
|
+
t = new_copy_common(fields, ctx);
|
909
|
+
if (t == NULL) {
|
910
|
+
return NULL;
|
911
|
+
}
|
912
|
+
t->Bytes.target_align = align;
|
913
|
+
|
914
|
+
return t;
|
915
|
+
}
|
916
|
+
|
917
|
+
static ndt_t *
|
918
|
+
read_char(const common_t *fields, const char * const ptr, int64_t offset,
|
919
|
+
const int64_t len, ndt_context_t *ctx)
|
920
|
+
{
|
921
|
+
enum ndt_encoding encoding;
|
922
|
+
ndt_t *t;
|
923
|
+
|
924
|
+
offset = ndt_encoding_from_uint8(&encoding, ptr, offset, len, ctx);
|
925
|
+
if (offset < 0) return NULL;
|
926
|
+
|
927
|
+
t = new_copy_common(fields, ctx);
|
928
|
+
if (t == NULL) {
|
929
|
+
return NULL;
|
930
|
+
}
|
931
|
+
t->Char.encoding = encoding;
|
932
|
+
|
933
|
+
return t;
|
934
|
+
}
|
935
|
+
|
936
|
+
static ndt_t *
|
937
|
+
read_typevar(const common_t *fields, const char * const ptr, int64_t offset,
|
938
|
+
const int64_t len, ndt_context_t *ctx)
|
939
|
+
{
|
940
|
+
char *name;
|
941
|
+
ndt_t *t;
|
942
|
+
|
943
|
+
offset = read_string(&name, ptr, offset, len, ctx);
|
944
|
+
if (offset < 0) return NULL;
|
945
|
+
|
946
|
+
t = new_copy_common(fields, ctx);
|
947
|
+
if (t == NULL) {
|
948
|
+
ndt_free(name);
|
949
|
+
return NULL;
|
950
|
+
}
|
951
|
+
t->Typevar.name = name;
|
952
|
+
|
953
|
+
return t;
|
954
|
+
}
|
955
|
+
|
956
|
+
static ndt_t *
|
957
|
+
read_type(ndt_meta_t *m, const char * const ptr, int64_t offset, const int64_t len,
|
958
|
+
ndt_context_t *ctx)
|
959
|
+
{
|
960
|
+
common_t fields;
|
961
|
+
|
962
|
+
offset = read_common_fields(&fields, ptr, offset, len, ctx);
|
963
|
+
if (offset < 0) return NULL;
|
964
|
+
|
965
|
+
switch (fields.tag) {
|
966
|
+
case Module: return read_module(m, &fields, ptr, offset, len, ctx);
|
967
|
+
case Function: return read_function(m, &fields, ptr, offset, len, ctx);
|
968
|
+
case FixedDim: return read_fixed_dim(m, &fields, ptr, offset, len, ctx);
|
969
|
+
case SymbolicDim: return read_symbolic_dim(m, &fields, ptr, offset, len, ctx);
|
970
|
+
case EllipsisDim: return read_ellipsis_dim(m, &fields, ptr, offset, len, ctx);
|
971
|
+
case VarDim: return read_var_dim(m, &fields, ptr, offset, len, ctx);
|
972
|
+
case Tuple: return read_tuple(m, &fields, ptr, offset, len, ctx);
|
973
|
+
case Record: return read_record(m, &fields, ptr, offset, len, ctx);
|
974
|
+
case Ref: return read_ref(m, &fields, ptr, offset, len, ctx);
|
975
|
+
case Constr: return read_constr(m, &fields, ptr, offset, len, ctx);
|
976
|
+
case Nominal: return read_nominal(m, &fields, ptr, offset, len, ctx);
|
977
|
+
case Categorical: return read_categorical(&fields, ptr, offset, len, ctx);
|
978
|
+
case FixedString: return read_fixed_string(&fields, ptr, offset, len, ctx);
|
979
|
+
case FixedBytes: return read_fixed_bytes(&fields, ptr, offset, len, ctx);
|
980
|
+
case Bytes: return read_bytes(&fields, ptr, offset, len, ctx);
|
981
|
+
case Char: return read_char(&fields, ptr, offset, len, ctx);
|
982
|
+
case Typevar: return read_typevar(&fields, ptr, offset, len, ctx);
|
983
|
+
|
984
|
+
case Bool:
|
985
|
+
case Int8: case Int16: case Int32: case Int64:
|
986
|
+
case Uint8: case Uint16: case Uint32: case Uint64:
|
987
|
+
case Float16: case Float32: case Float64:
|
988
|
+
case Complex32: case Complex64: case Complex128:
|
989
|
+
case String:
|
990
|
+
|
991
|
+
case AnyKind:
|
992
|
+
case ScalarKind: case SignedKind: case UnsignedKind: case FloatKind:
|
993
|
+
case ComplexKind: case FixedStringKind: case FixedBytesKind:
|
994
|
+
return new_copy_common(&fields, ctx);
|
995
|
+
}
|
996
|
+
|
997
|
+
ndt_err_format(ctx, NDT_RuntimeError,
|
998
|
+
"found invalid type tag in deserialization (corrupted data?)");
|
999
|
+
return NULL;
|
1000
|
+
}
|
1001
|
+
|
1002
|
+
ndt_t *
|
1003
|
+
ndt_deserialize(ndt_meta_t *m, const char * const ptr, int64_t len,
|
1004
|
+
ndt_context_t *ctx)
|
1005
|
+
{
|
1006
|
+
return read_type(m, ptr, 0, len, ctx);
|
1007
|
+
}
|