OLD | NEW |
1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/wasm/module-decoder.h" | 5 #include "src/wasm/module-decoder.h" |
6 | 6 |
7 #include "src/base/functional.h" | 7 #include "src/base/functional.h" |
8 #include "src/base/platform/platform.h" | 8 #include "src/base/platform/platform.h" |
9 #include "src/macro-assembler.h" | 9 #include "src/macro-assembler.h" |
10 #include "src/objects.h" | 10 #include "src/objects.h" |
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
158 FunctionSig* s = consume_sig(); | 158 FunctionSig* s = consume_sig(); |
159 module->signatures.push_back(s); | 159 module->signatures.push_back(s); |
160 } | 160 } |
161 break; | 161 break; |
162 } | 162 } |
163 case WasmSection::Code::FunctionSignatures: { | 163 case WasmSection::Code::FunctionSignatures: { |
164 int length; | 164 int length; |
165 uint32_t functions_count = consume_u32v(&length, "functions count"); | 165 uint32_t functions_count = consume_u32v(&length, "functions count"); |
166 module->functions.reserve(SafeReserve(functions_count)); | 166 module->functions.reserve(SafeReserve(functions_count)); |
167 for (uint32_t i = 0; i < functions_count; i++) { | 167 for (uint32_t i = 0; i < functions_count; i++) { |
168 module->functions.push_back( | 168 module->functions.push_back({nullptr, // sig |
169 {nullptr, i, 0, 0, 0, 0, 0, 0, false, false}); | 169 i, // func_index |
| 170 0, // sig_index |
| 171 0, // name_offset |
| 172 0, // name_length |
| 173 0, // code_start_offset |
| 174 0, // code_end_offset |
| 175 0, // local_i32_count |
| 176 0, // local_i64_count |
| 177 0, // local_f32_count |
| 178 0, // local_f64_count |
| 179 false, // exported |
| 180 false}); // external |
170 WasmFunction* function = &module->functions.back(); | 181 WasmFunction* function = &module->functions.back(); |
171 function->sig_index = consume_sig_index(module, &function->sig); | 182 function->sig_index = consume_sig_index(module, &function->sig); |
172 } | 183 } |
173 break; | 184 break; |
174 } | 185 } |
175 case WasmSection::Code::FunctionBodies: { | 186 case WasmSection::Code::FunctionBodies: { |
176 int length; | 187 int length; |
177 const byte* pos = pc_; | 188 const byte* pos = pc_; |
178 uint32_t functions_count = consume_u32v(&length, "functions count"); | 189 uint32_t functions_count = consume_u32v(&length, "functions count"); |
179 if (functions_count != module->functions.size()) { | 190 if (functions_count != module->functions.size()) { |
(...skipping 26 matching lines...) Expand all Loading... |
206 ModuleEnv menv; | 217 ModuleEnv menv; |
207 menv.module = module; | 218 menv.module = module; |
208 menv.instance = nullptr; | 219 menv.instance = nullptr; |
209 menv.origin = origin_; | 220 menv.origin = origin_; |
210 // Decode functions. | 221 // Decode functions. |
211 for (uint32_t i = 0; i < functions_count; i++) { | 222 for (uint32_t i = 0; i < functions_count; i++) { |
212 if (failed()) break; | 223 if (failed()) break; |
213 TRACE("DecodeFunction[%d] module+%d\n", i, | 224 TRACE("DecodeFunction[%d] module+%d\n", i, |
214 static_cast<int>(pc_ - start_)); | 225 static_cast<int>(pc_ - start_)); |
215 | 226 |
216 module->functions.push_back( | 227 module->functions.push_back({nullptr, // sig |
217 {nullptr, i, 0, 0, 0, 0, 0, 0, false, false}); | 228 i, // func_index |
| 229 0, // sig_index |
| 230 0, // name_offset |
| 231 0, // name_length |
| 232 0, // code_start_offset |
| 233 0, // code_end_offset |
| 234 0, // local_i32_count |
| 235 0, // local_i64_count |
| 236 0, // local_f32_count |
| 237 0, // local_f64_count |
| 238 false, // exported |
| 239 false}); // external |
218 WasmFunction* function = &module->functions.back(); | 240 WasmFunction* function = &module->functions.back(); |
219 DecodeFunctionInModule(module, function, false); | 241 DecodeFunctionInModule(module, function, false); |
220 } | 242 } |
221 if (ok() && verify_functions) { | 243 if (ok() && verify_functions) { |
222 for (uint32_t i = 0; i < functions_count; i++) { | 244 for (uint32_t i = 0; i < functions_count; i++) { |
223 if (failed()) break; | 245 if (failed()) break; |
224 WasmFunction* function = &module->functions[i]; | 246 WasmFunction* function = &module->functions[i]; |
225 if (!function->external) { | 247 if (!function->external) { |
226 VerifyFunctionBody(i, &menv, function); | 248 VerifyFunctionBody(i, &menv, function); |
227 if (result_.failed()) | 249 if (result_.failed()) |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
276 case WasmSection::Code::DataSegments: { | 298 case WasmSection::Code::DataSegments: { |
277 int length; | 299 int length; |
278 uint32_t data_segments_count = | 300 uint32_t data_segments_count = |
279 consume_u32v(&length, "data segments count"); | 301 consume_u32v(&length, "data segments count"); |
280 module->data_segments.reserve(SafeReserve(data_segments_count)); | 302 module->data_segments.reserve(SafeReserve(data_segments_count)); |
281 // Decode data segments. | 303 // Decode data segments. |
282 for (uint32_t i = 0; i < data_segments_count; i++) { | 304 for (uint32_t i = 0; i < data_segments_count; i++) { |
283 if (failed()) break; | 305 if (failed()) break; |
284 TRACE("DecodeDataSegment[%d] module+%d\n", i, | 306 TRACE("DecodeDataSegment[%d] module+%d\n", i, |
285 static_cast<int>(pc_ - start_)); | 307 static_cast<int>(pc_ - start_)); |
286 module->data_segments.push_back({0, 0, 0}); | 308 module->data_segments.push_back({0, // dest_addr |
| 309 0, // source_offset |
| 310 0, // source_size |
| 311 false}); // init |
287 WasmDataSegment* segment = &module->data_segments.back(); | 312 WasmDataSegment* segment = &module->data_segments.back(); |
288 DecodeDataSegmentInModule(module, segment); | 313 DecodeDataSegmentInModule(module, segment); |
289 } | 314 } |
290 break; | 315 break; |
291 } | 316 } |
292 case WasmSection::Code::FunctionTable: { | 317 case WasmSection::Code::FunctionTable: { |
293 // An indirect function table requires functions first. | 318 // An indirect function table requires functions first. |
294 CheckForFunctions(module, section); | 319 CheckForFunctions(module, section); |
295 int length; | 320 int length; |
296 uint32_t function_table_count = | 321 uint32_t function_table_count = |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
330 int length; | 355 int length; |
331 uint32_t import_table_count = | 356 uint32_t import_table_count = |
332 consume_u32v(&length, "import table count"); | 357 consume_u32v(&length, "import table count"); |
333 module->import_table.reserve(SafeReserve(import_table_count)); | 358 module->import_table.reserve(SafeReserve(import_table_count)); |
334 // Decode import table. | 359 // Decode import table. |
335 for (uint32_t i = 0; i < import_table_count; i++) { | 360 for (uint32_t i = 0; i < import_table_count; i++) { |
336 if (failed()) break; | 361 if (failed()) break; |
337 TRACE("DecodeImportTable[%d] module+%d\n", i, | 362 TRACE("DecodeImportTable[%d] module+%d\n", i, |
338 static_cast<int>(pc_ - start_)); | 363 static_cast<int>(pc_ - start_)); |
339 | 364 |
340 module->import_table.push_back({nullptr, 0, 0}); | 365 module->import_table.push_back({nullptr, // sig |
| 366 0, // sig_index |
| 367 0, // module_name_offset |
| 368 0, // module_name_length |
| 369 0, // function_name_offset |
| 370 0}); // function_name_length |
341 WasmImport* import = &module->import_table.back(); | 371 WasmImport* import = &module->import_table.back(); |
342 | 372 |
343 import->sig_index = consume_sig_index(module, &import->sig); | 373 import->sig_index = consume_sig_index(module, &import->sig); |
344 const byte* pos = pc_; | 374 const byte* pos = pc_; |
345 import->module_name_offset = consume_string( | 375 import->module_name_offset = consume_string( |
346 &import->module_name_length, "import module name"); | 376 &import->module_name_length, "import module name"); |
347 if (import->module_name_length == 0) { | 377 if (import->module_name_length == 0) { |
348 error(pos, "import module name cannot be NULL"); | 378 error(pos, "import module name cannot be NULL"); |
349 } | 379 } |
350 import->function_name_offset = consume_string( | 380 import->function_name_offset = consume_string( |
351 &import->function_name_length, "import function name"); | 381 &import->function_name_length, "import function name"); |
352 } | 382 } |
353 break; | 383 break; |
354 } | 384 } |
355 case WasmSection::Code::ExportTable: { | 385 case WasmSection::Code::ExportTable: { |
356 // Declares an export table. | 386 // Declares an export table. |
357 CheckForFunctions(module, section); | 387 CheckForFunctions(module, section); |
358 int length; | 388 int length; |
359 uint32_t export_table_count = | 389 uint32_t export_table_count = |
360 consume_u32v(&length, "export table count"); | 390 consume_u32v(&length, "export table count"); |
361 module->export_table.reserve(SafeReserve(export_table_count)); | 391 module->export_table.reserve(SafeReserve(export_table_count)); |
362 // Decode export table. | 392 // Decode export table. |
363 for (uint32_t i = 0; i < export_table_count; i++) { | 393 for (uint32_t i = 0; i < export_table_count; i++) { |
364 if (failed()) break; | 394 if (failed()) break; |
365 TRACE("DecodeExportTable[%d] module+%d\n", i, | 395 TRACE("DecodeExportTable[%d] module+%d\n", i, |
366 static_cast<int>(pc_ - start_)); | 396 static_cast<int>(pc_ - start_)); |
367 | 397 |
368 module->export_table.push_back({0, 0}); | 398 module->export_table.push_back({0, // func_index |
| 399 0, // name_offset |
| 400 0}); // name_length |
369 WasmExport* exp = &module->export_table.back(); | 401 WasmExport* exp = &module->export_table.back(); |
370 | 402 |
371 WasmFunction* func; | 403 WasmFunction* func; |
372 exp->func_index = consume_func_index(module, &func); | 404 exp->func_index = consume_func_index(module, &func); |
373 exp->name_offset = consume_string(&exp->name_length, "export name"); | 405 exp->name_offset = consume_string(&exp->name_length, "export name"); |
374 } | 406 } |
375 break; | 407 break; |
376 } | 408 } |
377 case WasmSection::Code::Max: | 409 case WasmSection::Code::Max: |
378 // Skip unknown sections. | 410 // Skip unknown sections. |
(...skipping 430 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
809 return FunctionError("size > maximum function size"); | 841 return FunctionError("size > maximum function size"); |
810 isolate->counters()->wasm_function_size_bytes()->AddSample( | 842 isolate->counters()->wasm_function_size_bytes()->AddSample( |
811 static_cast<int>(size)); | 843 static_cast<int>(size)); |
812 WasmFunction* function = new WasmFunction(); | 844 WasmFunction* function = new WasmFunction(); |
813 ModuleDecoder decoder(zone, function_start, function_end, kWasmOrigin); | 845 ModuleDecoder decoder(zone, function_start, function_end, kWasmOrigin); |
814 return decoder.DecodeSingleFunction(module_env, function); | 846 return decoder.DecodeSingleFunction(module_env, function); |
815 } | 847 } |
816 } // namespace wasm | 848 } // namespace wasm |
817 } // namespace internal | 849 } // namespace internal |
818 } // namespace v8 | 850 } // namespace v8 |
OLD | NEW |