1package wazevoapi
2
3// ExitCode is an exit code of an execution of a function.
4type ExitCode uint32
5
6const (
7 ExitCodeOK ExitCode = iota
8 ExitCodeGrowStack
9 ExitCodeGrowMemory
10 ExitCodeUnreachable
11 ExitCodeMemoryOutOfBounds
12 // ExitCodeCallGoModuleFunction is an exit code for a call to an api.GoModuleFunction.
13 ExitCodeCallGoModuleFunction
14 // ExitCodeCallGoFunction is an exit code for a call to an api.GoFunction.
15 ExitCodeCallGoFunction
16 ExitCodeTableOutOfBounds
17 ExitCodeIndirectCallNullPointer
18 ExitCodeIndirectCallTypeMismatch
19 ExitCodeIntegerDivisionByZero
20 ExitCodeIntegerOverflow
21 ExitCodeInvalidConversionToInteger
22 ExitCodeCheckModuleExitCode
23 ExitCodeCallListenerBefore
24 ExitCodeCallListenerAfter
25 ExitCodeCallGoModuleFunctionWithListener
26 ExitCodeCallGoFunctionWithListener
27 ExitCodeTableGrow
28 ExitCodeRefFunc
29 ExitCodeMemoryWait32
30 ExitCodeMemoryWait64
31 ExitCodeMemoryNotify
32 ExitCodeUnalignedAtomic
33 exitCodeMax
34)
35
36const ExitCodeMask = 0xff
37
38// String implements fmt.Stringer.
39func (e ExitCode) String() string {
40 switch e {
41 case ExitCodeOK:
42 return "ok"
43 case ExitCodeGrowStack:
44 return "grow_stack"
45 case ExitCodeCallGoModuleFunction:
46 return "call_go_module_function"
47 case ExitCodeCallGoFunction:
48 return "call_go_function"
49 case ExitCodeUnreachable:
50 return "unreachable"
51 case ExitCodeMemoryOutOfBounds:
52 return "memory_out_of_bounds"
53 case ExitCodeUnalignedAtomic:
54 return "unaligned_atomic"
55 case ExitCodeTableOutOfBounds:
56 return "table_out_of_bounds"
57 case ExitCodeIndirectCallNullPointer:
58 return "indirect_call_null_pointer"
59 case ExitCodeIndirectCallTypeMismatch:
60 return "indirect_call_type_mismatch"
61 case ExitCodeIntegerDivisionByZero:
62 return "integer_division_by_zero"
63 case ExitCodeIntegerOverflow:
64 return "integer_overflow"
65 case ExitCodeInvalidConversionToInteger:
66 return "invalid_conversion_to_integer"
67 case ExitCodeCheckModuleExitCode:
68 return "check_module_exit_code"
69 case ExitCodeCallListenerBefore:
70 return "call_listener_before"
71 case ExitCodeCallListenerAfter:
72 return "call_listener_after"
73 case ExitCodeCallGoModuleFunctionWithListener:
74 return "call_go_module_function_with_listener"
75 case ExitCodeCallGoFunctionWithListener:
76 return "call_go_function_with_listener"
77 case ExitCodeGrowMemory:
78 return "grow_memory"
79 case ExitCodeTableGrow:
80 return "table_grow"
81 case ExitCodeRefFunc:
82 return "ref_func"
83 case ExitCodeMemoryWait32:
84 return "memory_wait32"
85 case ExitCodeMemoryWait64:
86 return "memory_wait64"
87 case ExitCodeMemoryNotify:
88 return "memory_notify"
89 }
90 panic("TODO")
91}
92
93func ExitCodeCallGoModuleFunctionWithIndex(index int, withListener bool) ExitCode {
94 if withListener {
95 return ExitCodeCallGoModuleFunctionWithListener | ExitCode(index<<8)
96 }
97 return ExitCodeCallGoModuleFunction | ExitCode(index<<8)
98}
99
100func ExitCodeCallGoFunctionWithIndex(index int, withListener bool) ExitCode {
101 if withListener {
102 return ExitCodeCallGoFunctionWithListener | ExitCode(index<<8)
103 }
104 return ExitCodeCallGoFunction | ExitCode(index<<8)
105}
106
107func GoFunctionIndexFromExitCode(exitCode ExitCode) int {
108 return int(exitCode >> 8)
109}