1 // Copyright 2021 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 
5 #include "src/wasm/wasm-init-expr.h"
6 
7 #include "src/wasm/wasm-features.h"
8 #include "src/wasm/wasm-module.h"
9 
10 namespace v8 {
11 namespace internal {
12 namespace wasm {
13 
type(const WasmModule* module, const WasmFeatures& enabled_features) const14 ValueType WasmInitExpr::type(const WasmModule* module,
15                              const WasmFeatures& enabled_features) const {
16   switch (kind()) {
17     case kNone:
18       return kWasmBottom;
19     case kGlobalGet:
20       return immediate().index < module->globals.size()
21                  ? module->globals[immediate().index].type
22                  : kWasmBottom;
23     case kI32Const:
24       return kWasmI32;
25     case kI64Const:
26       return kWasmI64;
27     case kF32Const:
28       return kWasmF32;
29     case kF64Const:
30       return kWasmF64;
31     case kS128Const:
32       return kWasmS128;
33     case kRefFuncConst: {
34       uint32_t heap_type = enabled_features.has_typed_funcref()
35                                ? module->functions[immediate().index].sig_index
36                                : HeapType::kFunc;
37       return ValueType::Ref(heap_type, kNonNullable);
38     }
39     case kRefNullConst:
40       return ValueType::Ref(immediate().heap_type, kNullable);
41     case kStructNewWithRtt:
42     case kStructNew:
43     case kStructNewDefaultWithRtt:
44     case kStructNewDefault:
45     case kArrayInit:
46     case kArrayInitStatic:
47       return ValueType::Ref(immediate().index, kNonNullable);
48     case kRttCanon:
49       return ValueType::Rtt(immediate().heap_type);
50   }
51 }
52 
53 }  // namespace wasm
54 }  // namespace internal
55 }  // namespace v8
56