From 44c86e083c30ad9e057df1a91e8168600a99a2f6 Mon Sep 17 00:00:00 2001 From: Juan Jose Garcia Ripoll Date: Wed, 3 Jul 2013 17:08:25 +0200 Subject: [PATCH] Implemented FFI:C-PROGN --- src/CHANGELOG | 11 ++++++++++- src/cmp/cmpffi.lsp | 22 +++++++++++++--------- src/cmp/cmptables.lsp | 2 +- 3 files changed, 24 insertions(+), 11 deletions(-) diff --git a/src/CHANGELOG b/src/CHANGELOG index deea48682..2cb5a8a70 100755 --- a/src/CHANGELOG +++ b/src/CHANGELOG @@ -13,7 +13,16 @@ ECL 13.7.1 be unboxed to such type. - New form EXT:C-PROGN used to interleave C statements with lisp code, where - the lisp code may refer to any number of variables. + the lisp code may refer to any number of variables. Example: + + (lambda (i) + (let* ((limit i) + (iterator 0)) + (declare (:int limit iterator)) + (ffi:c-progn (limit iterator) + "for (#1 = 0; #1 < #0; #1++) {" + (print iterator) + "}"))) ;;; Local Variables: *** ;;; mode:text *** diff --git a/src/cmp/cmpffi.lsp b/src/cmp/cmpffi.lsp index 073821a09..f74a3f030 100755 --- a/src/cmp/cmpffi.lsp +++ b/src/cmp/cmpffi.lsp @@ -371,25 +371,29 @@ form))) (defun c1c-progn (arguments) - (let* ((variables (mapcar #'c1fref (pop arguments))) + (let* ((variables (mapcar #'c1vref (pop arguments))) (statements (loop for form in arguments collect (if (stringp form) form (c1expr form)))) (form (make-c1form* 'FFI:C-PROGN :type NIL - :side-effects t - :args variables statements))) + :side-effects t + :args variables statements))) (add-to-set-nodes-of-var-list variables form) form)) -(defun c2c-progn (c1form statements) +(defun c2c-progn (c1form variables statements) (loop with *destination* = 'TRASH for form in statements - if (stringp form) - do (wt-nl form) - else - do (c2expr* form)) - (unwind-exit nil)) + do (cond ((stringp form) + (wt-nl) + (wt-c-inline-loc :void form variables + t ; side effects + nil) ; no output variables + ) + (t + (c2expr* form))) + finally (unwind-exit nil))) (defun produce-inline-loc (inlined-arguments arg-types output-rep-type c-expression side-effects one-liner) diff --git a/src/cmp/cmptables.lsp b/src/cmp/cmptables.lsp index dcc8e685b..aac75815f 100644 --- a/src/cmp/cmptables.lsp +++ b/src/cmp/cmptables.lsp @@ -37,7 +37,7 @@ c-expression-string side-effects-p one-liner-p) - (C-PROGN body) + (C-PROGN variables forms) (LOCALS local-fun-list body labels-p :pure) (IF fmla-c1form true-c1form false-c1form :pure) (FMLA-NOT fmla-c1form :pure)