From 3e040b681d5d918854f20ae3c0f09074e7e1d59c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20F=2E=20Wittenberger?= Date: Wed, 17 Feb 2016 17:24:11 +0100 Subject: [PATCH] Provide C_allocate_argvector --- c-backend.scm | 8 ++------ chicken.h | 3 +++ 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/c-backend.scm b/c-backend.scm index d61b59a..26f7876 100644 --- a/c-backend.scm +++ b/c-backend.scm @@ -483,12 +483,8 @@ ;; CPS context, so callee never returns to current function. ;; And even so, av[] is already copied into temporaries. (cond (caller-has-av? - (gen #t "C_word *av2;") - (gen #t "if(c >= " avl ") {") - (gen #t " av2=av; /* Re-use our own argvector */") - (gen #t "} else {") - (gen #t " av2=C_alloc(" avl ");") - (gen #t "}")) + (gen #t "C_word *av2 = C_allocate_argvector(C_current_argvector_size, c, av, " avl ");")) + ;; TBD: Check if we could do better in this case too: (else (gen #t "C_word av2[" avl "];"))) (when selfarg (gen #t "av2[0]=" selfarg ";")) (do ((j (if selfarg 1 0) (add1 j)) diff --git a/chicken.h b/chicken.h index 5a41f73..db8d8b6 100644 --- a/chicken.h +++ b/chicken.h @@ -1004,6 +1004,9 @@ typedef void (C_ccall *C_proc)(C_word, C_word *) C_noret; #define C_heaptop ((C_word **)(&C_fromspace_top)) #define C_drop(n) (C_temporary_stack += (n)) #define C_alloc(n) ((C_word *)C_alloca((n) * sizeof(C_word))) +#define C_current_argvector_size 0 /* reserved */ +#define C_default_argvector_value 0 /* reserved */ +#define C_allocate_argvector(as, c, av, avl) ( (c) >= (avl) ? av : C_alloc(avl)) #if defined (__llvm__) && defined (__GNUC__) # if defined (__i386__) # define C_stack_pointer ({C_word *sp; __asm__ __volatile__("movl %%esp,%0":"=r"(sp):);sp;}) -- 2.6.2