From fb2a89cbfc5049d360bb734b4896946e9963e39a Mon Sep 17 00:00:00 2001 From: Alice Frosi Date: Fri, 2 Jun 2023 14:25:30 +0200 Subject: cooker, seitan: fix some bugs for op call cooker: - added missing OP_CALL type - local copy of the offset for the type STRUCT - fix return offset - added type LONG in emit_data seitan: - check context if NULL - fix ptr dereference - added a couple of debug print - added error message in seitan for eval --- cooker/call.c | 7 +++---- cooker/emit.c | 8 ++++++-- 2 files changed, 9 insertions(+), 6 deletions(-) (limited to 'cooker') diff --git a/cooker/call.c b/cooker/call.c index db2d6b8..9561568 100644 --- a/cooker/call.c +++ b/cooker/call.c @@ -57,7 +57,7 @@ Examples of arguments: parse_arg() passes ro_data offset - STRUCT: 1, 2 write struct to ro_data, and pointer to it - parse_tag() passes ro_data offset + parse_arg() passes ro_data offset - STRUCT: "get" write pointer to tag parse_arg() passes null offset @@ -208,14 +208,14 @@ static union value parse_field(struct gluten_ctx *g, struct arg *args, break; case STRUCT: for (f_inner = f->desc.d_struct; f_inner->name; f_inner++) { + struct gluten_offset struct_start = offset; JSON_Value *f_value; tmp1 = json_value_get_object(jvalue); f_value = json_object_get_value(tmp1, f_inner->name); if (!f_value) continue; - - parse_field(g, args, &offset, index, f_inner, f_value, + parse_field(g, args, &struct_start, index, f_inner, f_value, false, add); } break; @@ -323,7 +323,6 @@ static struct gluten_offset parse_arg(struct gluten_ctx *g, struct arg *args, offset = gluten_rw_alloc(g, a->f.size); else if (a->f.size && !top_level_tag) offset = gluten_ro_alloc(g, a->f.size); - parse_field(g, args, &offset, a->pos, &a->f, jvalue, false, false); return offset; diff --git a/cooker/emit.c b/cooker/emit.c index 705df4b..05e3f81 100644 --- a/cooker/emit.c +++ b/cooker/emit.c @@ -73,6 +73,7 @@ void emit_call(struct gluten_ctx *g, struct ns_spec *ns, long nr, unsigned ns_count, i; struct ns_spec *ctx; + op->type = OP_CALL; for (ns_count = 0; ns[ns_count].spec != NS_SPEC_NONE; ns_count++); if (ns_count) { @@ -92,14 +93,16 @@ void emit_call(struct gluten_ctx *g, struct ns_spec *ns, long nr, desc->arg_deref |= BIT(i) * is_ptr[i]; desc->context = o1; memcpy(desc->args, offset, sizeof(struct gluten_offset) * count); - desc->args[count + 1] = ret_offset; + desc->args[count] = ret_offset; debug(" %i: OP_CALL: %i, arguments:", g->ip.offset, nr); for (i = 0; i < count; i++) { debug("\t%i: %s %s%i", i, gluten_offset_name[offset[i].type], is_ptr[i] ? "*" : "", offset[i].offset); } - + if (desc->has_ret) + debug("\treturn: %s %i", gluten_offset_name[ret_offset.type], + offset[i].offset); call->desc = o2; if (++g->ip.offset > INST_MAX) @@ -298,6 +301,7 @@ static struct gluten_offset emit_data_do(struct gluten_ctx *g, } break; + case LONG: case U64: if (add) { *(uint64_t *)p |= value->v_num; -- cgit v1.2.3