aboutsummaryrefslogtreecommitdiff
path: root/src/op/variable_access/set_local.c
diff options
context:
space:
mode:
authorXavier Del Campo Romero <xavi.dcr@tutanota.com>2024-05-22 14:04:36 +0200
committerXavier Del Campo Romero <xavi.dcr@tutanota.com>2024-06-12 13:38:05 +0200
commit4f9a2c7a2d8464b04cc08075a7762c6d457090df (patch)
treeae8fe229a3a5ba60d08b74299d0c1850685bda86 /src/op/variable_access/set_local.c
parentf25b015e5b668028c34974bbb22faa4105c26690 (diff)
downloadnanowasm-sync-4f9a2c7a2d8464b04cc08075a7762c6d457090df.tar.gz
WIP
Diffstat (limited to 'src/op/variable_access/set_local.c')
-rw-r--r--src/op/variable_access/set_local.c65
1 files changed, 38 insertions, 27 deletions
diff --git a/src/op/variable_access/set_local.c b/src/op/variable_access/set_local.c
index 8cf6440..d9ea884 100644
--- a/src/op/variable_access/set_local.c
+++ b/src/op/variable_access/set_local.c
@@ -7,6 +7,7 @@
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
+#include <nw/interp.h>
#include <nw/log.h>
#include <nw/ops.h>
#include <nanowasm/nw.h>
@@ -20,61 +21,71 @@
static int set_i32(struct nw_interp *const i, void *const data,
const varuint32 idx)
{
- const void *const stackptr = (const char *)i->cfg.stack.buf + i->stack_i;
- const int32_t *const src = (const int32_t *)stackptr - 1;
- int32_t *const dst = (int32_t *)data + idx;
+ int32_t *const a = data, v;
- *dst = *src;
+ if (interp_stack_pop(i, &v, sizeof v))
+ {
+ LOG("%s: interp_stack_pop failed\n", __func__);
+ return -1;
+ }
+
+ a[idx] = v;
return 0;
}
static int set_i64(struct nw_interp *const i, void *const data,
const varuint32 idx)
{
- const void *const stackptr = (const char *)i->cfg.stack.buf + i->stack_i;
- const int64_t *const src = (const int64_t *)stackptr - 1;
- int64_t *const dst = (int64_t *)data + idx;
+ int64_t *const a = data, v;
- *dst = *src;
+ if (interp_stack_pop(i, &v, sizeof v))
+ {
+ LOG("%s: interp_stack_pop failed\n", __func__);
+ return -1;
+ }
+
+ a[idx] = v;
return 0;
}
static int set_f32(struct nw_interp *const i, void *const data,
const varuint32 idx)
{
- const void *const stackptr = (const char *)i->cfg.stack.buf + i->stack_i;
- const float *const src = (const float *)stackptr - 1;
- float *const dst = (float *)data + idx;
+ float *const a = data, v;
- *dst = *src;
+ if (interp_stack_pop(i, &v, sizeof v))
+ {
+ LOG("%s: interp_stack_pop failed\n", __func__);
+ return -1;
+ }
+
+ a[idx] = v;
return 0;
}
static int set_f64(struct nw_interp *const i, void *const data,
const varuint32 idx)
{
- const void *const stackptr = (const char *)i->cfg.stack.buf + i->stack_i;
- const double *const src = (const double *)stackptr - 1;
- double *const dst = (double *)data + idx;
+ double *const a = data, v;
+
+ if (interp_stack_pop(i, &v, sizeof v))
+ {
+ LOG("%s: interp_stack_pop failed\n", __func__);
+ return -1;
+ }
- *dst = *src;
+ a[idx] = v;
return 0;
}
static int set_local(const varuint32 local_index, struct nw_interp *const i)
{
- struct nw_frame *fr;
varuint32 idx;
+ struct nw_locals *l;
- for (idx = local_index, fr = i->fp; fr; fr = fr->next)
- if (idx < fr->n_locals)
- break;
-
- if (!fr)
+ if (!locals_get(local_index, i, &l, &idx))
{
- LOG("%s: cannot access local variable %lu\n", __func__,
- (unsigned long)local_index);
- i->exception = "local variable index out of bounds";
+ LOG("%s: get_pos failed\n", __func__);
return -1;
}
@@ -86,9 +97,9 @@ static int set_local(const varuint32 local_index, struct nw_interp *const i)
[VALUE_TYPE_F64] = set_f64,
};
- if (set[fr->local_type](i, fr + 1, idx))
+ if (set[l->type](i, l + 1, idx))
{
- LOG("%s: set type %d failed\n", __func__, fr->local_type);
+ LOG("%s: set type %d failed\n", __func__, l->type);
return -1;
}