|
|
@@ -453,6 +453,9 @@ typedef struct InitValue {
|
|
|
WASMRefType ref_type;
|
|
|
#endif
|
|
|
WASMValue value;
|
|
|
+#if WASM_ENABLE_EXTENDED_CONST_EXPR != 0
|
|
|
+ InitializerExpression *expr;
|
|
|
+#endif
|
|
|
} InitValue;
|
|
|
|
|
|
typedef struct ConstExprContext {
|
|
|
@@ -477,7 +480,11 @@ push_const_expr_stack(ConstExprContext *ctx, uint8 flag, uint8 type,
|
|
|
#if WASM_ENABLE_GC != 0
|
|
|
WASMRefType *ref_type, uint8 gc_opcode,
|
|
|
#endif
|
|
|
- WASMValue *value, char *error_buf, uint32 error_buf_size)
|
|
|
+ WASMValue *value,
|
|
|
+#if WASM_ENABLE_EXTENDED_CONST_EXPR != 0
|
|
|
+ InitializerExpression *expr,
|
|
|
+#endif
|
|
|
+ char *error_buf, uint32 error_buf_size)
|
|
|
{
|
|
|
InitValue *cur_value;
|
|
|
|
|
|
@@ -503,6 +510,10 @@ push_const_expr_stack(ConstExprContext *ctx, uint8 flag, uint8 type,
|
|
|
cur_value->flag = flag;
|
|
|
cur_value->value = *value;
|
|
|
|
|
|
+#if WASM_ENABLE_EXTENDED_CONST_EXPR != 0
|
|
|
+ cur_value->expr = expr;
|
|
|
+#endif
|
|
|
+
|
|
|
#if WASM_ENABLE_GC != 0
|
|
|
cur_value->gc_opcode = gc_opcode;
|
|
|
if (wasm_is_type_multi_byte_type(type)) {
|
|
|
@@ -587,7 +598,11 @@ pop_const_expr_stack(ConstExprContext *ctx, uint8 *p_flag, uint8 type,
|
|
|
#if WASM_ENABLE_GC != 0
|
|
|
WASMRefType *ref_type, uint8 *p_gc_opcode,
|
|
|
#endif
|
|
|
- WASMValue *p_value, char *error_buf, uint32 error_buf_size)
|
|
|
+ WASMValue *p_value,
|
|
|
+#if WASM_ENABLE_EXTENDED_CONST_EXPR != 0
|
|
|
+ InitializerExpression **p_expr,
|
|
|
+#endif
|
|
|
+ char *error_buf, uint32 error_buf_size)
|
|
|
{
|
|
|
InitValue *cur_value;
|
|
|
|
|
|
@@ -623,7 +638,10 @@ pop_const_expr_stack(ConstExprContext *ctx, uint8 *p_flag, uint8 type,
|
|
|
if (p_gc_opcode)
|
|
|
*p_gc_opcode = cur_value->gc_opcode;
|
|
|
#endif
|
|
|
-
|
|
|
+#if WASM_ENABLE_EXTENDED_CONST_EXPR != 0
|
|
|
+ if (p_expr)
|
|
|
+ *p_expr = cur_value->expr;
|
|
|
+#endif
|
|
|
return true;
|
|
|
|
|
|
#if WASM_ENABLE_GC != 0
|
|
|
@@ -639,7 +657,7 @@ fail:
|
|
|
}
|
|
|
|
|
|
static void
|
|
|
-destroy_const_expr_stack(ConstExprContext *ctx)
|
|
|
+destroy_const_expr_stack(ConstExprContext *ctx, bool free_exprs)
|
|
|
{
|
|
|
#if WASM_ENABLE_GC != 0
|
|
|
uint32 i;
|
|
|
@@ -654,24 +672,62 @@ destroy_const_expr_stack(ConstExprContext *ctx)
|
|
|
}
|
|
|
}
|
|
|
#endif
|
|
|
+#if WASM_ENABLE_EXTENDED_CONST_EXPR != 0
|
|
|
+ if (free_exprs) {
|
|
|
+ for (uint32 j = 0; j < ctx->sp; j++) {
|
|
|
+ if (is_expr_binary_op(ctx->stack[j].expr->init_expr_type)) {
|
|
|
+ destroy_init_expr_recursive(ctx->stack[j].expr);
|
|
|
+ ctx->stack[j].expr = NULL;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+#endif
|
|
|
|
|
|
if (ctx->stack != ctx->data) {
|
|
|
wasm_runtime_free(ctx->stack);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-#if WASM_ENABLE_GC != 0
|
|
|
+#if WASM_ENABLE_GC != 0 || WASM_ENABLE_EXTENDED_CONST_EXPR != 0
|
|
|
static void
|
|
|
destroy_init_expr(WASMModule *module, InitializerExpression *expr)
|
|
|
{
|
|
|
+#if WASM_ENABLE_GC != 0
|
|
|
if (expr->init_expr_type == INIT_EXPR_TYPE_STRUCT_NEW
|
|
|
|| expr->init_expr_type == INIT_EXPR_TYPE_ARRAY_NEW
|
|
|
|| expr->init_expr_type == INIT_EXPR_TYPE_ARRAY_NEW_FIXED) {
|
|
|
- destroy_init_expr_data_recursive(module, expr->u.data);
|
|
|
+ destroy_init_expr_data_recursive(module, expr->u.unary.v.data);
|
|
|
}
|
|
|
+#endif
|
|
|
+
|
|
|
+#if WASM_ENABLE_EXTENDED_CONST_EXPR != 0
|
|
|
+ // free left expr and right exprs for binary oprand
|
|
|
+ if (!is_expr_binary_op(expr->init_expr_type)) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if (expr->u.binary.l_expr) {
|
|
|
+ destroy_init_expr_recursive(expr->u.binary.l_expr);
|
|
|
+ }
|
|
|
+ if (expr->u.binary.r_expr) {
|
|
|
+ destroy_init_expr_recursive(expr->u.binary.r_expr);
|
|
|
+ }
|
|
|
+ expr->u.binary.l_expr = expr->u.binary.r_expr = NULL;
|
|
|
+#endif
|
|
|
}
|
|
|
-#endif /* end of WASM_ENABLE_GC != 0 */
|
|
|
+#endif
|
|
|
|
|
|
+/* for init expr
|
|
|
+ * (data (i32.add (i32.const 0) (i32.sub (i32.const 1) (i32.const 2)))),
|
|
|
+ * the binary format is
|
|
|
+ * 0x11: 41 00 ; i32.const 0
|
|
|
+ * 0x13: 41 01 ; i32.const 1
|
|
|
+ * 0x15: 41 02 ; i32.const 2
|
|
|
+ * 0x17: 6b ; i32.sub
|
|
|
+ * 0x18: 6a ; i32.add
|
|
|
+ * for traversal: read opcodes and push them onto the stack. When encountering
|
|
|
+ * a binary opcode, pop two values from the stack which become the left and
|
|
|
+ * right child nodes of this binary operation node.
|
|
|
+ */
|
|
|
static bool
|
|
|
load_init_expr(WASMModule *module, const uint8 **p_buf, const uint8 *buf_end,
|
|
|
InitializerExpression *init_expr, uint8 type, void *ref_type,
|
|
|
@@ -687,6 +743,9 @@ load_init_expr(WASMModule *module, const uint8 **p_buf, const uint8 *buf_end,
|
|
|
uint8 opcode;
|
|
|
WASMRefType cur_ref_type = { 0 };
|
|
|
#endif
|
|
|
+#if WASM_ENABLE_EXTENDED_CONST_EXPR != 0
|
|
|
+ InitializerExpression *cur_expr = NULL;
|
|
|
+#endif
|
|
|
|
|
|
init_const_expr_stack(&const_expr_ctx, module);
|
|
|
|
|
|
@@ -699,24 +758,32 @@ load_init_expr(WASMModule *module, const uint8 **p_buf, const uint8 *buf_end,
|
|
|
case INIT_EXPR_TYPE_I32_CONST:
|
|
|
read_leb_int32(p, p_end, cur_value.i32);
|
|
|
|
|
|
- if (!push_const_expr_stack(
|
|
|
- &const_expr_ctx, flag, VALUE_TYPE_I32,
|
|
|
+ if (!push_const_expr_stack(&const_expr_ctx, flag,
|
|
|
+ VALUE_TYPE_I32,
|
|
|
#if WASM_ENABLE_GC != 0
|
|
|
- NULL, 0,
|
|
|
+ NULL, 0,
|
|
|
#endif
|
|
|
- &cur_value, error_buf, error_buf_size))
|
|
|
+ &cur_value,
|
|
|
+#if WASM_ENABLE_EXTENDED_CONST_EXPR != 0
|
|
|
+ NULL,
|
|
|
+#endif
|
|
|
+ error_buf, error_buf_size))
|
|
|
goto fail;
|
|
|
break;
|
|
|
/* i64.const */
|
|
|
case INIT_EXPR_TYPE_I64_CONST:
|
|
|
read_leb_int64(p, p_end, cur_value.i64);
|
|
|
|
|
|
- if (!push_const_expr_stack(
|
|
|
- &const_expr_ctx, flag, VALUE_TYPE_I64,
|
|
|
+ if (!push_const_expr_stack(&const_expr_ctx, flag,
|
|
|
+ VALUE_TYPE_I64,
|
|
|
#if WASM_ENABLE_GC != 0
|
|
|
- NULL, 0,
|
|
|
+ NULL, 0,
|
|
|
#endif
|
|
|
- &cur_value, error_buf, error_buf_size))
|
|
|
+ &cur_value,
|
|
|
+#if WASM_ENABLE_EXTENDED_CONST_EXPR != 0
|
|
|
+ NULL,
|
|
|
+#endif
|
|
|
+ error_buf, error_buf_size))
|
|
|
goto fail;
|
|
|
break;
|
|
|
/* f32.const */
|
|
|
@@ -726,12 +793,16 @@ load_init_expr(WASMModule *module, const uint8 **p_buf, const uint8 *buf_end,
|
|
|
for (i = 0; i < sizeof(float32); i++)
|
|
|
*p_float++ = *p++;
|
|
|
|
|
|
- if (!push_const_expr_stack(
|
|
|
- &const_expr_ctx, flag, VALUE_TYPE_F32,
|
|
|
+ if (!push_const_expr_stack(&const_expr_ctx, flag,
|
|
|
+ VALUE_TYPE_F32,
|
|
|
#if WASM_ENABLE_GC != 0
|
|
|
- NULL, 0,
|
|
|
+ NULL, 0,
|
|
|
+#endif
|
|
|
+ &cur_value,
|
|
|
+#if WASM_ENABLE_EXTENDED_CONST_EXPR != 0
|
|
|
+ NULL,
|
|
|
#endif
|
|
|
- &cur_value, error_buf, error_buf_size))
|
|
|
+ error_buf, error_buf_size))
|
|
|
goto fail;
|
|
|
break;
|
|
|
/* f64.const */
|
|
|
@@ -741,12 +812,16 @@ load_init_expr(WASMModule *module, const uint8 **p_buf, const uint8 *buf_end,
|
|
|
for (i = 0; i < sizeof(float64); i++)
|
|
|
*p_float++ = *p++;
|
|
|
|
|
|
- if (!push_const_expr_stack(
|
|
|
- &const_expr_ctx, flag, VALUE_TYPE_F64,
|
|
|
+ if (!push_const_expr_stack(&const_expr_ctx, flag,
|
|
|
+ VALUE_TYPE_F64,
|
|
|
#if WASM_ENABLE_GC != 0
|
|
|
- NULL, 0,
|
|
|
+ NULL, 0,
|
|
|
#endif
|
|
|
- &cur_value, error_buf, error_buf_size))
|
|
|
+ &cur_value,
|
|
|
+#if WASM_ENABLE_EXTENDED_CONST_EXPR != 0
|
|
|
+ NULL,
|
|
|
+#endif
|
|
|
+ error_buf, error_buf_size))
|
|
|
goto fail;
|
|
|
break;
|
|
|
#if WASM_ENABLE_SIMD != 0
|
|
|
@@ -767,12 +842,16 @@ load_init_expr(WASMModule *module, const uint8 **p_buf, const uint8 *buf_end,
|
|
|
cur_value.v128.i64x2[0] = high;
|
|
|
cur_value.v128.i64x2[1] = low;
|
|
|
|
|
|
- if (!push_const_expr_stack(
|
|
|
- &const_expr_ctx, flag, VALUE_TYPE_V128,
|
|
|
+ if (!push_const_expr_stack(&const_expr_ctx, flag,
|
|
|
+ VALUE_TYPE_V128,
|
|
|
#if WASM_ENABLE_GC != 0
|
|
|
- NULL, 0,
|
|
|
+ NULL, 0,
|
|
|
+#endif
|
|
|
+ &cur_value,
|
|
|
+#if WASM_ENABLE_EXTENDED_CONST_EXPR != 0
|
|
|
+ NULL,
|
|
|
#endif
|
|
|
- &cur_value, error_buf, error_buf_size))
|
|
|
+ error_buf, error_buf_size))
|
|
|
goto fail;
|
|
|
#if WASM_ENABLE_WAMR_COMPILER != 0
|
|
|
/* If any init_expr is v128.const, mark SIMD used */
|
|
|
@@ -783,7 +862,92 @@ load_init_expr(WASMModule *module, const uint8 **p_buf, const uint8 *buf_end,
|
|
|
#endif /* end of (WASM_ENABLE_WAMR_COMPILER != 0) || (WASM_ENABLE_JIT != 0) || \
|
|
|
(WASM_ENABLE_FAST_INTERP != 0) */
|
|
|
#endif /* end of WASM_ENABLE_SIMD */
|
|
|
+#if WASM_ENABLE_EXTENDED_CONST_EXPR != 0
|
|
|
+ case INIT_EXPR_TYPE_I32_ADD:
|
|
|
+ case INIT_EXPR_TYPE_I32_SUB:
|
|
|
+ case INIT_EXPR_TYPE_I32_MUL:
|
|
|
+ case INIT_EXPR_TYPE_I64_ADD:
|
|
|
+ case INIT_EXPR_TYPE_I64_SUB:
|
|
|
+ case INIT_EXPR_TYPE_I64_MUL:
|
|
|
+ {
|
|
|
+
|
|
|
+ InitializerExpression *l_expr, *r_expr;
|
|
|
+ WASMValue l_value, r_value;
|
|
|
+ uint8 l_flag, r_flag;
|
|
|
+ uint8 value_type;
|
|
|
+
|
|
|
+ if (flag == INIT_EXPR_TYPE_I32_ADD
|
|
|
+ || flag == INIT_EXPR_TYPE_I32_SUB
|
|
|
+ || flag == INIT_EXPR_TYPE_I32_MUL) {
|
|
|
+ value_type = VALUE_TYPE_I32;
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ value_type = VALUE_TYPE_I64;
|
|
|
+ }
|
|
|
|
|
|
+ /* If right flag indicates a binary operation, right expr will
|
|
|
+ * be popped from stack. Otherwise, allocate a new expr for
|
|
|
+ * right expr. Same for left expr.
|
|
|
+ */
|
|
|
+ if (!(pop_const_expr_stack(&const_expr_ctx, &r_flag, value_type,
|
|
|
+#if WASM_ENABLE_GC != 0
|
|
|
+ NULL, NULL,
|
|
|
+#endif
|
|
|
+ &r_value, &r_expr, error_buf,
|
|
|
+ error_buf_size))) {
|
|
|
+ goto fail;
|
|
|
+ }
|
|
|
+ if (!is_expr_binary_op(r_flag)) {
|
|
|
+ if (!(r_expr = loader_malloc(sizeof(InitializerExpression),
|
|
|
+ error_buf, error_buf_size))) {
|
|
|
+ goto fail;
|
|
|
+ }
|
|
|
+ r_expr->init_expr_type = r_flag;
|
|
|
+ r_expr->u.unary.v = r_value;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!(pop_const_expr_stack(&const_expr_ctx, &l_flag, value_type,
|
|
|
+#if WASM_ENABLE_GC != 0
|
|
|
+ NULL, NULL,
|
|
|
+#endif
|
|
|
+ &l_value, &l_expr, error_buf,
|
|
|
+ error_buf_size))) {
|
|
|
+ destroy_init_expr_recursive(r_expr);
|
|
|
+ goto fail;
|
|
|
+ }
|
|
|
+ if (!is_expr_binary_op(l_flag)) {
|
|
|
+ if (!(l_expr = loader_malloc(sizeof(InitializerExpression),
|
|
|
+ error_buf, error_buf_size))) {
|
|
|
+ destroy_init_expr_recursive(r_expr);
|
|
|
+ goto fail;
|
|
|
+ }
|
|
|
+ l_expr->init_expr_type = l_flag;
|
|
|
+ l_expr->u.unary.v = l_value;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!(cur_expr = loader_malloc(sizeof(InitializerExpression),
|
|
|
+ error_buf, error_buf_size))) {
|
|
|
+ destroy_init_expr_recursive(l_expr);
|
|
|
+ destroy_init_expr_recursive(r_expr);
|
|
|
+ goto fail;
|
|
|
+ }
|
|
|
+ cur_expr->init_expr_type = flag;
|
|
|
+ cur_expr->u.binary.l_expr = l_expr;
|
|
|
+ cur_expr->u.binary.r_expr = r_expr;
|
|
|
+
|
|
|
+ if (!push_const_expr_stack(&const_expr_ctx, flag, value_type,
|
|
|
+#if WASM_ENABLE_GC != 0
|
|
|
+ NULL, 0,
|
|
|
+#endif
|
|
|
+ &cur_value, cur_expr, error_buf,
|
|
|
+ error_buf_size)) {
|
|
|
+ destroy_init_expr_recursive(cur_expr);
|
|
|
+ goto fail;
|
|
|
+ }
|
|
|
+
|
|
|
+ break;
|
|
|
+ }
|
|
|
+#endif /* end of WASM_ENABLE_EXTENDED_CONST_EXPR */
|
|
|
#if WASM_ENABLE_REF_TYPES != 0 || WASM_ENABLE_GC != 0
|
|
|
/* ref.func */
|
|
|
case INIT_EXPR_TYPE_FUNCREF_CONST:
|
|
|
@@ -799,6 +963,9 @@ load_init_expr(WASMModule *module, const uint8 **p_buf, const uint8 *buf_end,
|
|
|
#if WASM_ENABLE_GC == 0
|
|
|
if (!push_const_expr_stack(&const_expr_ctx, flag,
|
|
|
VALUE_TYPE_FUNCREF, &cur_value,
|
|
|
+#if WASM_ENABLE_EXTENDED_CONST_EXPR != 0
|
|
|
+ NULL,
|
|
|
+#endif
|
|
|
error_buf, error_buf_size))
|
|
|
goto fail;
|
|
|
#else
|
|
|
@@ -816,8 +983,11 @@ load_init_expr(WASMModule *module, const uint8 **p_buf, const uint8 *buf_end,
|
|
|
false, type_idx);
|
|
|
if (!push_const_expr_stack(&const_expr_ctx, flag,
|
|
|
cur_ref_type.ref_type, &cur_ref_type,
|
|
|
- 0, &cur_value, error_buf,
|
|
|
- error_buf_size))
|
|
|
+ 0, &cur_value,
|
|
|
+#if WASM_ENABLE_EXTENDED_CONST_EXPR != 0
|
|
|
+ NULL,
|
|
|
+#endif
|
|
|
+ error_buf, error_buf_size))
|
|
|
goto fail;
|
|
|
#endif
|
|
|
#if WASM_ENABLE_WAMR_COMPILER != 0
|
|
|
@@ -837,8 +1007,11 @@ load_init_expr(WASMModule *module, const uint8 **p_buf, const uint8 *buf_end,
|
|
|
|
|
|
cur_value.ref_index = NULL_REF;
|
|
|
if (!push_const_expr_stack(&const_expr_ctx, flag, type1,
|
|
|
- &cur_value, error_buf,
|
|
|
- error_buf_size))
|
|
|
+ &cur_value,
|
|
|
+#if WASM_ENABLE_EXTENDED_CONST_EXPR != 0
|
|
|
+ NULL,
|
|
|
+#endif
|
|
|
+ error_buf, error_buf_size))
|
|
|
goto fail;
|
|
|
#else
|
|
|
int32 heap_type;
|
|
|
@@ -861,13 +1034,19 @@ load_init_expr(WASMModule *module, const uint8 **p_buf, const uint8 *buf_end,
|
|
|
if (!push_const_expr_stack(&const_expr_ctx, flag,
|
|
|
cur_ref_type.ref_type,
|
|
|
&cur_ref_type, 0, &cur_value,
|
|
|
+#if WASM_ENABLE_EXTENDED_CONST_EXPR != 0
|
|
|
+ NULL,
|
|
|
+#endif
|
|
|
error_buf, error_buf_size))
|
|
|
goto fail;
|
|
|
}
|
|
|
else {
|
|
|
if (!push_const_expr_stack(&const_expr_ctx, flag, type1,
|
|
|
- NULL, 0, &cur_value, error_buf,
|
|
|
- error_buf_size))
|
|
|
+ NULL, 0, &cur_value,
|
|
|
+#if WASM_ENABLE_EXTENDED_CONST_EXPR != 0
|
|
|
+ NULL,
|
|
|
+#endif
|
|
|
+ error_buf, error_buf_size))
|
|
|
goto fail;
|
|
|
}
|
|
|
#endif
|
|
|
@@ -956,8 +1135,11 @@ load_init_expr(WASMModule *module, const uint8 **p_buf, const uint8 *buf_end,
|
|
|
#if WASM_ENABLE_GC != 0
|
|
|
&cur_ref_type, 0,
|
|
|
#endif
|
|
|
- &cur_value, error_buf,
|
|
|
- error_buf_size))
|
|
|
+ &cur_value,
|
|
|
+#if WASM_ENABLE_EXTENDED_CONST_EXPR != 0
|
|
|
+ NULL,
|
|
|
+#endif
|
|
|
+ error_buf, error_buf_size))
|
|
|
goto fail;
|
|
|
|
|
|
break;
|
|
|
@@ -1020,6 +1202,9 @@ load_init_expr(WASMModule *module, const uint8 **p_buf, const uint8 *buf_end,
|
|
|
&const_expr_ctx, NULL, field_type,
|
|
|
field_ref_type, NULL,
|
|
|
&struct_init_values->fields[field_idx],
|
|
|
+#if WASM_ENABLE_EXTENDED_CONST_EXPR != 0
|
|
|
+ NULL,
|
|
|
+#endif
|
|
|
error_buf, error_buf_size)) {
|
|
|
destroy_init_expr_data_recursive(
|
|
|
module, struct_init_values);
|
|
|
@@ -1033,6 +1218,9 @@ load_init_expr(WASMModule *module, const uint8 **p_buf, const uint8 *buf_end,
|
|
|
if (!push_const_expr_stack(
|
|
|
&const_expr_ctx, flag, cur_ref_type.ref_type,
|
|
|
&cur_ref_type, (uint8)opcode1, &cur_value,
|
|
|
+#if WASM_ENABLE_EXTENDED_CONST_EXPR != 0
|
|
|
+ NULL,
|
|
|
+#endif
|
|
|
error_buf, error_buf_size)) {
|
|
|
destroy_init_expr_data_recursive(
|
|
|
module, struct_init_values);
|
|
|
@@ -1064,6 +1252,9 @@ load_init_expr(WASMModule *module, const uint8 **p_buf, const uint8 *buf_end,
|
|
|
if (!push_const_expr_stack(
|
|
|
&const_expr_ctx, flag, cur_ref_type.ref_type,
|
|
|
&cur_ref_type, (uint8)opcode1, &cur_value,
|
|
|
+#if WASM_ENABLE_EXTENDED_CONST_EXPR != 0
|
|
|
+ NULL,
|
|
|
+#endif
|
|
|
error_buf, error_buf_size)) {
|
|
|
goto fail;
|
|
|
}
|
|
|
@@ -1112,8 +1303,11 @@ load_init_expr(WASMModule *module, const uint8 **p_buf, const uint8 *buf_end,
|
|
|
|
|
|
if (!pop_const_expr_stack(
|
|
|
&const_expr_ctx, NULL, VALUE_TYPE_I32,
|
|
|
- NULL, NULL, &len_val, error_buf,
|
|
|
- error_buf_size)) {
|
|
|
+ NULL, NULL, &len_val,
|
|
|
+#if WASM_ENABLE_EXTENDED_CONST_EXPR != 0
|
|
|
+ NULL,
|
|
|
+#endif
|
|
|
+ error_buf, error_buf_size)) {
|
|
|
goto fail;
|
|
|
}
|
|
|
|
|
|
@@ -1132,6 +1326,9 @@ load_init_expr(WASMModule *module, const uint8 **p_buf, const uint8 *buf_end,
|
|
|
&const_expr_ctx, NULL, elem_type,
|
|
|
elem_ref_type, NULL,
|
|
|
&array_init_values->elem_data[0],
|
|
|
+#if WASM_ENABLE_EXTENDED_CONST_EXPR != 0
|
|
|
+ NULL,
|
|
|
+#endif
|
|
|
error_buf, error_buf_size)) {
|
|
|
destroy_init_expr_data_recursive(
|
|
|
module, array_init_values);
|
|
|
@@ -1164,6 +1361,9 @@ load_init_expr(WASMModule *module, const uint8 **p_buf, const uint8 *buf_end,
|
|
|
elem_ref_type, NULL,
|
|
|
&array_init_values
|
|
|
->elem_data[i - 1],
|
|
|
+#if WASM_ENABLE_EXTENDED_CONST_EXPR != 0
|
|
|
+ NULL,
|
|
|
+#endif
|
|
|
error_buf, error_buf_size)) {
|
|
|
destroy_init_expr_data_recursive(
|
|
|
module, array_init_values);
|
|
|
@@ -1180,10 +1380,13 @@ load_init_expr(WASMModule *module, const uint8 **p_buf, const uint8 *buf_end,
|
|
|
uint32 len;
|
|
|
|
|
|
/* POP(i32) */
|
|
|
- if (!pop_const_expr_stack(&const_expr_ctx, NULL,
|
|
|
- VALUE_TYPE_I32, NULL,
|
|
|
- NULL, &len_val, error_buf,
|
|
|
- error_buf_size)) {
|
|
|
+ if (!pop_const_expr_stack(
|
|
|
+ &const_expr_ctx, NULL, VALUE_TYPE_I32, NULL,
|
|
|
+ NULL, &len_val,
|
|
|
+#if WASM_ENABLE_EXTENDED_CONST_EXPR != 0
|
|
|
+ NULL,
|
|
|
+#endif
|
|
|
+ error_buf, error_buf_size)) {
|
|
|
goto fail;
|
|
|
}
|
|
|
len = len_val.i32;
|
|
|
@@ -1197,6 +1400,9 @@ load_init_expr(WASMModule *module, const uint8 **p_buf, const uint8 *buf_end,
|
|
|
if (!push_const_expr_stack(
|
|
|
&const_expr_ctx, flag, cur_ref_type.ref_type,
|
|
|
&cur_ref_type, (uint8)opcode1, &cur_value,
|
|
|
+#if WASM_ENABLE_EXTENDED_CONST_EXPR != 0
|
|
|
+ NULL,
|
|
|
+#endif
|
|
|
error_buf, error_buf_size)) {
|
|
|
if (array_init_values) {
|
|
|
destroy_init_expr_data_recursive(
|
|
|
@@ -1223,9 +1429,13 @@ load_init_expr(WASMModule *module, const uint8 **p_buf, const uint8 *buf_end,
|
|
|
case WASM_OP_REF_I31:
|
|
|
{
|
|
|
/* POP(i32) */
|
|
|
- if (!pop_const_expr_stack(
|
|
|
- &const_expr_ctx, NULL, VALUE_TYPE_I32, NULL,
|
|
|
- NULL, &cur_value, error_buf, error_buf_size)) {
|
|
|
+ if (!pop_const_expr_stack(&const_expr_ctx, NULL,
|
|
|
+ VALUE_TYPE_I32, NULL, NULL,
|
|
|
+ &cur_value,
|
|
|
+#if WASM_ENABLE_EXTENDED_CONST_EXPR != 0
|
|
|
+ NULL,
|
|
|
+#endif
|
|
|
+ error_buf, error_buf_size)) {
|
|
|
goto fail;
|
|
|
}
|
|
|
|
|
|
@@ -1234,6 +1444,9 @@ load_init_expr(WASMModule *module, const uint8 **p_buf, const uint8 *buf_end,
|
|
|
if (!push_const_expr_stack(
|
|
|
&const_expr_ctx, flag, cur_ref_type.ref_type,
|
|
|
&cur_ref_type, (uint8)opcode1, &cur_value,
|
|
|
+#if WASM_ENABLE_EXTENDED_CONST_EXPR != 0
|
|
|
+ NULL,
|
|
|
+#endif
|
|
|
error_buf, error_buf_size)) {
|
|
|
goto fail;
|
|
|
}
|
|
|
@@ -1268,7 +1481,11 @@ load_init_expr(WASMModule *module, const uint8 **p_buf, const uint8 *buf_end,
|
|
|
#if WASM_ENABLE_GC != 0
|
|
|
ref_type, &opcode,
|
|
|
#endif
|
|
|
- &cur_value, error_buf, error_buf_size)) {
|
|
|
+ &cur_value,
|
|
|
+#if WASM_ENABLE_EXTENDED_CONST_EXPR != 0
|
|
|
+ &cur_expr,
|
|
|
+#endif
|
|
|
+ error_buf, error_buf_size)) {
|
|
|
goto fail;
|
|
|
}
|
|
|
|
|
|
@@ -1278,8 +1495,21 @@ load_init_expr(WASMModule *module, const uint8 **p_buf, const uint8 *buf_end,
|
|
|
goto fail;
|
|
|
}
|
|
|
|
|
|
+#if WASM_ENABLE_EXTENDED_CONST_EXPR != 0
|
|
|
+ if (cur_expr != NULL) {
|
|
|
+ bh_memcpy_s(init_expr, sizeof(InitializerExpression), cur_expr,
|
|
|
+ sizeof(InitializerExpression));
|
|
|
+ wasm_runtime_free(cur_expr);
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ init_expr->init_expr_type = flag;
|
|
|
+ init_expr->u.unary.v = cur_value;
|
|
|
+ }
|
|
|
+
|
|
|
+#else
|
|
|
init_expr->init_expr_type = flag;
|
|
|
- init_expr->u = cur_value;
|
|
|
+ init_expr->u.unary.v = cur_value;
|
|
|
+#endif /* end of WASM_ENABLE_EXTENDED_CONST_EXPR != 0 */
|
|
|
|
|
|
#if WASM_ENABLE_GC != 0
|
|
|
if (init_expr->init_expr_type == WASM_OP_GC_PREFIX) {
|
|
|
@@ -1310,11 +1540,11 @@ load_init_expr(WASMModule *module, const uint8 **p_buf, const uint8 *buf_end,
|
|
|
#endif /* end of WASM_ENABLE_GC != 0 */
|
|
|
|
|
|
*p_buf = p;
|
|
|
- destroy_const_expr_stack(&const_expr_ctx);
|
|
|
+ destroy_const_expr_stack(&const_expr_ctx, false);
|
|
|
return true;
|
|
|
|
|
|
fail:
|
|
|
- destroy_const_expr_stack(&const_expr_ctx);
|
|
|
+ destroy_const_expr_stack(&const_expr_ctx, true);
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
@@ -4072,9 +4302,9 @@ load_global_section(const uint8 *buf, const uint8 *buf_end, WASMModule *module,
|
|
|
if (global->init_expr.init_expr_type == INIT_EXPR_TYPE_GET_GLOBAL) {
|
|
|
uint8 global_type;
|
|
|
WASMRefType *global_ref_type;
|
|
|
- uint32 global_idx = global->init_expr.u.global_index;
|
|
|
+ uint32 global_idx = global->init_expr.u.unary.v.global_index;
|
|
|
|
|
|
- if (global->init_expr.u.global_index
|
|
|
+ if (global->init_expr.u.unary.v.global_index
|
|
|
>= module->import_global_count + i) {
|
|
|
set_error_buf(error_buf, error_buf_size, "unknown global");
|
|
|
return false;
|
|
|
@@ -4471,7 +4701,7 @@ load_func_index_vec(const uint8 **p_buf, const uint8 *buf_end,
|
|
|
}
|
|
|
|
|
|
init_expr->init_expr_type = INIT_EXPR_TYPE_FUNCREF_CONST;
|
|
|
- init_expr->u.ref_index = function_index;
|
|
|
+ init_expr->u.unary.v.ref_index = function_index;
|
|
|
}
|
|
|
|
|
|
*p_buf = p;
|
|
|
@@ -4744,7 +4974,7 @@ load_table_segment_section(const uint8 *buf, const uint8 *buf_end,
|
|
|
|
|
|
#if WASM_ENABLE_MEMORY64 != 0
|
|
|
if (table_elem_idx_type == VALUE_TYPE_I64
|
|
|
- && table_segment->base_offset.u.u64 > UINT32_MAX) {
|
|
|
+ && table_segment->base_offset.u.unary.v.u64 > UINT32_MAX) {
|
|
|
set_error_buf(error_buf, error_buf_size,
|
|
|
"In table64, table base offset can't be "
|
|
|
"larger than UINT32_MAX");
|
|
|
@@ -4904,6 +5134,9 @@ load_data_segment_section(const uint8 *buf, const uint8 *buf_end,
|
|
|
|
|
|
if (!(dataseg = module->data_segments[i] = loader_malloc(
|
|
|
sizeof(WASMDataSeg), error_buf, error_buf_size))) {
|
|
|
+#if WASM_ENABLE_EXTENDED_CONST_EXPR != 0
|
|
|
+ destroy_init_expr(module, &init_expr);
|
|
|
+#endif
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
@@ -6031,7 +6264,8 @@ load_from_sections(WASMModule *module, WASMSection *sections,
|
|
|
&& global->init_expr.init_expr_type
|
|
|
== INIT_EXPR_TYPE_I32_CONST) {
|
|
|
aux_heap_base_global = global;
|
|
|
- aux_heap_base = (uint64)(uint32)global->init_expr.u.i32;
|
|
|
+ aux_heap_base =
|
|
|
+ (uint64)(uint32)global->init_expr.u.unary.v.i32;
|
|
|
aux_heap_base_global_index = export->index;
|
|
|
LOG_VERBOSE("Found aux __heap_base global, value: %" PRIu64,
|
|
|
aux_heap_base);
|
|
|
@@ -6052,7 +6286,8 @@ load_from_sections(WASMModule *module, WASMSection *sections,
|
|
|
&& global->init_expr.init_expr_type
|
|
|
== INIT_EXPR_TYPE_I32_CONST) {
|
|
|
aux_data_end_global = global;
|
|
|
- aux_data_end = (uint64)(uint32)global->init_expr.u.i32;
|
|
|
+ aux_data_end =
|
|
|
+ (uint64)(uint32)global->init_expr.u.unary.v.i32;
|
|
|
aux_data_end_global_index = export->index;
|
|
|
LOG_VERBOSE("Found aux __data_end global, value: %" PRIu64,
|
|
|
aux_data_end);
|
|
|
@@ -6093,10 +6328,11 @@ load_from_sections(WASMModule *module, WASMSection *sections,
|
|
|
&& global->type.val_type == VALUE_TYPE_I32
|
|
|
&& global->init_expr.init_expr_type
|
|
|
== INIT_EXPR_TYPE_I32_CONST
|
|
|
- && (uint64)(uint32)global->init_expr.u.i32
|
|
|
+ && (uint64)(uint32)global->init_expr.u.unary.v.i32
|
|
|
<= aux_heap_base) {
|
|
|
aux_stack_top_global = global;
|
|
|
- aux_stack_top = (uint64)(uint32)global->init_expr.u.i32;
|
|
|
+ aux_stack_top =
|
|
|
+ (uint64)(uint32)global->init_expr.u.unary.v.i32;
|
|
|
module->aux_stack_top_global_index =
|
|
|
module->import_global_count + global_index;
|
|
|
module->aux_stack_bottom = aux_stack_top;
|
|
|
@@ -6947,7 +7183,7 @@ wasm_loader_unload(WASMModule *module)
|
|
|
wasm_runtime_free(module->memories);
|
|
|
|
|
|
if (module->globals) {
|
|
|
-#if WASM_ENABLE_GC != 0
|
|
|
+#if WASM_ENABLE_GC != 0 || WASM_ENABLE_EXTENDED_CONST_EXPR != 0
|
|
|
for (i = 0; i < module->global_count; i++) {
|
|
|
destroy_init_expr(module, &module->globals[i].init_expr);
|
|
|
}
|
|
|
@@ -6980,6 +7216,9 @@ wasm_loader_unload(WASMModule *module)
|
|
|
#endif
|
|
|
wasm_runtime_free(module->table_segments[i].init_values);
|
|
|
}
|
|
|
+#if WASM_ENABLE_EXTENDED_CONST_EXPR != 0
|
|
|
+ destroy_init_expr(module, &module->table_segments[i].base_offset);
|
|
|
+#endif
|
|
|
}
|
|
|
wasm_runtime_free(module->table_segments);
|
|
|
}
|
|
|
@@ -6989,6 +7228,10 @@ wasm_loader_unload(WASMModule *module)
|
|
|
if (module->data_segments[i]) {
|
|
|
if (module->data_segments[i]->is_data_cloned)
|
|
|
wasm_runtime_free(module->data_segments[i]->data);
|
|
|
+#if WASM_ENABLE_EXTENDED_CONST_EXPR != 0
|
|
|
+ destroy_init_expr(module,
|
|
|
+ &(module->data_segments[i]->base_offset));
|
|
|
+#endif
|
|
|
wasm_runtime_free(module->data_segments[i]);
|
|
|
}
|
|
|
}
|
|
|
@@ -13260,7 +13503,8 @@ re_scan:
|
|
|
== VALUE_TYPE_FUNCREF
|
|
|
&& module->globals[i].init_expr.init_expr_type
|
|
|
== INIT_EXPR_TYPE_FUNCREF_CONST
|
|
|
- && module->globals[i].init_expr.u.u32 == func_idx) {
|
|
|
+ && module->globals[i].init_expr.u.unary.v.u32
|
|
|
+ == func_idx) {
|
|
|
func_declared = true;
|
|
|
break;
|
|
|
}
|
|
|
@@ -13289,7 +13533,8 @@ re_scan:
|
|
|
#endif
|
|
|
) {
|
|
|
for (j = 0; j < table_seg->value_count; j++) {
|
|
|
- if (table_seg->init_values[j].u.ref_index
|
|
|
+ if (table_seg->init_values[j]
|
|
|
+ .u.unary.v.ref_index
|
|
|
== func_idx) {
|
|
|
func_declared = true;
|
|
|
break;
|