diff options
Diffstat (limited to 'include')
| -rw-r--r-- | include/fwd/ast.h | 18 | ||||
| -rw-r--r-- | include/fwd/mod.h | 69 |
2 files changed, 84 insertions, 3 deletions
diff --git a/include/fwd/ast.h b/include/fwd/ast.h index 0fd1118..1d784f1 100644 --- a/include/fwd/ast.h +++ b/include/fwd/ast.h @@ -73,6 +73,24 @@ static inline bool is_ptr_type(enum type_kind k) return false; } +static inline bool is_closure_type(enum type_kind k) +{ + switch (k) { + case TYPE_CLOSURE: + case TYPE_PURE_CLOSURE: + return true; + default: + return false; + } + + return false; +} + +static inline bool is_c_type(enum type_kind k) +{ + return is_int_type(k) || is_ptr_type(k); +} + struct type { enum type_kind k; diff --git a/include/fwd/mod.h b/include/fwd/mod.h index 51aa9c4..c77e76c 100644 --- a/include/fwd/mod.h +++ b/include/fwd/mod.h @@ -1,6 +1,8 @@ #ifndef FWD_MOD_H #define FWD_MOD_H +#include <stdbool.h> +#include <stdint.h> #include <stddef.h> #include <assert.h> #include <stdlib.h> @@ -23,6 +25,13 @@ typedef enum fwd_type { typedef struct fwd_arg { fwd_type_t t; union { + uint8_t u8; + uint16_t u16; + uint32_t u32; + uint64_t u64; + int8_t i8; + int16_t i16; + int32_t i32; int64_t i64; void *p; }; @@ -49,7 +58,7 @@ static inline void *fwd_arg(fwd_extern_args_t args, size_t idx, fwd_type_t id) assert(args.args[idx + 1].t == id); switch (id) { case FWD_I64: return &args.args[idx + 1].i64; - default: + default: abort(); } return NULL; @@ -61,9 +70,63 @@ static inline void *fwd_arg(fwd_extern_args_t args, size_t idx, fwd_type_t id) #define FWD_ARG_T(args, idx, type) \ FWD_ARG(args, idx, type, FWD_T(type)) +static inline fwd_arg_t fwd_ret_u8(uint8_t x) +{ + return (fwd_arg_t){FWD_U8, {.u8 = x}}; +} + +static inline fwd_arg_t fwd_ret_u16(uint16_t x) +{ + return (fwd_arg_t){FWD_U16, {.u16 = x}}; +} + +static inline fwd_arg_t fwd_ret_u32(uint32_t x) +{ + return (fwd_arg_t){FWD_U32, {.u32 = x}}; +} + +static inline fwd_arg_t fwd_ret_u64(uint64_t x) +{ + return (fwd_arg_t){FWD_U64, {.u64 = x}}; +} + +static inline fwd_arg_t fwd_ret_i8(int8_t x) +{ + return (fwd_arg_t){FWD_I8, {.i8 = x}}; +} + +static inline fwd_arg_t fwd_ret_i16(int16_t x) +{ + return (fwd_arg_t){FWD_I16, {.i16 = x}}; +} + +static inline fwd_arg_t fwd_ret_i32(int32_t x) +{ + return (fwd_arg_t){FWD_I32, {.i32 = x}}; +} + +static inline fwd_arg_t fwd_ret_i64(int64_t x) +{ + return (fwd_arg_t){FWD_I64, {.i64 = x}}; +} + +static inline fwd_arg_t fwd_ret_ptr(void *x) +{ + return (fwd_arg_t){FWD_PTR, {.p = x}}; +} + /* unimplemented as of yet */ -#define FWD_RET(id, x) \ - abort() +#define FWD_RET(t, a, x) \ + (a).args[0] = _Generic((t)(0), \ + int8_t : fwd_ret_i8, \ + int16_t : fwd_ret_i16, \ + int32_t : fwd_ret_i32, \ + int64_t : fwd_ret_i64, \ + uint8_t : fwd_ret_u8, \ + uint16_t : fwd_ret_u16, \ + uint32_t : fwd_ret_u32, \ + uint64_t : fwd_ret_u64, \ + default : fwd_ret_ptr)((x)); static inline fwd_type_t fwd_t_signed(size_t s) { |
