Skip to content

Commit 92fdad4

Browse files
committed
refactor import section loading process
1 parent 3580d1a commit 92fdad4

1 file changed

Lines changed: 84 additions & 145 deletions

File tree

core/iwasm/interpreter/wasm_loader.c

Lines changed: 84 additions & 145 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
32303239
static bool
32313240
load_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

Comments
 (0)