aboutsummaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
Diffstat (limited to 'include')
-rw-r--r--include/fwd/ast.h18
-rw-r--r--include/fwd/mod.h69
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)
{