Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(624)

Side by Side Diff: src/wasm/encoder.cc

Issue 1533593004: Fix several wasm warnings an a use after free. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: fix Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/wasm/encoder.h ('k') | src/wasm/module-decoder.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « src/wasm/encoder.h ('k') | src/wasm/module-decoder.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698