v8
V8 is Google’s open source high-performance JavaScript and WebAssembly engine, written in C++.
Loading...
Searching...
No Matches
function-body-decoder.cc
Go to the documentation of this file.
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
3// found in the LICENSE file.
4
6
8#include "src/wasm/decoder.h"
15
16namespace v8 {
17namespace internal {
18namespace wasm {
19
20template <typename ValidationTag>
22 const WasmModule* module, bool is_shared,
23 const uint8_t* start, const uint8_t* end, Zone* zone) {
24 if constexpr (ValidationTag::validate) DCHECK_NOT_NULL(module);
25 WasmDetectedFeatures unused_detected_features;
27 WasmDecoder<ValidationTag> decoder(zone, module, enabled,
28 &unused_detected_features, &kNoSig,
30 decls->encoded_size = decoder.DecodeLocals(decoder.pc());
31 if (ValidationTag::validate && decoder.failed()) {
32 DCHECK_EQ(0, decls->encoded_size);
33 return false;
34 }
35 DCHECK(decoder.ok());
36 // Copy the decoded locals types into {decls->local_types}.
38 decls->num_locals = decoder.num_locals_;
39 decls->local_types = decoder.local_types_;
40 return true;
41}
42
44 const uint8_t* start, const uint8_t* end, Zone* zone) {
45 constexpr WasmModule* kNoModule = nullptr;
46 DecodeLocalDecls<Decoder::NoValidationTag>(enabled, decls, kNoModule, false,
47 start, end, zone);
48}
49
51 BodyLocalDecls* decls,
52 const WasmModule* module,
53 bool is_shared, const uint8_t* start,
54 const uint8_t* end, Zone* zone) {
56 enabled, decls, module, is_shared, start, end, zone);
57}
58
59BytecodeIterator::BytecodeIterator(const uint8_t* start, const uint8_t* end)
60 : Decoder(start, end) {}
61
62BytecodeIterator::BytecodeIterator(const uint8_t* start, const uint8_t* end,
63 BodyLocalDecls* decls, Zone* zone)
64 : Decoder(start, end) {
65 DCHECK_NOT_NULL(decls);
66 DCHECK_NOT_NULL(zone);
68 pc_ += decls->encoded_size;
69 if (pc_ > end_) pc_ = end_;
70}
71
73 const WasmModule* module,
74 WasmDetectedFeatures* detected,
75 const FunctionBody& body) {
76 // Asm.js functions should never be validated; they are valid by design.
79 zone, module, enabled, detected, body);
80 decoder.Decode();
81 return decoder.toResult(nullptr);
82}
83
84unsigned OpcodeLength(const uint8_t* pc, const uint8_t* end) {
85 WasmDetectedFeatures unused_detected_features;
86 Zone* no_zone = nullptr;
87 WasmModule* no_module = nullptr;
88 FunctionSig* no_sig = nullptr;
89 constexpr bool kIsShared = false;
91 no_zone, no_module, WasmEnabledFeatures::All(), &unused_detected_features,
92 no_sig, kIsShared, pc, end, 0);
94}
95
97
99 const uint8_t* start,
100 const uint8_t* end,
101 bool* loop_is_innermost) {
103 WasmDetectedFeatures unused_detected_features;
104 constexpr bool kIsShared = false; // TODO(14616): Extend this.
106 zone, nullptr, no_features, &unused_detected_features, nullptr, kIsShared,
107 start, end, 0);
109 &decoder, start, num_locals, zone, loop_is_innermost);
110}
111
112} // namespace wasm
113} // namespace internal
114} // namespace v8
BytecodeIterator(const uint8_t *start, const uint8_t *end)
Result< R > toResult(T &&val)
Definition decoder.h:378
const uint8_t * pc() const
Definition decoder.h:408
static uint32_t OpcodeLength(WasmDecoder *decoder, const uint8_t *pc, ImmediateObservers &... ios)
static BitVector * AnalyzeLoopAssignment(WasmDecoder *decoder, const uint8_t *pc, uint32_t locals_count, Zone *zone, bool *loop_is_innermost=nullptr)
static constexpr WasmEnabledFeatures All()
static constexpr WasmEnabledFeatures None()
const v8::base::TimeTicks end_
Definition sweeper.cc:54
int start
int end
bool DecodeLocalDecls(WasmEnabledFeatures enabled, BodyLocalDecls *decls, const WasmModule *module, bool is_shared, const uint8_t *start, const uint8_t *end, Zone *zone)
bool ValidateAndDecodeLocalDeclsForTesting(WasmEnabledFeatures enabled, BodyLocalDecls *decls, const WasmModule *module, bool is_shared, const uint8_t *start, const uint8_t *end, Zone *zone)
DecodeResult ValidateFunctionBody(Zone *zone, WasmEnabledFeatures enabled, const WasmModule *module, WasmDetectedFeatures *detected, const FunctionBody &body)
unsigned OpcodeLength(const uint8_t *pc, const uint8_t *end)
BitVector * AnalyzeLoopAssignmentForTesting(Zone *zone, uint32_t num_locals, const uint8_t *start, const uint8_t *end, bool *loop_is_innermost)
JSArrayBuffer::IsDetachableBit is_shared
Definition c-api.cc:87
#define DCHECK_NULL(val)
Definition logging.h:491
#define DCHECK_NOT_NULL(val)
Definition logging.h:492
#define DCHECK(condition)
Definition logging.h:482
#define DCHECK_EQ(v1, v2)
Definition logging.h:485