Exploring how define-c could inline functions

This commit is contained in:
Justin Ethier 2017-04-03 13:37:27 +00:00
parent 7c287a97a2
commit 074dee7886
2 changed files with 20 additions and 3 deletions

View file

@ -275,6 +275,21 @@ object Cyc_io_read_line(void *data, object cont, object port);
*/
/**@{*/
#define unboxed_inexact_double_op(data, ptr, OP, z) \
double unboxed; \
Cyc_check_num(data, z); \
if (obj_is_int(z)) { \
unboxed = OP(obj_obj2int(z)); \
} else if (type_of(z) == integer_tag) { \
unboxed = OP(((integer_type *)z)->value); \
} else if (type_of(z) == bignum_tag) { \
unboxed = OP(mp_get_double(&bignum_value(z))); \
} else { \
unboxed = OP(((double_type *)z)->value); \
} \
assign_double(ptr, unboxed); \
return ptr;
#define return_inexact_double_op(data, cont, OP, z) \
make_double(d, 0.0); \
Cyc_check_num(data, z); \

View file

@ -72,9 +72,11 @@
; TODO: experimenting with how an inline definition might look.
; need something that can both work within the same module and
; also when imported into another module.
; inline:
; "(void *data, object ptr, object z)"
; " return_inexact_double_op(data, k, log, z);"
;; Inline arguments:
"(void *data, object ptr, object z)"
;; must always return an object
;; Inline body:
" unboxed_inexact_double_op(data, ptr, log, z);"
)
(define-c sin
"(void *data, int argc, closure _, object k, object z)"