| 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 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 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 auto var_index = new uint16_t[locals_.size()]; |
| 161 IndexVars(e, var_index); | 161 IndexVars(e, var_index); |
| 162 const byte* start = body_.data(); | 162 const byte* start = &body_[0]; |
| 163 const byte* end = start + body_.size(); | 163 const byte* end = start + body_.size(); |
| 164 size_t local_index = 0; | 164 size_t local_index = 0; |
| 165 for (size_t i = 0; i < body_.size();) { | 165 for (size_t i = 0; i < body_.size();) { |
| 166 if (local_index < local_indices_.size() && | 166 if (local_index < local_indices_.size() && |
| 167 i == local_indices_[local_index]) { | 167 i == local_indices_[local_index]) { |
| 168 int length = 0; | 168 int length = 0; |
| 169 uint32_t index; | 169 uint32_t index; |
| 170 ReadUnsignedLEB128Operand(start + i, end, &length, &index); | 170 ReadUnsignedLEB128Operand(start + i, end, &length, &index); |
| 171 uint16_t new_index = var_index[index]; | 171 uint16_t new_index = var_index[index]; |
| 172 const std::vector<uint8_t>& index_vec = UnsignedLEB128From(new_index); | 172 const std::vector<uint8_t>& index_vec = UnsignedLEB128From(new_index); |
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 275 (external_ ? kDeclFunctionImport : 0) | | 275 (external_ ? kDeclFunctionImport : 0) | |
| 276 (HasLocals() ? kDeclFunctionLocals : 0) | | 276 (HasLocals() ? kDeclFunctionLocals : 0) | |
| 277 (HasName() ? kDeclFunctionName : 0); | 277 (HasName() ? kDeclFunctionName : 0); |
| 278 | 278 |
| 279 EmitUint8(header, decl_bits); | 279 EmitUint8(header, decl_bits); |
| 280 EmitUint16(header, signature_index_); | 280 EmitUint16(header, signature_index_); |
| 281 | 281 |
| 282 if (HasName()) { | 282 if (HasName()) { |
| 283 uint32_t name_offset = static_cast<uint32_t>(*body - buffer); | 283 uint32_t name_offset = static_cast<uint32_t>(*body - buffer); |
| 284 EmitUint32(header, name_offset); | 284 EmitUint32(header, name_offset); |
| 285 std::memcpy(*body, name_.data(), name_.size()); | 285 std::memcpy(*body, &name_[0], name_.size()); |
| 286 (*body) += name_.size(); | 286 (*body) += name_.size(); |
| 287 } | 287 } |
| 288 | 288 |
| 289 if (HasLocals()) { | 289 if (HasLocals()) { |
| 290 EmitUint16(header, local_int32_count_); | 290 EmitUint16(header, local_int32_count_); |
| 291 EmitUint16(header, local_int64_count_); | 291 EmitUint16(header, local_int64_count_); |
| 292 EmitUint16(header, local_float32_count_); | 292 EmitUint16(header, local_float32_count_); |
| 293 EmitUint16(header, local_float64_count_); | 293 EmitUint16(header, local_float64_count_); |
| 294 } | 294 } |
| 295 | 295 |
| 296 if (!external_) { | 296 if (!external_) { |
| 297 EmitUint16(header, static_cast<uint16_t>(body_.size())); | 297 EmitUint16(header, static_cast<uint16_t>(body_.size())); |
| 298 std::memcpy(*header, body_.data(), body_.size()); | 298 std::memcpy(*header, &body_[0], body_.size()); |
| 299 (*header) += body_.size(); | 299 (*header) += body_.size(); |
| 300 } | 300 } |
| 301 } | 301 } |
| 302 | 302 |
| 303 | 303 |
| 304 WasmDataSegmentEncoder::WasmDataSegmentEncoder(Zone* zone, const byte* data, | 304 WasmDataSegmentEncoder::WasmDataSegmentEncoder(Zone* zone, const byte* data, |
| 305 uint32_t size, uint32_t dest) | 305 uint32_t size, uint32_t dest) |
| 306 : data_(zone), dest_(dest) { | 306 : data_(zone), dest_(dest) { |
| 307 for (size_t i = 0; i < size; i++) { | 307 for (size_t i = 0; i < size; i++) { |
| 308 data_.push_back(data[i]); | 308 data_.push_back(data[i]); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 322 | 322 |
| 323 | 323 |
| 324 void WasmDataSegmentEncoder::Serialize(byte* buffer, byte** header, | 324 void WasmDataSegmentEncoder::Serialize(byte* buffer, byte** header, |
| 325 byte** body) const { | 325 byte** body) const { |
| 326 uint32_t body_offset = static_cast<uint32_t>(*body - buffer); | 326 uint32_t body_offset = static_cast<uint32_t>(*body - buffer); |
| 327 EmitUint32(header, dest_); | 327 EmitUint32(header, dest_); |
| 328 EmitUint32(header, body_offset); | 328 EmitUint32(header, body_offset); |
| 329 EmitUint32(header, static_cast<uint32_t>(data_.size())); | 329 EmitUint32(header, static_cast<uint32_t>(data_.size())); |
| 330 EmitUint8(header, 1); // init | 330 EmitUint8(header, 1); // init |
| 331 | 331 |
| 332 std::memcpy(*body, data_.data(), data_.size()); | 332 std::memcpy(*body, &data_[0], data_.size()); |
| 333 (*body) += data_.size(); | 333 (*body) += data_.size(); |
| 334 } | 334 } |
| 335 | 335 |
| 336 | 336 |
| 337 WasmModuleBuilder::WasmModuleBuilder(Zone* zone) | 337 WasmModuleBuilder::WasmModuleBuilder(Zone* zone) |
| 338 : zone_(zone), | 338 : zone_(zone), |
| 339 signatures_(zone), | 339 signatures_(zone), |
| 340 functions_(zone), | 340 functions_(zone), |
| 341 data_segments_(zone), | 341 data_segments_(zone), |
| 342 indirect_functions_(zone), | 342 indirect_functions_(zone), |
| (...skipping 17 matching lines...) Expand all Loading... |
| 360 } | 360 } |
| 361 } | 361 } |
| 362 | 362 |
| 363 | 363 |
| 364 void WasmModuleBuilder::AddDataSegment(WasmDataSegmentEncoder* data) { | 364 void WasmModuleBuilder::AddDataSegment(WasmDataSegmentEncoder* data) { |
| 365 data_segments_.push_back(data); | 365 data_segments_.push_back(data); |
| 366 } | 366 } |
| 367 | 367 |
| 368 | 368 |
| 369 int WasmModuleBuilder::CompareFunctionSigs::operator()(FunctionSig* a, | 369 int WasmModuleBuilder::CompareFunctionSigs::operator()(FunctionSig* a, |
| 370 FunctionSig* b) { | 370 FunctionSig* b) const { |
| 371 if (a->return_count() < b->return_count()) return -1; | 371 if (a->return_count() < b->return_count()) return -1; |
| 372 if (a->return_count() > b->return_count()) return 1; | 372 if (a->return_count() > b->return_count()) return 1; |
| 373 if (a->parameter_count() < b->parameter_count()) return -1; | 373 if (a->parameter_count() < b->parameter_count()) return -1; |
| 374 if (a->parameter_count() > b->parameter_count()) return 1; | 374 if (a->parameter_count() > b->parameter_count()) return 1; |
| 375 for (size_t r = 0; r < a->return_count(); r++) { | 375 for (size_t r = 0; r < a->return_count(); r++) { |
| 376 if (a->GetReturn(r) < b->GetReturn(r)) return -1; | 376 if (a->GetReturn(r) < b->GetReturn(r)) return -1; |
| 377 if (a->GetReturn(r) > b->GetReturn(r)) return 1; | 377 if (a->GetReturn(r) > b->GetReturn(r)) return 1; |
| 378 } | 378 } |
| 379 for (size_t p = 0; p < a->parameter_count(); p++) { | 379 for (size_t p = 0; p < a->parameter_count(); p++) { |
| 380 if (a->GetParam(p) < b->GetParam(p)) return -1; | 380 if (a->GetParam(p) < b->GetParam(p)) return -1; |
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 486 for (auto segment : data_segments_) { | 486 for (auto segment : data_segments_) { |
| 487 sizes.Add(segment->HeaderSize(), segment->BodySize()); | 487 sizes.Add(segment->HeaderSize(), segment->BodySize()); |
| 488 } | 488 } |
| 489 | 489 |
| 490 sizes.AddSection(indirect_functions_.size()); | 490 sizes.AddSection(indirect_functions_.size()); |
| 491 sizes.Add(2 * static_cast<uint32_t>(indirect_functions_.size()), 0); | 491 sizes.Add(2 * static_cast<uint32_t>(indirect_functions_.size()), 0); |
| 492 | 492 |
| 493 if (sizes.body_size > 0) sizes.Add(1, 0); | 493 if (sizes.body_size > 0) sizes.Add(1, 0); |
| 494 | 494 |
| 495 ZoneVector<uint8_t> buffer_vector(sizes.total(), zone); | 495 ZoneVector<uint8_t> buffer_vector(sizes.total(), zone); |
| 496 byte* buffer = buffer_vector.data(); | 496 byte* buffer = &buffer_vector[0]; |
| 497 byte* header = buffer; | 497 byte* header = buffer; |
| 498 byte* body = buffer + sizes.header_size; | 498 byte* body = buffer + sizes.header_size; |
| 499 | 499 |
| 500 // -- emit memory declaration ------------------------------------------------ | 500 // -- emit memory declaration ------------------------------------------------ |
| 501 EmitUint8(&header, kDeclMemory); | 501 EmitUint8(&header, kDeclMemory); |
| 502 EmitUint8(&header, 16); // min memory size | 502 EmitUint8(&header, 16); // min memory size |
| 503 EmitUint8(&header, 16); // max memory size | 503 EmitUint8(&header, 16); // max memory size |
| 504 EmitUint8(&header, 0); // memory export | 504 EmitUint8(&header, 0); // memory export |
| 505 | 505 |
| 506 // -- emit globals ----------------------------------------------------------- | 506 // -- emit globals ----------------------------------------------------------- |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 579 next = next | 0x80; | 579 next = next | 0x80; |
| 580 } | 580 } |
| 581 output.push_back(next); | 581 output.push_back(next); |
| 582 shift += 7; | 582 shift += 7; |
| 583 } while ((next & 0x80) != 0); | 583 } while ((next & 0x80) != 0); |
| 584 return output; | 584 return output; |
| 585 } | 585 } |
| 586 } // namespace wasm | 586 } // namespace wasm |
| 587 } // namespace internal | 587 } // namespace internal |
| 588 } // namespace v8 | 588 } // namespace v8 |
| OLD | NEW |