Explorar el Código

added closure calls macro helpers

Nicolas Cannasse hace 6 años
padre
commit
95cc1ef387
Se han modificado 1 ficheros con 15 adiciones y 0 borrados
  1. 15 0
      src/hl.h

+ 15 - 0
src/hl.h

@@ -648,6 +648,21 @@ HL_API void *hl_dyn_call_obj( vdynamic *obj, hl_type *ft, int hfield, void **arg
 HL_API vdynamic *hl_dyn_call( vclosure *c, vdynamic **args, int nargs );
 HL_API vdynamic *hl_dyn_call_safe( vclosure *c, vdynamic **args, int nargs, bool *isException );
 
+/*
+	These macros should be only used when the closure `cl` has been type checked beforehand
+	so you are sure it's of the used typed. Otherwise use hl_dyn_call
+*/
+#define hl_call0(ret,cl) \
+	(cl->hasValue ? ((ret(*)(vdynamic*))cl->fun)(cl->value) : ((ret(*)())cl->fun)()) 
+#define hl_call1(ret,cl,t,v) \
+	(cl->hasValue ? ((ret(*)(vdynamic*,t))cl->fun)(cl->value,v) : ((ret(*)(t))cl->fun)(v))
+#define hl_call2(ret,cl,t1,v1,t2,v2) \
+	(cl->hasValue ? ((ret(*)(vdynamic*,t1,t2))cl->fun)(cl->value,v1,v2) : ((ret(*)(t1,t2))cl->fun)(v1,v2))
+#define hl_call3(ret,cl,t1,v1,t2,v2,t3,v3) \
+	(cl->hasValue ? ((ret(*)(vdynamic*,t1,t2,t3))cl->fun)(cl->value,v1,v2,v3) : ((ret(*)(t1,t2,t3))cl->fun)(v1,v2,v3))
+#define hl_call4(ret,cl,t1,v1,t2,v2,t3,v3,t4,v4) \
+	(cl->hasValue ? ((ret(*)(vdynamic*,t1,t2,t3,t4))cl->fun)(cl->value,v1,v2,v3,v4) : ((ret(*)(t1,t2,t3,t4))cl->fun)(v1,v2,v3,v4))
+
 // ----------------------- THREADS --------------------------------------------------
 
 struct _hl_thread;