@@ -3227,29 +3227,31 @@ cmp_export_name(const void *a, const void *b)
32273227 return strcmp(*(char **)a, *(char **)b);
32283228}
32293229
3230- static int
3231- cmp_import_kind(const void *a, const void *b)
3232- {
3233- const WASMImport *import_a = (const WASMImport *)a;
3234- const WASMImport *import_b = (const WASMImport *)b;
3235- // kind: 0x00/0x01/0x02/0x03/0x04
3236- return import_a->kind - import_b->kind;
3237- }
3230+ // static int
3231+ // cmp_import_kind(const void *a, const void *b)
3232+ // {
3233+ // const WASMImport *import_a = (const WASMImport *)a;
3234+ // const WASMImport *import_b = (const WASMImport *)b;
3235+ // // kind: 0x00/0x01/0x02/0x03/0x04
3236+ // return import_a->kind - import_b->kind;
3237+ // }
32383238
32393239static bool
32403240load_import_section(const uint8 *buf, const uint8 *buf_end, WASMModule *module,
32413241 bool is_load_from_file_buf, bool no_resolve,
32423242 char *error_buf, uint32 error_buf_size)
32433243{
3244- const uint8 *p = buf, *p_end = buf_end;
3245- uint32 import_count, name_len, type_index, i, u32;
3244+ const uint8 *p = buf, *p_end = buf_end, *p_old ;
3245+ uint32 import_count, name_len, type_index, i, u32, flags ;
32463246 uint64 total_size;
32473247 WASMImport *import;
3248+ WASMImport *import_functions = NULL, *import_tables = NULL;
3249+ WASMImport *import_memories = NULL, *import_globals = NULL;
32483250#if WASM_ENABLE_TAGS != 0
32493251 WASMImport *import_tags = NULL;
32503252#endif
32513253 char *sub_module_name, *field_name;
3252- uint8 u8, kind;
3254+ uint8 u8, kind, global_type ;
32533255
32543256 read_leb_uint32(p, p_end, import_count);
32553257
@@ -3261,10 +3263,137 @@ load_import_section(const uint8 *buf, const uint8 *buf_end, WASMModule *module,
32613263 return false;
32623264 }
32633265
3264- import = module->imports;
3266+ p_old = p;
3267+
3268+ /* Scan firstly to get import count of each type */
3269+ for (i = 0; i < import_count; i++) {
3270+ /* module name */
3271+ read_leb_uint32(p, p_end, name_len);
3272+ CHECK_BUF(p, p_end, name_len);
3273+ p += name_len;
3274+
3275+ /* field name */
3276+ read_leb_uint32(p, p_end, name_len);
3277+ CHECK_BUF(p, p_end, name_len);
3278+ p += name_len;
3279+
3280+ CHECK_BUF(p, p_end, 1);
3281+ /* 0x00/0x01/0x02/0x03/0x04 */
3282+ kind = read_uint8(p);
3283+
3284+ switch (kind) {
3285+ case IMPORT_KIND_FUNC: /* import function */
3286+ read_leb_uint32(p, p_end, type_index);
3287+ module->import_function_count++;
3288+ break;
3289+
3290+ case IMPORT_KIND_TABLE: /* import table */
3291+ CHECK_BUF(p, p_end, 1);
3292+ /* 0x70 */
3293+ u8 = read_uint8(p);
3294+ read_leb_uint32(p, p_end, flags);
3295+ read_leb_uint32(p, p_end, u32);
3296+ if (flags & 1)
3297+ read_leb_uint32(p, p_end, u32);
3298+ module->import_table_count++;
3299+
3300+ if (module->import_table_count > 1) {
3301+ #if WASM_ENABLE_REF_TYPES == 0 && WASM_ENABLE_GC == 0
3302+ set_error_buf(error_buf, error_buf_size,
3303+ "multiple tables");
3304+ return false;
3305+ #elif WASM_ENABLE_WAMR_COMPILER != 0
3306+ module->is_ref_types_used = true;
3307+ #endif
3308+ }
3309+ break;
3310+
3311+ case IMPORT_KIND_MEMORY: /* import memory */
3312+ read_leb_uint32(p, p_end, flags);
3313+ read_leb_uint32(p, p_end, u32);
3314+ if (flags & 1)
3315+ read_leb_uint32(p, p_end, u32);
3316+ module->import_memory_count++;
3317+ #if WASM_ENABLE_MULTI_MEMORY == 0
3318+ if (module->import_memory_count > 1) {
3319+ set_error_buf(error_buf, error_buf_size,
3320+ "multiple memories");
3321+ return false;
3322+ }
3323+ #endif
3324+ break;
3325+
3326+ #if WASM_ENABLE_TAGS != 0
3327+ case IMPORT_KIND_TAG: /* import tags */
3328+ /* it only counts the number of tags to import */
3329+ module->import_tag_count++;
3330+ CHECK_BUF(p, p_end, 1);
3331+ u8 = read_uint8(p);
3332+ read_leb_uint32(p, p_end, type_index);
3333+ break;
3334+ #endif
3335+
3336+ case IMPORT_KIND_GLOBAL: /* import global */
3337+ #if WASM_ENABLE_GC != 0
3338+ /* valtype */
3339+ CHECK_BUF(p, p_end, 1);
3340+ global_type = read_uint8(p);
3341+ if (wasm_is_type_multi_byte_type(global_type)) {
3342+ int32 heap_type;
3343+ read_leb_int32(p, p_end, heap_type);
3344+ (void)heap_type;
3345+ }
3346+
3347+ /* mutability */
3348+ CHECK_BUF(p, p_end, 1);
3349+ p += 1;
3350+ #else
3351+ CHECK_BUF(p, p_end, 2);
3352+ p += 2;
3353+ #endif
3354+
3355+ (void)global_type;
3356+ module->import_global_count++;
3357+ break;
3358+
3359+ default:
3360+ set_error_buf(error_buf, error_buf_size,
3361+ "invalid import kind");
3362+ return false;
3363+ }
3364+ }
3365+
3366+ if (module->import_function_count)
3367+ import_functions = module->import_functions = module->imports;
3368+ if (module->import_table_count)
3369+ import_tables = module->import_tables =
3370+ module->imports + module->import_function_count;
3371+ if (module->import_memory_count)
3372+ import_memories = module->import_memories =
3373+ module->imports + module->import_function_count
3374+ + module->import_table_count;
3375+
3376+ #if WASM_ENABLE_TAGS != 0
3377+ if (module->import_tag_count)
3378+ import_tags = module->import_tags =
3379+ module->imports + module->import_function_count
3380+ + module->import_table_count + module->import_memory_count;
3381+ if (module->import_global_count)
3382+ import_globals = module->import_globals =
3383+ module->imports + module->import_function_count
3384+ + module->import_table_count + module->import_memory_count
3385+ + module->import_tag_count;
3386+ #else
3387+ if (module->import_global_count)
3388+ import_globals = module->import_globals =
3389+ module->imports + module->import_function_count
3390+ + module->import_table_count + module->import_memory_count;
3391+ #endif
3392+
3393+ p = p_old;
32653394
3266- /* Scan to resolve the data */
3267- for (i = 0; i < import_count; i++, import++ ) {
3395+ /* Scan again to resolve the data */
3396+ for (i = 0; i < import_count; i++) {
32683397 /* load module name */
32693398 read_leb_uint32(p, p_end, name_len);
32703399 CHECK_BUF(p, p_end, name_len);
@@ -3291,6 +3420,8 @@ load_import_section(const uint8 *buf, const uint8 *buf_end, WASMModule *module,
32913420
32923421 switch (kind) {
32933422 case IMPORT_KIND_FUNC: /* import function */
3423+ bh_assert(import_functions);
3424+ import = import_functions++;
32943425 if (!load_function_import(&p, p_end, module,
32953426 sub_module_name, field_name,
32963427 &import->u.function, no_resolve,
@@ -3300,6 +3431,8 @@ load_import_section(const uint8 *buf, const uint8 *buf_end, WASMModule *module,
33003431 break;
33013432
33023433 case IMPORT_KIND_TABLE: /* import table */
3434+ bh_assert(import_tables);
3435+ import = import_tables++;
33033436 if (!load_table_import(&p, p_end, module, sub_module_name,
33043437 field_name, &import->u.table,
33053438 error_buf, error_buf_size)) {
@@ -3310,6 +3443,8 @@ load_import_section(const uint8 *buf, const uint8 *buf_end, WASMModule *module,
33103443 break;
33113444
33123445 case IMPORT_KIND_MEMORY: /* import memory */
3446+ bh_assert(import_memories);
3447+ import = import_memories++;
33133448 if (!load_memory_import(&p, p_end, module, sub_module_name,
33143449 field_name, &import->u.memory,
33153450 error_buf, error_buf_size)) {
@@ -3319,6 +3454,8 @@ load_import_section(const uint8 *buf, const uint8 *buf_end, WASMModule *module,
33193454
33203455#if WASM_ENABLE_TAGS != 0
33213456 case IMPORT_KIND_TAG:
3457+ bh_assert(import_tags);
3458+ import = import_tags++;
33223459 if (!load_tag_import(&p, p_end, module, sub_module_name,
33233460 field_name, &import->u.tag, error_buf,
33243461 error_buf_size)) {
@@ -3328,6 +3465,8 @@ load_import_section(const uint8 *buf, const uint8 *buf_end, WASMModule *module,
33283465#endif
33293466
33303467 case IMPORT_KIND_GLOBAL: /* import global */
3468+ bh_assert(import_globals);
3469+ import = import_globals++;
33313470 if (!load_global_import(&p, p_end, module, sub_module_name,
33323471 field_name, &import->u.global,
33333472 error_buf, error_buf_size)) {
@@ -3345,75 +3484,6 @@ load_import_section(const uint8 *buf, const uint8 *buf_end, WASMModule *module,
33453484 import->u.names.field_name = field_name;
33463485 }
33473486
3348- // ordered by kind
3349- qsort(module->imports, module->import_count, sizeof(WASMImport),
3350- cmp_import_kind);
3351- i = 0;
3352-
3353- for (; i < module->import_count
3354- && module->imports[i].kind == IMPORT_KIND_FUNC;
3355- i++, module->import_function_count++)
3356- ;
3357- if (module->import_function_count) {
3358- module->import_functions = module->imports;
3359- }
3360-
3361- for (; i < module->import_count
3362- && module->imports[i].kind == IMPORT_KIND_TABLE;
3363- i++, module->import_table_count++)
3364- ;
3365- if (module->import_table_count) {
3366- module->import_tables =
3367- module->imports + module->import_function_count;
3368- }
3369-
3370- for (; i < module->import_count
3371- && module->imports[i].kind == IMPORT_KIND_MEMORY;
3372- i++, module->import_memory_count++)
3373- ;
3374- if (module->import_memory_count) {
3375- module->import_memories = module->imports
3376- + module->import_function_count
3377- + module->import_table_count;
3378- }
3379-
3380- #if WASM_ENABLE_TAGS != 0
3381- for (; i < module->import_count
3382- && module->imports[i].kind == IMPORT_KIND_TAG;
3383- i++, module->import_tag_count++)
3384- ;
3385- if (module->import_tag_count) {
3386- module->import_tags =
3387- module->imports + module->import_function_count
3388- + module->import_table_count + module->import_memory_count;
3389- }
3390-
3391- for (; i < module->import_count
3392- && module->imports[i].kind == IMPORT_KIND_GLOBAL;
3393- i++, module->import_global_count++)
3394- ;
3395- if (module->import_global_count) {
3396- module->import_globals =
3397- module->imports + module->import_function_count
3398- + module->import_table_count + module->import_memory_count
3399- + module->import_tag_count;
3400- }
3401- #else
3402- for (; i < module->import_count
3403- && module->imports[i].kind == IMPORT_KIND_GLOBAL;
3404- i++, module->import_global_count++)
3405- ;
3406- if (module->import_global_count) {
3407- module->import_globals =
3408- module->imports + module->import_function_count
3409- + module->import_table_count + module->import_memory_count;
3410- }
3411- #endif
3412- if (i != module->import_count) {
3413- set_error_buf(error_buf, error_buf_size, "section size mismatch");
3414- return false;
3415- }
3416-
34173487#if WASM_ENABLE_LIBC_WASI != 0
34183488 import = module->import_functions;
34193489 for (i = 0; i < module->import_function_count; i++, import++) {
0 commit comments