Skip to content

Commit 462e61c

Browse files
committed
fix: lower_flat_values missing store
Signed-off-by Gordon Smith <GordonJSmith@gmail.com>
1 parent 5805d7d commit 462e61c

5 files changed

Lines changed: 79 additions & 37 deletions

File tree

include/cmcpp/lower.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ namespace cmcpp
7474
WasmValVector flat_vals = {ptr};
7575
trap_if(cx, ptr != align_to(ptr, ValTrait<tuple_type>::alignment));
7676
trap_if(cx, ptr + ValTrait<tuple_type>::size > cx.opts.memory.size());
77+
store(cx, vs, ptr);
7778
return flat_vals;
7879
}
7980

include/cmcpp/tuple.hpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,14 @@ namespace cmcpp
1717
{
1818

1919
template <Tuple T>
20-
void store(const LiftLowerContext &cx, const T &v, uint32_t ptr)
20+
void store(LiftLowerContext &cx, const T &v, uint32_t ptr)
2121
{
2222
auto process_field = [&](auto &&field)
2323
{
24-
ptr = align_to(ptr, ValTrait<std::remove_reference_t<decltype(field)>>::alignment);
25-
store(cx, field, ptr);
26-
ptr += ValTrait<std::remove_reference_t<decltype(field)>>::size;
24+
using field_type = std::remove_const_t<std::remove_reference_t<decltype(field)>>;
25+
ptr = align_to(ptr, ValTrait<field_type>::alignment);
26+
cmcpp::store(cx, field, ptr);
27+
ptr += ValTrait<field_type>::size;
2728
};
2829

2930
std::apply([&](auto &&...fields)

samples/wamr/main.cpp

Lines changed: 59 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ int main()
166166
using params_t = ValTrait<and_func_t>::params_t;
167167
using results_t = ValTrait<and_func_t>::results_t;
168168

169-
auto inputs = toWamr(lower_flat_values(liftLowerContext, MAX_FLAT_PARAMS, params_t{a, b}));
169+
auto inputs = toWamr(lower_flat_values<params_t>(liftLowerContext, MAX_FLAT_PARAMS, {a, b}));
170170
auto output_size = 1;
171171
wasm_val_t outputs[output_size];
172172
auto call_result = wasm_runtime_call_wasm_a(exec_env, and_func, output_size, outputs, inputs.size(), inputs.data());
@@ -186,7 +186,7 @@ int main()
186186
using params_t = ValTrait<add_func_t>::params_t;
187187
using results_t = ValTrait<add_func_t>::results_t;
188188

189-
auto inputs = toWamr(lower_flat_values(liftLowerContext, MAX_FLAT_PARAMS, params_t{input1, input2}));
189+
auto inputs = toWamr(lower_flat_values<params_t>(liftLowerContext, MAX_FLAT_PARAMS, {input1, input2}));
190190
auto output_size = 1;
191191
wasm_val_t outputs[output_size];
192192
auto call_result = wasm_runtime_call_wasm_a(exec_env, add_func, output_size, outputs, inputs.size(), inputs.data());
@@ -207,7 +207,7 @@ int main()
207207
using params_t = ValTrait<reverse_func_t>::params_t;
208208
using results_t = ValTrait<reverse_func_t>::results_t;
209209

210-
auto inputs = toWamr(lower_flat_values(liftLowerContext, MAX_FLAT_PARAMS, params_t{input1}));
210+
auto inputs = toWamr(lower_flat_values<params_t>(liftLowerContext, MAX_FLAT_PARAMS, {input1}));
211211
auto output_size = 1;
212212
wasm_val_t outputs[output_size];
213213
auto call_result = wasm_runtime_call_wasm_a(exec_env, reverse_func, output_size, outputs, inputs.size(), inputs.data());
@@ -218,44 +218,70 @@ int main()
218218
auto call_reverse_result = call_reverse("Hello World!");
219219
call_reverse(call_reverse_result);
220220

221-
using reverse_tuple_func_t = func_t<tuple_t<string_t, bool_t>(tuple_t<bool_t, string_t>)>;
222-
auto reverse_tuple_func = wasm_runtime_lookup_function(module_inst, "example:sample/tuples#reverse");
223-
auto reverse_tuple_cleanup_func = wasm_runtime_lookup_function(module_inst, "cabi_post_example:sample/tuples#reverse");
224-
reverse_tuple_func_t call_reverse_tuple = [&](tuple_t<bool_t, string_t> a) -> tuple_t<string_t, bool_t>
221+
using lots_func_t = func_t<uint32_t(
222+
string_t, string_t, string_t, string_t, string_t, string_t, string_t, string_t,
223+
string_t, string_t, string_t, string_t, string_t, string_t, string_t, string_t, string_t)>;
224+
auto lots_func = wasm_runtime_lookup_function(module_inst, "example:sample/strings#lots");
225+
auto lots_cleanup_func = wasm_runtime_lookup_function(module_inst, "cabi_post_example:sample/strings#lots");
226+
lots_func_t call_lots = [&](string_t p1, string_t p2, string_t p3, string_t p4, string_t p5, string_t p6, string_t p7, string_t p8,
227+
string_t p9, string_t p10, string_t p11, string_t p12, string_t p13, string_t p14, string_t p15, string_t p16, string_t p17) -> uint32_t
225228
{
226-
using params_t = ValTrait<reverse_tuple_func_t>::params_t;
227-
using results_t = ValTrait<reverse_tuple_func_t>::results_t;
229+
auto flat_ft_lower = func::flatten<lots_func_t>(liftLowerContext, func::ContextType::Lower);
230+
auto flat_ft_lift = func::flatten<lots_func_t>(liftLowerContext, func::ContextType::Lift);
228231

229-
auto inputs = toWamr(lower_flat_values(liftLowerContext, MAX_FLAT_PARAMS, params_t{a}));
230-
auto output_size = 1;
231-
wasm_val_t outputs[output_size];
232-
auto call_result = wasm_runtime_call_wasm_a(exec_env, reverse_tuple_func, output_size, outputs, inputs.size(), inputs.data());
233-
auto result = std::get<0>(lift_flat_values<results_t>(liftLowerContext, MAX_FLAT_RESULTS, fromWamr<results_t>(output_size, outputs)));
234-
std::cout << "reverse_tuple(" << std::get<0>(a) << ", " << std::get<1>(a) << "): " << std::get<0>(result) << ", " << std::get<1>(result) << std::endl;
235-
call_result = wasm_runtime_call_wasm_a(exec_env, reverse_tuple_cleanup_func, 0, nullptr, 1, outputs);
236-
return result;
237-
};
238-
auto call_reverse_tuple_result = call_reverse_tuple({false, "Hello World!"});
239-
// call_reverse_tuple({std::get<1>(call_reverse_tuple_result), std::get<0>(call_reverse_tuple_result}));
240-
241-
using list_filter_bool_func_t = func_t<list_t<string_t>(list_t<variant_t<bool_t, string_t>>)>;
242-
auto list_filter_bool_func = wasm_runtime_lookup_function(module_inst, "example:sample/lists#filter-bool");
243-
auto list_filter_bool_cleanup_func = wasm_runtime_lookup_function(module_inst, "cabi_post_example:sample/lists#filter-bool");
244-
auto call_list_filter_bool = [&](list_t<variant_t<bool_t, string_t>> a) -> list_t<string_t>
245-
{
246-
using params_t = ValTrait<list_filter_bool_func_t>::params_t;
247-
using results_t = ValTrait<list_filter_bool_func_t>::results_t;
232+
using params_t = ValTrait<lots_func_t>::params_t;
233+
using results_t = ValTrait<lots_func_t>::results_t;
248234

249-
auto inputs = toWamr(lower_flat_values(liftLowerContext, MAX_FLAT_PARAMS, params_t{a}));
235+
auto inputs = toWamr(lower_flat_values<params_t>(liftLowerContext, MAX_FLAT_PARAMS, {p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17}));
236+
auto inputs_size = inputs.size();
250237
auto output_size = 1;
251238
wasm_val_t outputs[output_size];
252-
auto call_result = wasm_runtime_call_wasm_a(exec_env, list_filter_bool_func, output_size, outputs, inputs.size(), inputs.data());
239+
auto call_result = wasm_runtime_call_wasm_a(exec_env, lots_func, output_size, outputs, inputs.size(), inputs.data());
253240
auto result = std::get<0>(lift_flat_values<results_t>(liftLowerContext, MAX_FLAT_RESULTS, fromWamr<results_t>(output_size, outputs)));
254-
std::cout << "list_filter_bool(" << a.size() << "): " << result.size() << std::endl;
255-
call_result = wasm_runtime_call_wasm_a(exec_env, list_filter_bool_cleanup_func, 0, nullptr, 1, outputs);
241+
std::cout << "lots_string(" << p1 << ", " << p2 << ", " << p3 << ", " << p4 << ", " << p5 << ", " << p6 << ", " << p7 << ", " << p8
242+
<< ", " << p9 << ", " << p10 << ", " << p11 << ", " << p12 << ", " << p13 << ", " << p14 << ", " << p15 << ", " << p16 << ", " << p17 << "): " << result << std::endl;
256243
return result;
257244
};
258-
auto call_list_filter_bool_result = call_list_filter_bool({{false}, {"Hello World!"}});
245+
auto call_lots_result = call_lots("p1", "p2", "p3", "p4", "p5", "p6", "p7", "p8", "p9", "p10", "p11", "p12", "p13", "p14", "p15", "p16", "p17");
246+
247+
// using reverse_tuple_func_t = func_t<tuple_t<string_t, bool_t>(tuple_t<bool_t, string_t>)>;
248+
// auto reverse_tuple_func = wasm_runtime_lookup_function(module_inst, "example:sample/tuples#reverse");
249+
// auto reverse_tuple_cleanup_func = wasm_runtime_lookup_function(module_inst, "cabi_post_example:sample/tuples#reverse");
250+
// reverse_tuple_func_t call_reverse_tuple = [&](tuple_t<bool_t, string_t> a) -> tuple_t<string_t, bool_t>
251+
// {
252+
// using params_t = ValTrait<reverse_tuple_func_t>::params_t;
253+
// using results_t = ValTrait<reverse_tuple_func_t>::results_t;
254+
255+
// auto inputs = toWamr(lower_flat_values<params_t>(liftLowerContext, 100 + MAX_FLAT_PARAMS, {a}));
256+
// auto output_size = 1;
257+
// wasm_val_t outputs[output_size];
258+
// auto call_result = wasm_runtime_call_wasm_a(exec_env, reverse_tuple_func, output_size, outputs, inputs.size(), inputs.data());
259+
// auto result = std::get<0>(lift_flat_values<results_t>(liftLowerContext, MAX_FLAT_RESULTS, fromWamr<results_t>(output_size, outputs)));
260+
// std::cout << "reverse_tuple(" << std::get<0>(a) << ", " << std::get<1>(a) << "): " << std::get<0>(result) << ", " << std::get<1>(result) << std::endl;
261+
// call_result = wasm_runtime_call_wasm_a(exec_env, reverse_tuple_cleanup_func, 0, nullptr, 1, outputs);
262+
// return result;
263+
// };
264+
// auto call_reverse_tuple_result = call_reverse_tuple({false, "Hello World!"});
265+
// // call_reverse_tuple({std::get<1>(call_reverse_tuple_result), std::get<0>(call_reverse_tuple_result}));
266+
267+
// using list_filter_bool_func_t = func_t<list_t<string_t>(list_t<variant_t<bool_t, string_t>>)>;
268+
// auto list_filter_bool_func = wasm_runtime_lookup_function(module_inst, "example:sample/lists#filter-bool");
269+
// auto list_filter_bool_cleanup_func = wasm_runtime_lookup_function(module_inst, "cabi_post_example:sample/lists#filter-bool");
270+
// auto call_list_filter_bool = [&](list_t<variant_t<bool_t, string_t>> a) -> list_t<string_t>
271+
// {
272+
// using params_t = ValTrait<list_filter_bool_func_t>::params_t;
273+
// using results_t = ValTrait<list_filter_bool_func_t>::results_t;
274+
275+
// auto inputs = toWamr(lower_flat_values<params_t>(liftLowerContext, MAX_FLAT_PARAMS, {a}));
276+
// auto output_size = 1;
277+
// wasm_val_t outputs[output_size];
278+
// auto call_result = wasm_runtime_call_wasm_a(exec_env, list_filter_bool_func, output_size, outputs, inputs.size(), inputs.data());
279+
// auto result = std::get<0>(lift_flat_values<results_t>(liftLowerContext, MAX_FLAT_RESULTS, fromWamr<results_t>(output_size, outputs)));
280+
// std::cout << "list_filter_bool(" << a.size() << "): " << result.size() << std::endl;
281+
// call_result = wasm_runtime_call_wasm_a(exec_env, list_filter_bool_cleanup_func, 0, nullptr, 1, outputs);
282+
// return result;
283+
// };
284+
// auto call_list_filter_bool_result = call_list_filter_bool({{false}, {"Hello World!"}});
259285

260286
wasm_runtime_destroy_exec_env(exec_env);
261287
wasm_runtime_deinstantiate(module_inst);

samples/wasm/main.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#include "sample.h"
22

33
#include <cstdlib>
4+
#include <cstring>
45

56
bool exports_example_sample_booleans_and(bool a, bool b)
67
{
@@ -22,6 +23,13 @@ void exports_example_sample_strings_reverse(sample_string_t *a, sample_string_t
2223
}
2324
}
2425

26+
uint32_t exports_example_sample_strings_lots(sample_string_t *p1, sample_string_t *p2, sample_string_t *p3, sample_string_t *p4, sample_string_t *p5, sample_string_t *p6, sample_string_t *p7, sample_string_t *p8, sample_string_t *p9, sample_string_t *p10, sample_string_t *p11, sample_string_t *p12, sample_string_t *p13, sample_string_t *p14, sample_string_t *p15, sample_string_t *p16, sample_string_t *p17)
27+
{
28+
// Calculate total length
29+
return p1->len + p2->len + p3->len + p4->len + p5->len + p6->len + p7->len + p8->len +
30+
p9->len + p10->len + p11->len + p12->len + p13->len + p14->len + p15->len + p16->len + p17->len;
31+
}
32+
2533
void exports_example_sample_tuples_reverse(sample_tuple2_bool_string_t *a, sample_tuple2_string_bool_t *ret)
2634
{
2735
ret->f1 = !a->f0;

samples/wasm/sample.wit

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,12 @@ interface floats {
1212

1313
interface strings {
1414
reverse: func(a: string) -> string;
15+
lots: func(
16+
p1: string, p2: string, p3: string, p4: string, p5: string,
17+
p6: string, p7: string, p8: string, p9: string, p10: string,
18+
p11: string, p12: string, p13: string, p14: string, p15: string,
19+
p16: string, p17: string
20+
) -> u32;
1521
}
1622

1723
interface tuples {

0 commit comments

Comments
 (0)