exitcode.go

  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}