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 |
11 #include "src/wasm/ast-decoder.h" | 11 #include "src/wasm/ast-decoder.h" |
12 #include "src/wasm/encoder.h" | 12 #include "src/wasm/encoder.h" |
| 13 #include "src/wasm/wasm-macro-gen.h" |
13 #include "src/wasm/wasm-module.h" | 14 #include "src/wasm/wasm-module.h" |
14 #include "src/wasm/wasm-opcodes.h" | 15 #include "src/wasm/wasm-opcodes.h" |
15 | 16 |
16 #include "src/v8memory.h" | 17 #include "src/v8memory.h" |
17 | 18 |
18 namespace v8 { | 19 namespace v8 { |
19 namespace internal { | 20 namespace internal { |
20 namespace wasm { | 21 namespace wasm { |
21 | 22 |
22 /*TODO: add error cases for adding too many locals, too many functions and bad | 23 /*TODO: add error cases for adding too many locals, too many functions and bad |
(...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
243 bool exported, bool external) | 244 bool exported, bool external) |
244 : params_(zone), | 245 : params_(zone), |
245 exported_(exported), | 246 exported_(exported), |
246 external_(external), | 247 external_(external), |
247 body_(zone), | 248 body_(zone), |
248 name_(zone) {} | 249 name_(zone) {} |
249 | 250 |
250 | 251 |
251 uint32_t WasmFunctionEncoder::HeaderSize() const { | 252 uint32_t WasmFunctionEncoder::HeaderSize() const { |
252 uint32_t size = 3; | 253 uint32_t size = 3; |
253 if (HasLocals()) size += 8; | |
254 if (!external_) size += 2; | 254 if (!external_) size += 2; |
255 if (HasName()) size += 4; | 255 if (HasName()) size += 4; |
256 return size; | 256 return size; |
257 } | 257 } |
258 | 258 |
259 | 259 |
260 uint32_t WasmFunctionEncoder::BodySize(void) const { | 260 uint32_t WasmFunctionEncoder::BodySize(void) const { |
261 return external_ ? 0 : static_cast<uint32_t>(body_.size()); | 261 // TODO(titzer): embed a LocalDeclEncoder in the WasmFunctionEncoder |
| 262 LocalDeclEncoder local_decl; |
| 263 local_decl.AddLocals(local_i32_count_, kAstI32); |
| 264 local_decl.AddLocals(local_i64_count_, kAstI64); |
| 265 local_decl.AddLocals(local_f32_count_, kAstF32); |
| 266 local_decl.AddLocals(local_f64_count_, kAstF64); |
| 267 |
| 268 return external_ ? 0 |
| 269 : static_cast<uint32_t>(body_.size() + local_decl.Size()); |
262 } | 270 } |
263 | 271 |
264 | 272 |
265 uint32_t WasmFunctionEncoder::NameSize() const { | 273 uint32_t WasmFunctionEncoder::NameSize() const { |
266 return HasName() ? static_cast<uint32_t>(name_.size()) : 0; | 274 return HasName() ? static_cast<uint32_t>(name_.size()) : 0; |
267 } | 275 } |
268 | 276 |
269 | 277 |
270 void WasmFunctionEncoder::Serialize(byte* buffer, byte** header, | 278 void WasmFunctionEncoder::Serialize(byte* buffer, byte** header, |
271 byte** body) const { | 279 byte** body) const { |
272 uint8_t decl_bits = (exported_ ? kDeclFunctionExport : 0) | | 280 uint8_t decl_bits = (exported_ ? kDeclFunctionExport : 0) | |
273 (external_ ? kDeclFunctionImport : 0) | | 281 (external_ ? kDeclFunctionImport : 0) | |
274 (HasLocals() ? kDeclFunctionLocals : 0) | | |
275 (HasName() ? kDeclFunctionName : 0); | 282 (HasName() ? kDeclFunctionName : 0); |
276 | 283 |
277 EmitUint8(header, decl_bits); | 284 EmitUint8(header, decl_bits); |
278 EmitUint16(header, signature_index_); | 285 EmitUint16(header, signature_index_); |
279 | 286 |
280 if (HasName()) { | 287 if (HasName()) { |
281 uint32_t name_offset = static_cast<uint32_t>(*body - buffer); | 288 uint32_t name_offset = static_cast<uint32_t>(*body - buffer); |
282 EmitUint32(header, name_offset); | 289 EmitUint32(header, name_offset); |
283 std::memcpy(*body, &name_[0], name_.size()); | 290 std::memcpy(*body, &name_[0], name_.size()); |
284 (*body) += name_.size(); | 291 (*body) += name_.size(); |
285 } | 292 } |
286 | 293 |
287 if (HasLocals()) { | |
288 EmitUint16(header, local_i32_count_); | |
289 EmitUint16(header, local_i64_count_); | |
290 EmitUint16(header, local_f32_count_); | |
291 EmitUint16(header, local_f64_count_); | |
292 } | |
293 | 294 |
294 if (!external_) { | 295 if (!external_) { |
295 EmitUint16(header, static_cast<uint16_t>(body_.size())); | 296 // TODO(titzer): embed a LocalDeclEncoder in the WasmFunctionEncoder |
| 297 LocalDeclEncoder local_decl; |
| 298 local_decl.AddLocals(local_i32_count_, kAstI32); |
| 299 local_decl.AddLocals(local_i64_count_, kAstI64); |
| 300 local_decl.AddLocals(local_f32_count_, kAstF32); |
| 301 local_decl.AddLocals(local_f64_count_, kAstF64); |
| 302 |
| 303 EmitUint16(header, static_cast<uint16_t>(body_.size() + local_decl.Size())); |
| 304 (*header) += local_decl.Emit(*header); |
296 if (body_.size() > 0) { | 305 if (body_.size() > 0) { |
297 std::memcpy(*header, &body_[0], body_.size()); | 306 std::memcpy(*header, &body_[0], body_.size()); |
298 (*header) += body_.size(); | 307 (*header) += body_.size(); |
299 } | 308 } |
300 } | 309 } |
301 } | 310 } |
302 | 311 |
303 | 312 |
304 WasmDataSegmentEncoder::WasmDataSegmentEncoder(Zone* zone, const byte* data, | 313 WasmDataSegmentEncoder::WasmDataSegmentEncoder(Zone* zone, const byte* data, |
305 uint32_t size, uint32_t dest) | 314 uint32_t size, uint32_t dest) |
(...skipping 296 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
602 next = next | 0x80; | 611 next = next | 0x80; |
603 } | 612 } |
604 output.push_back(next); | 613 output.push_back(next); |
605 shift += 7; | 614 shift += 7; |
606 } while ((next & 0x80) != 0); | 615 } while ((next & 0x80) != 0); |
607 return output; | 616 return output; |
608 } | 617 } |
609 } // namespace wasm | 618 } // namespace wasm |
610 } // namespace internal | 619 } // namespace internal |
611 } // namespace v8 | 620 } // namespace v8 |
OLD | NEW |