@@ -967,13 +967,29 @@ destroy_import_memories(AOTImportMemory *import_memories)
967
967
wasm_runtime_free (import_memories );
968
968
}
969
969
970
+ /**
971
+ * Free memory initialization data segments.
972
+ *
973
+ * @param module the AOT module containing the data
974
+ * @param data_list array of memory initialization data segments to free
975
+ * @param count number of segments in the data_list array
976
+ */
977
+
970
978
static void
971
- destroy_mem_init_data_list (AOTMemInitData * * data_list , uint32 count )
979
+ destroy_mem_init_data_list (AOTModule * module , AOTMemInitData * * data_list ,
980
+ uint32 count )
972
981
{
973
982
uint32 i ;
983
+ /* Free each memory initialization data segment */
974
984
for (i = 0 ; i < count ; i ++ )
975
- if (data_list [i ])
985
+ if (data_list [i ]) {
986
+ /* If the module owns the binary data, free the bytes buffer */
987
+ if (module -> is_binary_freeable && data_list [i ]-> bytes )
988
+ wasm_runtime_free (data_list [i ]-> bytes );
989
+ /* Free the data segment structure itself */
976
990
wasm_runtime_free (data_list [i ]);
991
+ }
992
+ /* Free the array of data segment pointers */
977
993
wasm_runtime_free (data_list );
978
994
}
979
995
@@ -982,6 +998,22 @@ load_init_expr(const uint8 **p_buf, const uint8 *buf_end, AOTModule *module,
982
998
InitializerExpression * expr , char * error_buf ,
983
999
uint32 error_buf_size );
984
1000
1001
+ /**
1002
+ * Load memory initialization data segments from the AOT module.
1003
+ *
1004
+ * This function reads memory initialization data segments from the buffer and
1005
+ * creates AOTMemInitData structures for each segment. The data can either be
1006
+ * cloned into new memory or referenced directly from the buffer.
1007
+ *
1008
+ * @param p_buf pointer to buffer containing memory init data
1009
+ * @param buf_end end of buffer
1010
+ * @param module the AOT module being loaded
1011
+ * @param error_buf buffer for error messages
1012
+ * @param error_buf_size size of error buffer
1013
+ *
1014
+ * @return true if successful, false if error occurred
1015
+ */
1016
+
985
1017
static bool
986
1018
load_mem_init_data_list (const uint8 * * p_buf , const uint8 * buf_end ,
987
1019
AOTModule * module , char * error_buf ,
@@ -1013,8 +1045,8 @@ load_mem_init_data_list(const uint8 **p_buf, const uint8 *buf_end,
1013
1045
return false;
1014
1046
}
1015
1047
read_uint32 (buf , buf_end , byte_count );
1016
- size = offsetof( AOTMemInitData , bytes ) + ( uint64 ) byte_count ;
1017
- if (!( data_list [ i ] = loader_malloc ( size , error_buf , error_buf_size ))) {
1048
+ if (!( data_list [ i ] = loader_malloc ( sizeof ( AOTMemInitData ), error_buf ,
1049
+ error_buf_size ))) {
1018
1050
return false;
1019
1051
}
1020
1052
@@ -1026,8 +1058,22 @@ load_mem_init_data_list(const uint8 **p_buf, const uint8 *buf_end,
1026
1058
data_list [i ]-> offset .init_expr_type = init_value .init_expr_type ;
1027
1059
data_list [i ]-> offset .u = init_value .u ;
1028
1060
data_list [i ]-> byte_count = byte_count ;
1029
- read_byte_array (buf , buf_end , data_list [i ]-> bytes ,
1030
- data_list [i ]-> byte_count );
1061
+ data_list [i ]-> bytes = NULL ;
1062
+ /* If the module owns the binary data, clone the bytes buffer */
1063
+ if (module -> is_binary_freeable ) {
1064
+ if (byte_count > 0 ) {
1065
+ if (!(data_list [i ]-> bytes = loader_malloc (byte_count , error_buf ,
1066
+ error_buf_size ))) {
1067
+ return false;
1068
+ }
1069
+ read_byte_array (buf , buf_end , data_list [i ]-> bytes ,
1070
+ data_list [i ]-> byte_count );
1071
+ }
1072
+ }
1073
+ else {
1074
+ data_list [i ]-> bytes = (uint8 * )buf ;
1075
+ buf += byte_count ;
1076
+ }
1031
1077
}
1032
1078
1033
1079
* p_buf = buf ;
@@ -1036,6 +1082,21 @@ load_mem_init_data_list(const uint8 **p_buf, const uint8 *buf_end,
1036
1082
return false;
1037
1083
}
1038
1084
1085
+ /**
1086
+ * Load memory information from the AOT module.
1087
+ *
1088
+ * This function reads memory-related data including import memory count,
1089
+ * memory count, memory flags, page sizes, and memory initialization data.
1090
+ *
1091
+ * @param p_buf pointer to buffer containing memory info
1092
+ * @param buf_end end of buffer
1093
+ * @param module the AOT module being loaded
1094
+ * @param error_buf buffer for error messages
1095
+ * @param error_buf_size size of error buffer
1096
+ *
1097
+ * @return true if successful, false if error occurred
1098
+ */
1099
+
1039
1100
static bool
1040
1101
load_memory_info (const uint8 * * p_buf , const uint8 * buf_end , AOTModule * module ,
1041
1102
char * error_buf , uint32 error_buf_size )
@@ -4356,7 +4417,7 @@ aot_unload(AOTModule *module)
4356
4417
wasm_runtime_free (module -> memories );
4357
4418
4358
4419
if (module -> mem_init_data_list )
4359
- destroy_mem_init_data_list (module -> mem_init_data_list ,
4420
+ destroy_mem_init_data_list (module , module -> mem_init_data_list ,
4360
4421
module -> mem_init_data_count );
4361
4422
4362
4423
if (module -> native_symbol_list )
0 commit comments