| 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/handles.h" | 7 #include "src/handles.h" |
| 8 #include "src/v8.h" | 8 #include "src/v8.h" |
| 9 #include "src/zone-containers.h" | 9 #include "src/zone-containers.h" |
| 10 | 10 |
| (...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 150 void WasmFunctionBuilder::Exported(uint8_t flag) { exported_ = flag; } | 150 void WasmFunctionBuilder::Exported(uint8_t flag) { exported_ = flag; } |
| 151 | 151 |
| 152 | 152 |
| 153 void WasmFunctionBuilder::External(uint8_t flag) { external_ = flag; } | 153 void WasmFunctionBuilder::External(uint8_t flag) { external_ = flag; } |
| 154 | 154 |
| 155 | 155 |
| 156 WasmFunctionEncoder* WasmFunctionBuilder::Build(Zone* zone, | 156 WasmFunctionEncoder* WasmFunctionBuilder::Build(Zone* zone, |
| 157 WasmModuleBuilder* mb) const { | 157 WasmModuleBuilder* mb) const { |
| 158 WasmFunctionEncoder* e = | 158 WasmFunctionEncoder* e = |
| 159 new (zone) WasmFunctionEncoder(zone, return_type_, exported_, external_); | 159 new (zone) WasmFunctionEncoder(zone, return_type_, exported_, external_); |
| 160 auto var_index = new uint16_t[locals_.size()]; | 160 uint16_t* var_index = zone->NewArray<uint16_t>(locals_.size()); |
| 161 IndexVars(e, var_index); | 161 IndexVars(e, var_index); |
| 162 const byte* start = &body_[0]; | 162 if (body_.size() > 0) { |
| 163 const byte* end = start + body_.size(); | 163 // TODO(titzer): iterate over local indexes, not the bytes. |
| 164 size_t local_index = 0; | 164 const byte* start = &body_[0]; |
| 165 for (size_t i = 0; i < body_.size();) { | 165 const byte* end = start + body_.size(); |
| 166 if (local_index < local_indices_.size() && | 166 size_t local_index = 0; |
| 167 i == local_indices_[local_index]) { | 167 for (size_t i = 0; i < body_.size();) { |
| 168 int length = 0; | 168 if (local_index < local_indices_.size() && |
| 169 uint32_t index; | 169 i == local_indices_[local_index]) { |
| 170 ReadUnsignedLEB128Operand(start + i, end, &length, &index); | 170 int length = 0; |
| 171 uint16_t new_index = var_index[index]; | 171 uint32_t index; |
| 172 const std::vector<uint8_t>& index_vec = UnsignedLEB128From(new_index); | 172 ReadUnsignedLEB128Operand(start + i, end, &length, &index); |
| 173 for (size_t j = 0; j < index_vec.size(); j++) { | 173 uint16_t new_index = var_index[index]; |
| 174 e->body_.push_back(index_vec.at(j)); | 174 const std::vector<uint8_t>& index_vec = UnsignedLEB128From(new_index); |
| 175 for (size_t j = 0; j < index_vec.size(); j++) { |
| 176 e->body_.push_back(index_vec.at(j)); |
| 177 } |
| 178 i += length; |
| 179 local_index++; |
| 180 } else { |
| 181 e->body_.push_back(*(start + i)); |
| 182 i++; |
| 175 } | 183 } |
| 176 i += length; | |
| 177 local_index++; | |
| 178 } else { | |
| 179 e->body_.push_back(*(start + i)); | |
| 180 i++; | |
| 181 } | 184 } |
| 182 } | 185 } |
| 183 FunctionSig::Builder sig(zone, return_type_ == kAstStmt ? 0 : 1, | 186 FunctionSig::Builder sig(zone, return_type_ == kAstStmt ? 0 : 1, |
| 184 e->params_.size()); | 187 e->params_.size()); |
| 185 if (return_type_ != kAstStmt) { | 188 if (return_type_ != kAstStmt) { |
| 186 sig.AddReturn(static_cast<LocalType>(return_type_)); | 189 sig.AddReturn(static_cast<LocalType>(return_type_)); |
| 187 } | 190 } |
| 188 for (size_t i = 0; i < e->params_.size(); i++) { | 191 for (size_t i = 0; i < e->params_.size(); i++) { |
| 189 sig.AddParam(static_cast<LocalType>(e->params_[i])); | 192 sig.AddParam(static_cast<LocalType>(e->params_[i])); |
| 190 } | 193 } |
| 191 e->signature_index_ = mb->AddSignature(sig.Build()); | 194 e->signature_index_ = mb->AddSignature(sig.Build()); |
| 192 delete[] var_index; | |
| 193 e->name_.insert(e->name_.begin(), name_.begin(), name_.end()); | 195 e->name_.insert(e->name_.begin(), name_.begin(), name_.end()); |
| 194 return e; | 196 return e; |
| 195 } | 197 } |
| 196 | 198 |
| 197 | 199 |
| 198 void WasmFunctionBuilder::IndexVars(WasmFunctionEncoder* e, | 200 void WasmFunctionBuilder::IndexVars(WasmFunctionEncoder* e, |
| 199 uint16_t* var_index) const { | 201 uint16_t* var_index) const { |
| 200 uint16_t param = 0; | 202 uint16_t param = 0; |
| 201 uint16_t int32 = 0; | 203 uint16_t int32 = 0; |
| 202 uint16_t int64 = 0; | 204 uint16_t int64 = 0; |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 288 | 290 |
| 289 if (HasLocals()) { | 291 if (HasLocals()) { |
| 290 EmitUint16(header, local_int32_count_); | 292 EmitUint16(header, local_int32_count_); |
| 291 EmitUint16(header, local_int64_count_); | 293 EmitUint16(header, local_int64_count_); |
| 292 EmitUint16(header, local_float32_count_); | 294 EmitUint16(header, local_float32_count_); |
| 293 EmitUint16(header, local_float64_count_); | 295 EmitUint16(header, local_float64_count_); |
| 294 } | 296 } |
| 295 | 297 |
| 296 if (!external_) { | 298 if (!external_) { |
| 297 EmitUint16(header, static_cast<uint16_t>(body_.size())); | 299 EmitUint16(header, static_cast<uint16_t>(body_.size())); |
| 298 std::memcpy(*header, &body_[0], body_.size()); | 300 if (body_.size() > 0) { |
| 299 (*header) += body_.size(); | 301 std::memcpy(*header, &body_[0], body_.size()); |
| 302 (*header) += body_.size(); |
| 303 } |
| 300 } | 304 } |
| 301 } | 305 } |
| 302 | 306 |
| 303 | 307 |
| 304 WasmDataSegmentEncoder::WasmDataSegmentEncoder(Zone* zone, const byte* data, | 308 WasmDataSegmentEncoder::WasmDataSegmentEncoder(Zone* zone, const byte* data, |
| 305 uint32_t size, uint32_t dest) | 309 uint32_t size, uint32_t dest) |
| 306 : data_(zone), dest_(dest) { | 310 : data_(zone), dest_(dest) { |
| 307 for (size_t i = 0; i < size; i++) { | 311 for (size_t i = 0; i < size; i++) { |
| 308 data_.push_back(data[i]); | 312 data_.push_back(data[i]); |
| 309 } | 313 } |
| (...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 579 next = next | 0x80; | 583 next = next | 0x80; |
| 580 } | 584 } |
| 581 output.push_back(next); | 585 output.push_back(next); |
| 582 shift += 7; | 586 shift += 7; |
| 583 } while ((next & 0x80) != 0); | 587 } while ((next & 0x80) != 0); |
| 584 return output; | 588 return output; |
| 585 } | 589 } |
| 586 } // namespace wasm | 590 } // namespace wasm |
| 587 } // namespace internal | 591 } // namespace internal |
| 588 } // namespace v8 | 592 } // namespace v8 |
| OLD | NEW |