/* * Copyright 2018 WebAssembly Community Group participants * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef WASM_RT_IMPL_H_ #define WASM_RT_IMPL_H_ #include #include "wasm-rt.h" #ifdef __cplusplus extern "C" { #endif /** A setjmp buffer used for handling traps. */ extern jmp_buf g_jmp_buf; /** Saved call stack depth that will be restored in case a trap occurs. */ extern uint32_t g_saved_call_stack_depth; #if WASM_RT_MEMCHECK_SIGNAL_HANDLER_POSIX #define WASM_RT_SETJMP(buf) sigsetjmp(buf, 1) #define WASM_RT_LONGJMP(buf, val) siglongjmp(buf, val) #else #define WASM_RT_SETJMP(buf) setjmp(buf) #define WASM_RT_LONGJMP(buf, val) longjmp(buf, val) #endif /** Convenience macro to use before calling a wasm function. On first execution * it will return `WASM_RT_TRAP_NONE` (i.e. 0). If the function traps, it will * jump back and return the trap that occurred. * * ``` * wasm_rt_trap_t code = wasm_rt_impl_try(); * if (code != 0) { * printf("A trap occurred with code: %d\n", code); * ... * } * * // Call the potentially-trapping function. * my_wasm_func(); * ``` */ #define wasm_rt_impl_try() \ (g_saved_call_stack_depth = wasm_rt_call_stack_depth, \ WASM_RT_SETJMP(g_jmp_buf)) #ifdef __cplusplus } #endif #endif // WASM_RT_IMPL_H_