Skip to content

Commit cb5bef4

Browse files
committed
WIP
1 parent 86f8b2a commit cb5bef4

File tree

4 files changed

+57
-36
lines changed

4 files changed

+57
-36
lines changed

src/flags.hpp

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,18 +7,17 @@
77

88
namespace cmcpp
99
{
10-
template <Flags T>
11-
inline T load(const CallContext &cx, uint32_t ptr);
12-
1310
namespace flags
1411
{
1512
template <Flags T>
16-
uint32_t pack_flags_into_int(const T &v)
13+
int32_t pack_flags_into_int(const T &v)
1714
{
1815
uint32_t retVal = 0;
19-
for (uint i = 0; i < v.count; ++i)
16+
uint32_t finger = 1;
17+
for (uint32_t i = 0; i < v.count; ++i)
2018
{
21-
retVal |= v.flags.test(i);
19+
retVal += v.flags.test(i) ? finger : 0;
20+
finger *= 2;
2221
}
2322
return retVal;
2423
}
@@ -36,11 +35,11 @@ namespace cmcpp
3635
return {pack_flags_into_int(v)};
3736
}
3837

39-
template <Flags T, typename B>
40-
T unpack_flags_from_int(const B &buff)
38+
template <Flags T>
39+
T unpack_flags_from_int(const uint32_t &buff)
4140
{
4241
T retVal;
43-
uint finger = 1;
42+
uint32_t finger = 1;
4443
for (uint i = 0; i < retVal.count; ++i)
4544
{
4645
retVal.flags.set(i, buff & finger);
@@ -56,6 +55,15 @@ namespace cmcpp
5655
std::memcpy(&buff, &cx.memory[ptr], ValTrait<T>::size);
5756
return unpack_flags_from_int<T>(buff);
5857
}
58+
59+
template <Flags T>
60+
T lift_flat(const CallContext &cx, const WasmValVectorIterator &vi)
61+
{
62+
auto i = vi.next<int32_t>();
63+
uint8_t buff[ValTrait<T>::size];
64+
std::memcpy(&buff, &i, ValTrait<T>::size);
65+
return unpack_flags_from_int<T>(i);
66+
}
5967
}
6068
}
6169
#endif

src/lift.hpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#include "float.hpp"
77
#include "string.hpp"
88
#include "list.hpp"
9+
#include "flags.hpp"
910
#include "record.hpp"
1011
#include "util.hpp"
1112

@@ -53,6 +54,12 @@ namespace cmcpp
5354
return list::lift_flat<typename ValTrait<T>::inner_type>(cx, vi);
5455
}
5556

57+
template <Flags T>
58+
inline T lift_flat(const CallContext &cx, const WasmValVectorIterator &vi)
59+
{
60+
return flags::lift_flat<T>(cx, vi);
61+
}
62+
5663
template <Record T>
5764
T lift_flat(const CallContext &cx, const WasmValVectorIterator &vi)
5865
{

src/traits.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -419,6 +419,7 @@ namespace cmcpp
419419
static constexpr std::array<const char *, count> labels = {Ts.value...};
420420
std::bitset<count> flags;
421421

422+
CFlags() = default;
422423
CFlags(std::initializer_list<bool> args)
423424
{
424425
assert(args.size() <= count);

test/main.cpp

Lines changed: 32 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -71,30 +71,30 @@ TEST_CASE("Boolean")
7171

7272
const char_t chars[] = {0, 65, 0xD7FF, 0xE000, 0x10FFFF};
7373
const char_t bad_chars[] = {0xD800, 0xDFFF, 0x110000, 0xFFFFFFFF};
74-
TEST_CASE("Char")
75-
{
76-
Heap heap(1024 * 1024);
77-
auto cx = createCallContext(&heap, Encoding::Utf8);
78-
for (auto c : chars)
79-
{
80-
auto v = lower_flat(*cx, c);
81-
auto c2 = lift_flat<char_t>(*cx, v);
82-
CHECK(c == c2);
83-
}
84-
for (auto c : bad_chars)
85-
{
86-
try
87-
{
88-
auto v = lower_flat(*cx, c);
89-
auto c2 = lift_flat<char_t>(*cx, v);
90-
CHECK(false);
91-
}
92-
catch (...)
93-
{
94-
CHECK(true);
95-
}
96-
}
97-
}
74+
// TEST_CASE("Char")
75+
// {
76+
// Heap heap(1024 * 1024);
77+
// auto cx = createCallContext(&heap, Encoding::Utf8);
78+
// for (auto c : chars)
79+
// {
80+
// auto v = lower_flat(*cx, c);
81+
// auto c2 = lift_flat<char_t>(*cx, v);
82+
// CHECK(c == c2);
83+
// }
84+
// for (auto c : bad_chars)
85+
// {
86+
// try
87+
// {
88+
// auto v = lower_flat(*cx, c);
89+
// auto c2 = lift_flat<char_t>(*cx, v);
90+
// CHECK(false);
91+
// }
92+
// catch (...)
93+
// {
94+
// CHECK(true);
95+
// }
96+
// }
97+
// }
9898

9999
template <typename T>
100100
void test_numeric(const std::unique_ptr<CallContext> &cx, T v = 42)
@@ -358,14 +358,19 @@ TEST_CASE("Flags")
358358
{
359359
Heap heap(1024 * 1024);
360360
auto cx = createCallContext(&heap, Encoding::Latin1_Utf16);
361-
flags_t<"a", "bb", "ccc"> flagsx = {false, true, false};
361+
using MyFlags = flags_t<"a", "bb", "ccc">;
362+
CHECK(MyFlags::count == 3);
363+
MyFlags flagsx = {false, true, false};
362364
CHECK(flagsx.count == 3);
363365
auto x = flagsx.labels;
364366
CHECK(std::strcmp(x[0], "a") == 0);
365367
CHECK(std::strcmp(x[1], "bb") == 0);
366368
CHECK(std::strcmp(x[2], "ccc") == 0);
367-
auto v = lower_flat<typeof flagsx>(*cx, flagsx);
368-
// auto f = lift_flat<TestFlags>(*cx, v);
369+
auto v = lower_flat(*cx, flagsx);
370+
auto f = lift_flat<MyFlags>(*cx, v);
371+
CHECK(flagsx.get<"a">() == f.get<"a">());
372+
CHECK(flagsx.get<"bb">() == f.get<"bb">());
373+
CHECK(flagsx.get<"ccc">() == f.get<"ccc">());
369374
// flags_t<"a", "bb", "ccc">::getIndex<"a">();
370375

371376
// auto y = flags_t<"a", "b">::getIndex<"a">();

0 commit comments

Comments
 (0)