|
8 | 8 | #include "list.hpp" |
9 | 9 | #include "flags.hpp" |
10 | 10 | #include "record.hpp" |
| 11 | +#include "variant.hpp" |
11 | 12 | #include "util.hpp" |
12 | 13 |
|
13 | 14 | namespace cmcpp |
14 | 15 | { |
15 | 16 | template <Boolean T> |
16 | | - inline T lift_flat(const CallContext &cx, const WasmValVectorIterator &vi) |
| 17 | + inline T lift_flat(const CallContext &cx, const CoreValueIter &vi) |
17 | 18 | { |
18 | 19 | return convert_int_to_bool(vi.next<int32_t>()); |
19 | 20 | } |
20 | 21 |
|
21 | 22 | template <Char T> |
22 | | - inline T lift_flat(const CallContext &cx, const WasmValVectorIterator &vi) |
| 23 | + inline T lift_flat(const CallContext &cx, const CoreValueIter &vi) |
23 | 24 | { |
24 | 25 | return convert_i32_to_char(cx, vi.next<int32_t>()); |
25 | 26 | } |
26 | 27 |
|
27 | 28 | template <UnsignedInteger T> |
28 | | - inline T lift_flat(const CallContext &cx, const WasmValVectorIterator &vi) |
| 29 | + inline T lift_flat(const CallContext &cx, const CoreValueIter &vi) |
29 | 30 | { |
30 | 31 | return integer::lift_flat_unsigned<T>(vi, ValTrait<T>::size * 8, 8); |
31 | 32 | } |
32 | 33 |
|
33 | 34 | template <SignedInteger T> |
34 | | - inline T lift_flat(const CallContext &cx, const WasmValVectorIterator &vi) |
| 35 | + inline T lift_flat(const CallContext &cx, const CoreValueIter &vi) |
35 | 36 | { |
36 | 37 | return integer::lift_flat_signed<T>(vi, ValTrait<T>::size * 8, 8); |
37 | 38 | } |
38 | 39 |
|
39 | 40 | template <Float T> |
40 | | - inline T lift_flat(const CallContext &cx, const WasmValVectorIterator &vi) |
| 41 | + inline T lift_flat(const CallContext &cx, const CoreValueIter &vi) |
41 | 42 | { |
42 | | - return float_::canonicalize_nan<T>(vi.next<T>()); |
| 43 | + using WasmValType = ValTrait<T>::flat_type; |
| 44 | + return float_::canonicalize_nan<T>(std::get<WasmValType>(vi.next(ValTrait<T>::flat_types[0]))); |
43 | 45 | } |
44 | 46 |
|
45 | 47 | template <String T> |
46 | | - inline T lift_flat(const CallContext &cx, const WasmValVectorIterator &vi) |
| 48 | + inline T lift_flat(const CallContext &cx, const CoreValueIter &vi) |
47 | 49 | { |
48 | 50 | return string::lift_flat<T>(cx, vi); |
49 | 51 | } |
50 | 52 |
|
51 | 53 | template <List T> |
52 | | - inline T lift_flat(const CallContext &cx, const WasmValVectorIterator &vi) |
| 54 | + inline T lift_flat(const CallContext &cx, const CoreValueIter &vi) |
53 | 55 | { |
54 | 56 | return list::lift_flat<typename ValTrait<T>::inner_type>(cx, vi); |
55 | 57 | } |
56 | 58 |
|
57 | 59 | template <Flags T> |
58 | | - inline T lift_flat(const CallContext &cx, const WasmValVectorIterator &vi) |
| 60 | + inline T lift_flat(const CallContext &cx, const CoreValueIter &vi) |
59 | 61 | { |
60 | 62 | return flags::lift_flat<T>(cx, vi); |
61 | 63 | } |
62 | 64 |
|
63 | 65 | template <Record T> |
64 | | - T lift_flat(const CallContext &cx, const WasmValVectorIterator &vi) |
| 66 | + T lift_flat(const CallContext &cx, const CoreValueIter &vi) |
65 | 67 | { |
66 | | - auto x = record::lift_flat<T>(cx, vi); |
| 68 | + auto x = record::lift_flat_record<T>(cx, vi); |
67 | 69 | return x; |
68 | 70 | } |
| 71 | + |
| 72 | + template <Variant T> |
| 73 | + T lift_flat(const CallContext &cx, const CoreValueIter &vi) |
| 74 | + { |
| 75 | + return variant::lift_flat<T>(cx, vi); |
| 76 | + } |
69 | 77 | } |
70 | 78 |
|
71 | 79 | #endif |
0 commit comments