| 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/signature.h" | 5 #include "src/signature.h" |
| 6 | 6 |
| 7 #include "src/base/platform/elapsed-timer.h" | 7 #include "src/base/platform/elapsed-timer.h" |
| 8 #include "src/bit-vector.h" | 8 #include "src/bit-vector.h" |
| 9 #include "src/flags.h" | 9 #include "src/flags.h" |
| 10 #include "src/handles.h" | 10 #include "src/handles.h" |
| (...skipping 970 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 981 error(pos, "improper branch in br_table"); | 981 error(pos, "improper branch in br_table"); |
| 982 break; | 982 break; |
| 983 } | 983 } |
| 984 ssa_env_ = Split(copy); | 984 ssa_env_ = Split(copy); |
| 985 ssa_env_->control = (i == operand.table_count) | 985 ssa_env_->control = (i == operand.table_count) |
| 986 ? BUILD(IfDefault, sw) | 986 ? BUILD(IfDefault, sw) |
| 987 : BUILD(IfValue, i, sw); | 987 : BUILD(IfValue, i, sw); |
| 988 BreakTo(target); | 988 BreakTo(target); |
| 989 | 989 |
| 990 // Check that label types match up. | 990 // Check that label types match up. |
| 991 static MergeValues loop_dummy = {0, {nullptr}}; |
| 991 Control* c = &control_[control_.size() - target - 1]; | 992 Control* c = &control_[control_.size() - target - 1]; |
| 993 MergeValues* current = c->is_loop() ? &loop_dummy : &c->merge; |
| 992 if (i == 0) { | 994 if (i == 0) { |
| 993 merge = &c->merge; | 995 merge = current; |
| 994 } else if (merge->arity != c->merge.arity) { | 996 } else if (merge->arity != current->arity) { |
| 995 errorf(pos, | 997 errorf(pos, |
| 996 "inconsistent arity in br_table target %d" | 998 "inconsistent arity in br_table target %d" |
| 997 " (previous was %u, this one %u)", | 999 " (previous was %u, this one %u)", |
| 998 i, merge->arity, c->merge.arity); | 1000 i, merge->arity, current->arity); |
| 999 } else if (control_.back().unreachable) { | 1001 } else if (control_.back().unreachable) { |
| 1000 for (uint32_t j = 0; ok() && j < merge->arity; ++j) { | 1002 for (uint32_t j = 0; ok() && j < merge->arity; ++j) { |
| 1001 if ((*merge)[j].type != c->merge[j].type) { | 1003 if ((*merge)[j].type != (*current)[j].type) { |
| 1002 errorf(pos, | 1004 errorf(pos, |
| 1003 "type error in br_table target %d operand %d" | 1005 "type error in br_table target %d operand %d" |
| 1004 " (previous expected %s, this one %s)", | 1006 " (previous expected %s, this one %s)", |
| 1005 i, j, WasmOpcodes::TypeName((*merge)[j].type), | 1007 i, j, WasmOpcodes::TypeName((*merge)[j].type), |
| 1006 WasmOpcodes::TypeName(c->merge[j].type)); | 1008 WasmOpcodes::TypeName((*current)[j].type)); |
| 1007 } | 1009 } |
| 1008 } | 1010 } |
| 1009 } | 1011 } |
| 1010 } | 1012 } |
| 1011 if (failed()) break; | 1013 if (failed()) break; |
| 1012 } else { | 1014 } else { |
| 1013 // Only a default target. Do the equivalent of br. | 1015 // Only a default target. Do the equivalent of br. |
| 1014 const byte* pos = iterator.pc(); | 1016 const byte* pos = iterator.pc(); |
| 1015 uint32_t target = iterator.next(); | 1017 uint32_t target = iterator.next(); |
| 1016 if (target >= control_.size()) { | 1018 if (target >= control_.size()) { |
| (...skipping 1155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2172 BitVector* AnalyzeLoopAssignmentForTesting(Zone* zone, size_t num_locals, | 2174 BitVector* AnalyzeLoopAssignmentForTesting(Zone* zone, size_t num_locals, |
| 2173 const byte* start, const byte* end) { | 2175 const byte* start, const byte* end) { |
| 2174 Decoder decoder(start, end); | 2176 Decoder decoder(start, end); |
| 2175 return WasmDecoder::AnalyzeLoopAssignment(&decoder, start, | 2177 return WasmDecoder::AnalyzeLoopAssignment(&decoder, start, |
| 2176 static_cast<int>(num_locals), zone); | 2178 static_cast<int>(num_locals), zone); |
| 2177 } | 2179 } |
| 2178 | 2180 |
| 2179 } // namespace wasm | 2181 } // namespace wasm |
| 2180 } // namespace internal | 2182 } // namespace internal |
| 2181 } // namespace v8 | 2183 } // namespace v8 |
| OLD | NEW |