Skip to content

Commit a4dea4e

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

6 files changed

Lines changed: 54 additions & 12 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: 31 additions & 5 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,6 +218,32 @@ int main()
218218
auto call_reverse_result = call_reverse("Hello World!");
219219
call_reverse(call_reverse_result);
220220

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
228+
{
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);
231+
232+
using params_t = ValTrait<lots_func_t>::params_t;
233+
using results_t = ValTrait<lots_func_t>::results_t;
234+
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();
237+
auto output_size = 1;
238+
wasm_val_t outputs[output_size];
239+
auto call_result = wasm_runtime_call_wasm_a(exec_env, lots_func, output_size, outputs, inputs.size(), inputs.data());
240+
auto result = std::get<0>(lift_flat_values<results_t>(liftLowerContext, MAX_FLAT_RESULTS, fromWamr<results_t>(output_size, 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;
243+
return result;
244+
};
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+
221247
using reverse_tuple_func_t = func_t<tuple_t<string_t, bool_t>(tuple_t<bool_t, string_t>)>;
222248
auto reverse_tuple_func = wasm_runtime_lookup_function(module_inst, "example:sample/tuples#reverse");
223249
auto reverse_tuple_cleanup_func = wasm_runtime_lookup_function(module_inst, "cabi_post_example:sample/tuples#reverse");
@@ -226,7 +252,7 @@ int main()
226252
using params_t = ValTrait<reverse_tuple_func_t>::params_t;
227253
using results_t = ValTrait<reverse_tuple_func_t>::results_t;
228254

229-
auto inputs = toWamr(lower_flat_values(liftLowerContext, MAX_FLAT_PARAMS, params_t{a}));
255+
auto inputs = toWamr(lower_flat_values<params_t>(liftLowerContext, 100 + MAX_FLAT_PARAMS, {a}));
230256
auto output_size = 1;
231257
wasm_val_t outputs[output_size];
232258
auto call_result = wasm_runtime_call_wasm_a(exec_env, reverse_tuple_func, output_size, outputs, inputs.size(), inputs.data());
@@ -246,7 +272,7 @@ int main()
246272
using params_t = ValTrait<list_filter_bool_func_t>::params_t;
247273
using results_t = ValTrait<list_filter_bool_func_t>::results_t;
248274

249-
auto inputs = toWamr(lower_flat_values(liftLowerContext, MAX_FLAT_PARAMS, params_t{a}));
275+
auto inputs = toWamr(lower_flat_values<params_t>(liftLowerContext, MAX_FLAT_PARAMS, {a}));
250276
auto output_size = 1;
251277
wasm_val_t outputs[output_size];
252278
auto call_result = wasm_runtime_call_wasm_a(exec_env, list_filter_bool_func, output_size, outputs, inputs.size(), inputs.data());

samples/wasm/CMakeLists.txt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
function(wit2code witFile)
22
add_custom_command(
3-
MAIN_DEPENDENCY ${CMAKE_CURRENT_SOURCE_DIR}/${witFile}.wit
43
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${witFile}/${witFile}.c ${CMAKE_CURRENT_BINARY_DIR}/${witFile}/${witFile}.h ${CMAKE_CURRENT_BINARY_DIR}/${witFile}/${witFile}_component_type.o
54
# COMMAND wit-bindgen markdown ${CMAKE_CURRENT_SOURCE_DIR}/${witFile}.wit
6-
COMMAND wit-bindgen c --out-dir ${CMAKE_CURRENT_BINARY_DIR}/${witFile} ${CMAKE_CURRENT_SOURCE_DIR}/${witFile}.wit
5+
COMMAND export
6+
COMMAND ${CMAKE_COMMAND} -E env PATH=$ENV{HOME}/.cargo/bin:$ENV{PATH} wit-bindgen c --out-dir "${CMAKE_CURRENT_BINARY_DIR}/${witFile}" "${CMAKE_CURRENT_SOURCE_DIR}/${witFile}.wit"
77
# COMMAND wit-bindgen rust --ownership owning --out-dir ${CMAKE_CURRENT_BINARY_DIR}/${witFile}/rust ${CMAKE_CURRENT_SOURCE_DIR}/${witFile}.wit
88
# COMMAND wit-bindgen teavm-java --out-dir ${CMAKE_CURRENT_BINARY_DIR}/${witFile}/java ${CMAKE_CURRENT_SOURCE_DIR}/${witFile}.wit
99
# COMMAND wit-bindgen tiny-go --out-dir ${CMAKE_CURRENT_BINARY_DIR}/${witFile}/go ${CMAKE_CURRENT_SOURCE_DIR}/${witFile}.wit
@@ -46,7 +46,7 @@ target_link_libraries(sample
4646

4747
add_custom_command(
4848
TARGET sample POST_BUILD
49-
COMMAND wasm-tools component new ${CMAKE_CURRENT_BINARY_DIR}/sample.wasm -o ${CMAKE_CURRENT_BINARY_DIR}/sample-component.wasm
49+
COMMAND ${CMAKE_COMMAND} -E env PATH=$ENV{HOME}/.cargo/bin:$ENV{PATH} wasm-tools component new ${CMAKE_CURRENT_BINARY_DIR}/sample.wasm -o ${CMAKE_CURRENT_BINARY_DIR}/sample-component.wasm
5050
# COMMAND npx jco transpile ${CMAKE_CURRENT_BINARY_DIR}/test.component.wasm -o ${CMAKE_CURRENT_BINARY_DIR}/js --wasi-shim --map wasi-*=@bytecodealliance/preview2-shim/* --map print=../../../../src-components/test/logger.js
5151
)
5252
# set_property(SOURCE main.cpp APPEND PROPERTY OBJECT_DEPENDS ${HPCC_WASM_ROOT}/build/guest/cpp/wit/test.c)

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)