| 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 158 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 169                                          i,        // func_index | 169                                          i,        // func_index | 
| 170                                          0,        // sig_index | 170                                          0,        // sig_index | 
| 171                                          0,        // name_offset | 171                                          0,        // name_offset | 
| 172                                          0,        // name_length | 172                                          0,        // name_length | 
| 173                                          0,        // code_start_offset | 173                                          0,        // code_start_offset | 
| 174                                          0,        // code_end_offset | 174                                          0,        // code_end_offset | 
| 175                                          0,        // local_i32_count | 175                                          0,        // local_i32_count | 
| 176                                          0,        // local_i64_count | 176                                          0,        // local_i64_count | 
| 177                                          0,        // local_f32_count | 177                                          0,        // local_f32_count | 
| 178                                          0,        // local_f64_count | 178                                          0,        // local_f64_count | 
| 179                                          false,    // exported | 179                                          false});  // exported | 
| 180                                          false});  // external |  | 
| 181             WasmFunction* function = &module->functions.back(); | 180             WasmFunction* function = &module->functions.back(); | 
| 182             function->sig_index = consume_sig_index(module, &function->sig); | 181             function->sig_index = consume_sig_index(module, &function->sig); | 
| 183           } | 182           } | 
| 184           break; | 183           break; | 
| 185         } | 184         } | 
| 186         case WasmSection::Code::FunctionBodies: { | 185         case WasmSection::Code::FunctionBodies: { | 
| 187           int length; | 186           int length; | 
| 188           const byte* pos = pc_; | 187           const byte* pos = pc_; | 
| 189           uint32_t functions_count = consume_u32v(&length, "functions count"); | 188           uint32_t functions_count = consume_u32v(&length, "functions count"); | 
| 190           if (functions_count != module->functions.size()) { | 189           if (functions_count != module->functions.size()) { | 
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 228                                          i,        // func_index | 227                                          i,        // func_index | 
| 229                                          0,        // sig_index | 228                                          0,        // sig_index | 
| 230                                          0,        // name_offset | 229                                          0,        // name_offset | 
| 231                                          0,        // name_length | 230                                          0,        // name_length | 
| 232                                          0,        // code_start_offset | 231                                          0,        // code_start_offset | 
| 233                                          0,        // code_end_offset | 232                                          0,        // code_end_offset | 
| 234                                          0,        // local_i32_count | 233                                          0,        // local_i32_count | 
| 235                                          0,        // local_i64_count | 234                                          0,        // local_i64_count | 
| 236                                          0,        // local_f32_count | 235                                          0,        // local_f32_count | 
| 237                                          0,        // local_f64_count | 236                                          0,        // local_f64_count | 
| 238                                          false,    // exported | 237                                          false});  // exported | 
| 239                                          false});  // external |  | 
| 240             WasmFunction* function = &module->functions.back(); | 238             WasmFunction* function = &module->functions.back(); | 
| 241             DecodeFunctionInModule(module, function, false); | 239             DecodeFunctionInModule(module, function, false); | 
| 242           } | 240           } | 
| 243           if (ok() && verify_functions) { | 241           if (ok() && verify_functions) { | 
| 244             for (uint32_t i = 0; i < functions_count; i++) { | 242             for (uint32_t i = 0; i < functions_count; i++) { | 
| 245               if (failed()) break; | 243               if (failed()) break; | 
| 246               WasmFunction* function = &module->functions[i]; | 244               WasmFunction* function = &module->functions[i]; | 
| 247               if (!function->external) { | 245               VerifyFunctionBody(i, &menv, function); | 
| 248                 VerifyFunctionBody(i, &menv, function); | 246               if (result_.failed()) { | 
| 249                 if (result_.failed()) | 247                 error(result_.error_pc, result_.error_msg.get()); | 
| 250                   error(result_.error_pc, result_.error_msg.get()); |  | 
| 251               } | 248               } | 
| 252             } | 249             } | 
| 253           } | 250           } | 
| 254           break; | 251           break; | 
| 255         } | 252         } | 
| 256         case WasmSection::Code::Names: { | 253         case WasmSection::Code::Names: { | 
| 257           int length; | 254           int length; | 
| 258           const byte* pos = pc_; | 255           const byte* pos = pc_; | 
| 259           uint32_t functions_count = consume_u32v(&length, "functions count"); | 256           uint32_t functions_count = consume_u32v(&length, "functions count"); | 
| 260           if (functions_count != module->functions.size()) { | 257           if (functions_count != module->functions.size()) { | 
| (...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 467   // Decodes a single anonymous function starting at {start_}. | 464   // Decodes a single anonymous function starting at {start_}. | 
| 468   FunctionResult DecodeSingleFunction(ModuleEnv* module_env, | 465   FunctionResult DecodeSingleFunction(ModuleEnv* module_env, | 
| 469                                       WasmFunction* function) { | 466                                       WasmFunction* function) { | 
| 470     pc_ = start_; | 467     pc_ = start_; | 
| 471     function->sig = consume_sig();            // read signature | 468     function->sig = consume_sig();            // read signature | 
| 472     function->name_offset = 0;                // ---- name | 469     function->name_offset = 0;                // ---- name | 
| 473     function->name_length = 0;                // ---- name length | 470     function->name_length = 0;                // ---- name length | 
| 474     function->code_start_offset = off(pc_);   // ---- code start | 471     function->code_start_offset = off(pc_);   // ---- code start | 
| 475     function->code_end_offset = off(limit_);  // ---- code end | 472     function->code_end_offset = off(limit_);  // ---- code end | 
| 476     function->exported = false;               // ---- exported | 473     function->exported = false;               // ---- exported | 
| 477     function->external = false;               // ---- external |  | 
| 478 | 474 | 
| 479     if (ok()) VerifyFunctionBody(0, module_env, function); | 475     if (ok()) VerifyFunctionBody(0, module_env, function); | 
| 480 | 476 | 
| 481     FunctionResult result; | 477     FunctionResult result; | 
| 482     result.CopyFrom(result_);  // Copy error code and location. | 478     result.CopyFrom(result_);  // Copy error code and location. | 
| 483     result.val = function; | 479     result.val = function; | 
| 484     return result; | 480     return result; | 
| 485   } | 481   } | 
| 486 | 482 | 
| 487   // Decodes a single function signature at {start}. | 483   // Decodes a single function signature at {start}. | 
| (...skipping 28 matching lines...) Expand all  Loading... | 
| 516 | 512 | 
| 517     const byte* sigpos = pc_; | 513     const byte* sigpos = pc_; | 
| 518     function->sig_index = consume_u16("signature index"); | 514     function->sig_index = consume_u16("signature index"); | 
| 519 | 515 | 
| 520     if (function->sig_index >= module->signatures.size()) { | 516     if (function->sig_index >= module->signatures.size()) { | 
| 521       return error(sigpos, "invalid signature index"); | 517       return error(sigpos, "invalid signature index"); | 
| 522     } else { | 518     } else { | 
| 523       function->sig = module->signatures[function->sig_index]; | 519       function->sig = module->signatures[function->sig_index]; | 
| 524     } | 520     } | 
| 525 | 521 | 
| 526     TRACE("  +%d  <function attributes:%s%s%s%s%s>\n", | 522     TRACE("  +%d  <function attributes:%s%s%s>\n", | 
| 527           static_cast<int>(pc_ - start_), | 523           static_cast<int>(pc_ - start_), | 
| 528           decl_bits & kDeclFunctionName ? " name" : "", | 524           decl_bits & kDeclFunctionName ? " name" : "", | 
| 529           decl_bits & kDeclFunctionImport ? " imported" : "", |  | 
| 530           decl_bits & kDeclFunctionLocals ? " locals" : "", | 525           decl_bits & kDeclFunctionLocals ? " locals" : "", | 
| 531           decl_bits & kDeclFunctionExport ? " exported" : "", | 526           decl_bits & kDeclFunctionExport ? " exported" : ""); | 
| 532           (decl_bits & kDeclFunctionImport) == 0 ? " body" : ""); |  | 
| 533 | 527 | 
| 534     function->exported = decl_bits & kDeclFunctionExport; | 528     function->exported = decl_bits & kDeclFunctionExport; | 
| 535 | 529 | 
| 536     if (decl_bits & kDeclFunctionName) { | 530     if (decl_bits & kDeclFunctionName) { | 
| 537       function->name_offset = | 531       function->name_offset = | 
| 538           consume_string(&function->name_length, function->exported); | 532           consume_string(&function->name_length, function->exported); | 
| 539     } | 533     } | 
| 540 | 534 | 
| 541     // Imported functions have no locals or body. |  | 
| 542     if (decl_bits & kDeclFunctionImport) { |  | 
| 543       function->external = true; |  | 
| 544       return; |  | 
| 545     } |  | 
| 546 |  | 
| 547     if (decl_bits & kDeclFunctionLocals) { | 535     if (decl_bits & kDeclFunctionLocals) { | 
| 548       function->local_i32_count = consume_u16("i32 count"); | 536       function->local_i32_count = consume_u16("i32 count"); | 
| 549       function->local_i64_count = consume_u16("i64 count"); | 537       function->local_i64_count = consume_u16("i64 count"); | 
| 550       function->local_f32_count = consume_u16("f32 count"); | 538       function->local_f32_count = consume_u16("f32 count"); | 
| 551       function->local_f64_count = consume_u16("f64 count"); | 539       function->local_f64_count = consume_u16("f64 count"); | 
| 552     } | 540     } | 
| 553 | 541 | 
| 554     uint16_t size = consume_u16("body size"); | 542     uint16_t size = consume_u16("body size"); | 
| 555     if (ok()) { | 543     if (ok()) { | 
| 556       if ((pc_ + size) > limit_) { | 544       if ((pc_ + size) > limit_) { | 
| (...skipping 286 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 843     return FunctionError("size > maximum function size"); | 831     return FunctionError("size > maximum function size"); | 
| 844   isolate->counters()->wasm_function_size_bytes()->AddSample( | 832   isolate->counters()->wasm_function_size_bytes()->AddSample( | 
| 845       static_cast<int>(size)); | 833       static_cast<int>(size)); | 
| 846   WasmFunction* function = new WasmFunction(); | 834   WasmFunction* function = new WasmFunction(); | 
| 847   ModuleDecoder decoder(zone, function_start, function_end, kWasmOrigin); | 835   ModuleDecoder decoder(zone, function_start, function_end, kWasmOrigin); | 
| 848   return decoder.DecodeSingleFunction(module_env, function); | 836   return decoder.DecodeSingleFunction(module_env, function); | 
| 849 } | 837 } | 
| 850 }  // namespace wasm | 838 }  // namespace wasm | 
| 851 }  // namespace internal | 839 }  // namespace internal | 
| 852 }  // namespace v8 | 840 }  // namespace v8 | 
| OLD | NEW | 
|---|