type section parser

This commit is contained in:
hrigar committed 2026-03-20 17:55:36 +05:30
1 parent 2f165e7c8e
commit a1cb9f0afa
5 files changed
+166

No files matched your search

+139
View File
@@ -47,6 +47,15 @@ parse_sections:
call print_str
pop esi
mov eax, [sec_id]
cmp eax, SECT_TYPE
je .type
jmp .skip
.type:
call parse_type_section
.skip:
mov esi, [sec_next]
jmp .next
@@ -66,3 +75,133 @@ print_sec_name:
.unknown:
pop eax esi
ret
MAX_TYPES = 64
parse_type_section:
pushad
mov esi, [sec_content]
call decode_leb128_u32
mov [type_count], eax
mov ecx, eax
xor ebx, ebx
.next_type:
test ecx, ecx
jz .types_done
cmp byte [esi], 0x60
jne .types_done
inc esi
push ecx
call decode_leb128_u32
mov [type_param_counts + ebx*4], eax
mov [type_param_ptrs + ebx*4], esi
mov ecx, eax
push esi ecx
mov esi, msg_indent
call print_str
mov esi, msg_type_word
call print_str
mov eax, ebx
call print_dec
mov esi, msg_colon
call print_str
mov esi, msg_oparen
call print_str
pop ecx esi
push ecx
.print_param:
test ecx, ecx
jz .params_printed
movzx eax, byte [esi]
inc esi
push esi ecx
call print_valtype
pop ecx esi
dec ecx
test ecx, ecx
jz .params_printed
push esi
mov esi, msg_comma
call print_str
pop esi
jmp .print_param
.params_printed:
pop ecx
push esi
mov esi, msg_arrow_paren
call print_str
pop esi
call decode_leb128_u32
mov [type_result_counts + ebx*4], eax
mov [type_result_ptrs + ebx*4], esi
mov ecx, eax
push ecx
.print_result:
test ecx, ecx
jz .results_printed
movzx eax, byte [esi]
inc esi
push esi ecx
call print_valtype
pop ecx esi
dec ecx
test ecx, ecx
jz .results_printed
push esi
mov esi, msg_comma
call print_str
pop esi
jmp .print_result
.results_printed:
pop ecx
push esi
mov esi, msg_cparen_nl
call print_str
pop esi
pop ecx
inc ebx
dec ecx
jmp .next_type
.types_done:
popad
ret
print_valtype:
push esi
cmp al, 0x7F
je .i32
cmp al, 0x7E
je .i64
cmp al, 0x7D
je .f32
cmp al, 0x7C
je .f64
mov esi, msg_vt_unknown
jmp .vt_print
.i32:
mov esi, msg_vt_i32
jmp .vt_print
.i64:
mov esi, msg_vt_i64
jmp .vt_print
.f32:
mov esi, msg_vt_f32
jmp .vt_print
.f64:
mov esi, msg_vt_f64
.vt_print:
call print_str
pop esi
ret
+19
View File
@@ -207,6 +207,19 @@ msg_newline db 10, 0
msg_sec_hdr db 'Section ', 0
msg_sec_comma_sz db ', size: ', 0
msg_indent db ' ', 0
msg_type_word db 'type ', 0
msg_colon db ': ', 0
msg_comma db ', ', 0
msg_oparen db '(', 0
msg_cparen_nl db ')', 10, 0
msg_arrow_paren db ') -> (', 0
msg_vt_i32 db 'i32', 0
msg_vt_i64 db 'i64', 0
msg_vt_f32 db 'f32', 0
msg_vt_f64 db 'f64', 0
msg_vt_unknown db '?', 0
sec_name_tbl dd sn_custom, sn_type, sn_import, sn_func, sn_table
dd sn_memory, sn_global, sn_export, sn_start, sn_element
@@ -237,4 +250,10 @@ sec_size dd 0
sec_content dd 0
sec_next dd 0
type_count dd 0
type_param_counts rd MAX_TYPES
type_result_counts rd MAX_TYPES
type_param_ptrs rd MAX_TYPES
type_result_ptrs rd MAX_TYPES
file_buf rb FILE_BUF_SIZE
+2
View File
@@ -29,6 +29,8 @@ check "valid wasm" "Valid wasm file" $WASM test/wasm/valid.wasm
check "bad magic" "invalid wasm magic" $WASM test/wasm/badmagic.wasm
check "bad version" "unsupported wasm" $WASM test/wasm/badver.wasm
check "section list" "(Type)" $WASM test/wasm/valid.wasm
check "type no params" "() -> (i32)" $WASM test/wasm/valid.wasm
check "type two params" "(i32, i32) -> (i32)" $WASM test/wasm/add.wasm
echo ""
echo "Results: $PASS/$TESTS passed, $FAIL failed"
Binary file not shown.
+6
View File
@@ -0,0 +1,6 @@
(module
(func (export "add") (param i32 i32) (result i32)
local.get 0
local.get 1
i32.add)
)