@@ -92,6 +92,11 @@ void Type::init(const std::vector<Type>& types) {
92
92
}
93
93
#endif
94
94
95
+ if (types.size () >= (1 << SIZE_BITS)) {
96
+ WASM_UNREACHABLE (" Type too large" );
97
+ }
98
+ _size = types.size ();
99
+
95
100
auto lookup = [&]() {
96
101
auto indexIt = indices.find (types);
97
102
if (indexIt != indices.end ()) {
@@ -115,6 +120,9 @@ void Type::init(const std::vector<Type>& types) {
115
120
if (lookup ()) {
116
121
return ;
117
122
}
123
+ if (typeLists.size () >= (1 << ID_BITS)) {
124
+ WASM_UNREACHABLE (" Too many types!" );
125
+ }
118
126
id = typeLists.size ();
119
127
typeLists.push_back (std::make_unique<std::vector<Type>>(types));
120
128
indices[types] = id;
@@ -125,7 +133,15 @@ Type::Type(std::initializer_list<Type> types) { init(types); }
125
133
126
134
Type::Type (const std::vector<Type>& types) { init (types); }
127
135
128
- size_t Type::size () const { return expand ().size (); }
136
+ Type::Type (uint32_t _id) {
137
+ id = _id;
138
+ {
139
+ std::shared_lock<std::shared_timed_mutex> lock (mutex);
140
+ _size = typeLists[id]->size ();
141
+ }
142
+ }
143
+
144
+ size_t Type::size () const { return _size; }
129
145
130
146
const std::vector<Type>& Type::expand () const {
131
147
std::shared_lock<std::shared_timed_mutex> lock (mutex);
@@ -146,28 +162,34 @@ bool Type::operator<(const Type& other) const {
146
162
147
163
unsigned Type::getByteSize () const {
148
164
// TODO: alignment?
149
- unsigned size = 0 ;
150
- for (auto t : expand ()) {
165
+ auto getSingleByteSize = [](Type t) {
151
166
switch (t.getSingle ()) {
152
167
case Type::i32:
153
168
case Type::f32:
154
- size += 4 ;
155
- break ;
169
+ return 4 ;
156
170
case Type::i64:
157
171
case Type::f64:
158
- size += 8 ;
159
- break ;
172
+ return 8 ;
160
173
case Type::v128:
161
- size += 16 ;
162
- break ;
174
+ return 16 ;
163
175
case Type::funcref:
164
176
case Type::anyref:
165
177
case Type::nullref:
166
178
case Type::exnref:
167
179
case Type::none:
168
180
case Type::unreachable:
169
- WASM_UNREACHABLE ( " invalid type " ) ;
181
+ break ;
170
182
}
183
+ WASM_UNREACHABLE (" invalid type" );
184
+ };
185
+
186
+ if (isSingle ()) {
187
+ return getSingleByteSize (*this );
188
+ }
189
+
190
+ unsigned size = 0 ;
191
+ for (auto t : expand ()) {
192
+ size += getSingleByteSize (t);
171
193
}
172
194
return size;
173
195
}
@@ -197,25 +219,26 @@ Type Type::reinterpret() const {
197
219
}
198
220
199
221
FeatureSet Type::getFeatures () const {
200
- FeatureSet feats = FeatureSet::MVP;
201
- const auto & elements = expand ();
202
- if (elements.size () > 1 ) {
203
- feats = FeatureSet::Multivalue;
204
- }
205
- for (Type t : elements) {
222
+ auto getSingleFeatures = [](Type t) {
206
223
switch (t.getSingle ()) {
207
224
case Type::v128:
208
- feats |= FeatureSet::SIMD;
209
- break ;
225
+ return FeatureSet::SIMD;
210
226
case Type::anyref:
211
- feats |= FeatureSet::ReferenceTypes;
212
- break ;
227
+ return FeatureSet::ReferenceTypes;
213
228
case Type::exnref:
214
- feats |= FeatureSet::ExceptionHandling;
215
- break ;
229
+ return FeatureSet::ExceptionHandling;
216
230
default :
217
- break ;
231
+ return FeatureSet::MVP ;
218
232
}
233
+ };
234
+
235
+ if (isSingle ()) {
236
+ return getSingleFeatures (*this );
237
+ }
238
+
239
+ FeatureSet feats = FeatureSet::Multivalue;
240
+ for (Type t : expand ()) {
241
+ feats |= getSingleFeatures (t);
219
242
}
220
243
return feats;
221
244
}
0 commit comments