@@ -3227,22 +3227,29 @@ 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+ }
3238+
32303239static bool
32313240load_import_section(const uint8 *buf, const uint8 *buf_end, WASMModule *module,
32323241 bool is_load_from_file_buf, bool no_resolve,
32333242 char *error_buf, uint32 error_buf_size)
32343243{
3235- const uint8 *p = buf, *p_end = buf_end, *p_old ;
3236- uint32 import_count, name_len, type_index, i, u32, flags ;
3244+ const uint8 *p = buf, *p_end = buf_end;
3245+ uint32 import_count, name_len, type_index, i, u32;
32373246 uint64 total_size;
32383247 WASMImport *import;
3239- WASMImport *import_functions = NULL, *import_tables = NULL;
3240- WASMImport *import_memories = NULL, *import_globals = NULL;
32413248#if WASM_ENABLE_TAGS != 0
32423249 WASMImport *import_tags = NULL;
32433250#endif
32443251 char *sub_module_name, *field_name;
3245- uint8 u8, kind, global_type ;
3252+ uint8 u8, kind;
32463253
32473254 read_leb_uint32(p, p_end, import_count);
32483255
@@ -3254,137 +3261,10 @@ load_import_section(const uint8 *buf, const uint8 *buf_end, WASMModule *module,
32543261 return false;
32553262 }
32563263
3257- p_old = p;
3258-
3259- /* Scan firstly to get import count of each type */
3260- for (i = 0; i < import_count; i++) {
3261- /* module name */
3262- read_leb_uint32(p, p_end, name_len);
3263- CHECK_BUF(p, p_end, name_len);
3264- p += name_len;
3265-
3266- /* field name */
3267- read_leb_uint32(p, p_end, name_len);
3268- CHECK_BUF(p, p_end, name_len);
3269- p += name_len;
3270-
3271- CHECK_BUF(p, p_end, 1);
3272- /* 0x00/0x01/0x02/0x03/0x04 */
3273- kind = read_uint8(p);
3274-
3275- switch (kind) {
3276- case IMPORT_KIND_FUNC: /* import function */
3277- read_leb_uint32(p, p_end, type_index);
3278- module->import_function_count++;
3279- break;
3280-
3281- case IMPORT_KIND_TABLE: /* import table */
3282- CHECK_BUF(p, p_end, 1);
3283- /* 0x70 */
3284- u8 = read_uint8(p);
3285- read_leb_uint32(p, p_end, flags);
3286- read_leb_uint32(p, p_end, u32);
3287- if (flags & 1)
3288- read_leb_uint32(p, p_end, u32);
3289- module->import_table_count++;
3290-
3291- if (module->import_table_count > 1) {
3292- #if WASM_ENABLE_REF_TYPES == 0 && WASM_ENABLE_GC == 0
3293- set_error_buf(error_buf, error_buf_size,
3294- "multiple tables");
3295- return false;
3296- #elif WASM_ENABLE_WAMR_COMPILER != 0
3297- module->is_ref_types_used = true;
3298- #endif
3299- }
3300- break;
3301-
3302- case IMPORT_KIND_MEMORY: /* import memory */
3303- read_leb_uint32(p, p_end, flags);
3304- read_leb_uint32(p, p_end, u32);
3305- if (flags & 1)
3306- read_leb_uint32(p, p_end, u32);
3307- module->import_memory_count++;
3308- #if WASM_ENABLE_MULTI_MEMORY == 0
3309- if (module->import_memory_count > 1) {
3310- set_error_buf(error_buf, error_buf_size,
3311- "multiple memories");
3312- return false;
3313- }
3314- #endif
3315- break;
3316-
3317- #if WASM_ENABLE_TAGS != 0
3318- case IMPORT_KIND_TAG: /* import tags */
3319- /* it only counts the number of tags to import */
3320- module->import_tag_count++;
3321- CHECK_BUF(p, p_end, 1);
3322- u8 = read_uint8(p);
3323- read_leb_uint32(p, p_end, type_index);
3324- break;
3325- #endif
3264+ import = module->imports;
33263265
3327- case IMPORT_KIND_GLOBAL: /* import global */
3328- #if WASM_ENABLE_GC != 0
3329- /* valtype */
3330- CHECK_BUF(p, p_end, 1);
3331- global_type = read_uint8(p);
3332- if (wasm_is_type_multi_byte_type(global_type)) {
3333- int32 heap_type;
3334- read_leb_int32(p, p_end, heap_type);
3335- (void)heap_type;
3336- }
3337-
3338- /* mutability */
3339- CHECK_BUF(p, p_end, 1);
3340- p += 1;
3341- #else
3342- CHECK_BUF(p, p_end, 2);
3343- p += 2;
3344- #endif
3345-
3346- (void)global_type;
3347- module->import_global_count++;
3348- break;
3349-
3350- default:
3351- set_error_buf(error_buf, error_buf_size,
3352- "invalid import kind");
3353- return false;
3354- }
3355- }
3356-
3357- if (module->import_function_count)
3358- import_functions = module->import_functions = module->imports;
3359- if (module->import_table_count)
3360- import_tables = module->import_tables =
3361- module->imports + module->import_function_count;
3362- if (module->import_memory_count)
3363- import_memories = module->import_memories =
3364- module->imports + module->import_function_count
3365- + module->import_table_count;
3366-
3367- #if WASM_ENABLE_TAGS != 0
3368- if (module->import_tag_count)
3369- import_tags = module->import_tags =
3370- module->imports + module->import_function_count
3371- + module->import_table_count + module->import_memory_count;
3372- if (module->import_global_count)
3373- import_globals = module->import_globals =
3374- module->imports + module->import_function_count
3375- + module->import_table_count + module->import_memory_count
3376- + module->import_tag_count;
3377- #else
3378- if (module->import_global_count)
3379- import_globals = module->import_globals =
3380- module->imports + module->import_function_count
3381- + module->import_table_count + module->import_memory_count;
3382- #endif
3383-
3384- p = p_old;
3385-
3386- /* Scan again to resolve the data */
3387- for (i = 0; i < import_count; i++) {
3266+ /* Scan to resolve the data */
3267+ for (i = 0; i < import_count; i++, import++) {
33883268 /* load module name */
33893269 read_leb_uint32(p, p_end, name_len);
33903270 CHECK_BUF(p, p_end, name_len);
@@ -3411,8 +3291,6 @@ load_import_section(const uint8 *buf, const uint8 *buf_end, WASMModule *module,
34113291
34123292 switch (kind) {
34133293 case IMPORT_KIND_FUNC: /* import function */
3414- bh_assert(import_functions);
3415- import = import_functions++;
34163294 if (!load_function_import(&p, p_end, module,
34173295 sub_module_name, field_name,
34183296 &import->u.function, no_resolve,
@@ -3422,8 +3300,6 @@ load_import_section(const uint8 *buf, const uint8 *buf_end, WASMModule *module,
34223300 break;
34233301
34243302 case IMPORT_KIND_TABLE: /* import table */
3425- bh_assert(import_tables);
3426- import = import_tables++;
34273303 if (!load_table_import(&p, p_end, module, sub_module_name,
34283304 field_name, &import->u.table,
34293305 error_buf, error_buf_size)) {
@@ -3434,8 +3310,6 @@ load_import_section(const uint8 *buf, const uint8 *buf_end, WASMModule *module,
34343310 break;
34353311
34363312 case IMPORT_KIND_MEMORY: /* import memory */
3437- bh_assert(import_memories);
3438- import = import_memories++;
34393313 if (!load_memory_import(&p, p_end, module, sub_module_name,
34403314 field_name, &import->u.memory,
34413315 error_buf, error_buf_size)) {
@@ -3445,8 +3319,6 @@ load_import_section(const uint8 *buf, const uint8 *buf_end, WASMModule *module,
34453319
34463320#if WASM_ENABLE_TAGS != 0
34473321 case IMPORT_KIND_TAG:
3448- bh_assert(import_tags);
3449- import = import_tags++;
34503322 if (!load_tag_import(&p, p_end, module, sub_module_name,
34513323 field_name, &import->u.tag, error_buf,
34523324 error_buf_size)) {
@@ -3456,8 +3328,6 @@ load_import_section(const uint8 *buf, const uint8 *buf_end, WASMModule *module,
34563328#endif
34573329
34583330 case IMPORT_KIND_GLOBAL: /* import global */
3459- bh_assert(import_globals);
3460- import = import_globals++;
34613331 if (!load_global_import(&p, p_end, module, sub_module_name,
34623332 field_name, &import->u.global,
34633333 error_buf, error_buf_size)) {
@@ -3475,6 +3345,75 @@ load_import_section(const uint8 *buf, const uint8 *buf_end, WASMModule *module,
34753345 import->u.names.field_name = field_name;
34763346 }
34773347
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+
34783417#if WASM_ENABLE_LIBC_WASI != 0
34793418 import = module->import_functions;
34803419 for (i = 0; i < module->import_function_count; i++, import++) {
0 commit comments