From 4824fc50ede054bcca12b3141b0aa5ca93092ed7 Mon Sep 17 00:00:00 2001 From: Justin Ethier Date: Fri, 26 Oct 2018 13:03:54 -0400 Subject: [PATCH] Increased alloca support --- include/cyclone/types.h | 19 +++++++++++++++++++ scheme/cyclone/primitives.sld | 7 ++++++- 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/include/cyclone/types.h b/include/cyclone/types.h index 70f0b672..44b1d449 100644 --- a/include/cyclone/types.h +++ b/include/cyclone/types.h @@ -1128,11 +1128,30 @@ typedef pair_type *pair; make_pair(l##__2, a2, &l##__3); \ make_pair(l, a1, &l##__2); +#define alloca_list_1(l, a1) \ + alloca_pair(l, a1, NULL); + +#define alloca_list_2(l, a1, a2) \ + alloca_pair(l##__2, a2, NULL); \ + alloca_pair(l, a1, &l##__2); + +#define alloca_list_3(l, a1, a2, a3) \ + alloca_pair(l##__3, a3, NULL); \ + alloca_pair(l##__2, a2, &l##__3); \ + alloca_pair(l, a1, &l##__2); + +#define alloca_list_4(l, a1, a2, a3, a4) \ + alloca_pair(l##__4, a4, NULL); \ + alloca_pair(l##__3, a3, &l##__4); \ + alloca_pair(l##__2, a2, &l##__3); \ + alloca_pair(l, a1, &l##__2); + /** * Create a pair with a single value. * This is useful to create an object that can be modified. */ #define make_cell(n,a) make_pair(n,a,NULL); +#define alloca_cell(n,a) alloca_pair(n,a,NULL); /** * \defgroup objects_unsafe_cxr Unsafe pair access macros diff --git a/scheme/cyclone/primitives.sld b/scheme/cyclone/primitives.sld index 154642c0..992acef1 100644 --- a/scheme/cyclone/primitives.sld +++ b/scheme/cyclone/primitives.sld @@ -465,7 +465,12 @@ ;; created via alloca or such, and cannot be declared as stack vars. ;; This is to support C loops in place of recursion. (cond - ((eq? p 'cons) "alloca_pair") + ((eq? p 'cons) "alloca_pair") + ((eq? p 'Cyc-fast-list-1) "alloca_list_1") + ((eq? p 'Cyc-fast-list-2) "alloca_list_2") + ((eq? p 'Cyc-fast-list-3) "alloca_list_3") + ((eq? p 'Cyc-fast-list-4) "alloca_list_4") + ((eq? p 'cell) "alloca_cell") (else (_prim->c-func p)))) (else