From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Nala Ginrut Newsgroups: gmane.lisp.guile.bugs Subject: bug#18592: FFI should have portable access to =?UTF-8?Q?=E2=80=98errno=E2=80=99?= Date: Thu, 31 Dec 2015 20:33:49 +0800 Organization: HFG Message-ID: <1451565229.3594.59.camel@Renee-desktop.suse> References: <87fvf8oocf.fsf@ft.bewatermyfriend.org> <87h9vmy0zw.fsf@gnu.org> <87twzgeh3c.fsf@yeeloong.lan> <87r3uko4c9.fsf@gnu.org> NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-1VEnwe9Z1mpPAHI9svww" X-Trace: ger.gmane.org 1451565270 11638 80.91.229.3 (31 Dec 2015 12:34:30 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Thu, 31 Dec 2015 12:34:30 +0000 (UTC) Cc: Chaos Eternal , 18592@debbugs.gnu.org To: Ludovic =?UTF-8?Q?Court=C3=A8s?= Original-X-From: bug-guile-bounces+guile-bugs=m.gmane.org@gnu.org Thu Dec 31 13:34:19 2015 Return-path: Envelope-to: guile-bugs@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by plane.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1aEcQp-0006Bq-9d for guile-bugs@m.gmane.org; Thu, 31 Dec 2015 13:34:15 +0100 Original-Received: from localhost ([::1]:55519 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aEcQo-0003lg-AD for guile-bugs@m.gmane.org; Thu, 31 Dec 2015 07:34:14 -0500 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:34820) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aEcQg-0003lP-7P for bug-guile@gnu.org; Thu, 31 Dec 2015 07:34:10 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1aEcQc-0005Ye-3G for bug-guile@gnu.org; Thu, 31 Dec 2015 07:34:06 -0500 Original-Received: from debbugs.gnu.org ([208.118.235.43]:43384) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aEcQb-0005Ya-Vi for bug-guile@gnu.org; Thu, 31 Dec 2015 07:34:02 -0500 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84) (envelope-from ) id 1aEcQb-0005wo-Lm for bug-guile@gnu.org; Thu, 31 Dec 2015 07:34:01 -0500 X-Loop: help-debbugs@gnu.org Resent-From: Nala Ginrut Original-Sender: "Debbugs-submit" Resent-CC: bug-guile@gnu.org Resent-Date: Thu, 31 Dec 2015 12:34:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 18592 X-GNU-PR-Package: guile X-GNU-PR-Keywords: Original-Received: via spool by 18592-submit@debbugs.gnu.org id=B18592.145156524022852 (code B ref 18592); Thu, 31 Dec 2015 12:34:01 +0000 Original-Received: (at 18592) by debbugs.gnu.org; 31 Dec 2015 12:34:00 +0000 Original-Received: from localhost ([127.0.0.1]:50986 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84) (envelope-from ) id 1aEcQZ-0005wW-On for submit@debbugs.gnu.org; Thu, 31 Dec 2015 07:34:00 -0500 Original-Received: from mail-pa0-f47.google.com ([209.85.220.47]:34161) by debbugs.gnu.org with esmtp (Exim 4.84) (envelope-from ) id 1aEcQY-0005wJ-JL for 18592@debbugs.gnu.org; Thu, 31 Dec 2015 07:33:59 -0500 Original-Received: by mail-pa0-f47.google.com with SMTP id uo6so130595807pac.1 for <18592@debbugs.gnu.org>; Thu, 31 Dec 2015 04:33:58 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=message-id:subject:from:to:cc:date:in-reply-to:references :organization:content-type:mime-version; bh=sUZqaTMuZwxvJGmQqs2+HiVRc7XUUoWMlXpk4OrNU3U=; b=oh8hyyEoTc2nzONNJ8UAU17uZ7JtlkiPbR5GneDF3d36Ga72YYx+FbIczdtUjPdrF0 ffv66GFPlaqsiAJNTtTW7dsCBnFgM+nPKn4cOt0zRyoCfIcnmfXeD5xgRrUtHjDPJUMV eWsKcAtwZgDXwkwCumcozMFNecIj3MvwS90KX5Mu8npeK1/oDKqmt3AYanUJjjcNk0kO JPX4RJ1LDzCo1VNvjAXM/27cBSOpfz07XqrQrUIeiiHqM+kbcM8CTU6gJb8yrNjlhlQM RTwyFbBkPBAshFA2xrdY5Nwdij/GJqd5iIeLkhJHQqHuTKkbTE9dx61HOQO6V8EP/9zF Iwtg== X-Received: by 10.66.237.102 with SMTP id vb6mr100182792pac.133.1451565232630; Thu, 31 Dec 2015 04:33:52 -0800 (PST) Original-Received: from [147.2.147.24] ([203.192.156.9]) by smtp.gmail.com with ESMTPSA id 71sm7358530pfh.4.2015.12.31.04.33.50 (version=TLSv1/SSLv3 cipher=OTHER); Thu, 31 Dec 2015 04:33:51 -0800 (PST) In-Reply-To: <87r3uko4c9.fsf@gnu.org> X-Mailer: Evolution 3.4.4 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 208.118.235.43 X-BeenThere: bug-guile@gnu.org List-Id: "Bug reports for GUILE, GNU's Ubiquitous Extension Language" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-guile-bounces+guile-bugs=m.gmane.org@gnu.org Original-Sender: bug-guile-bounces+guile-bugs=m.gmane.org@gnu.org Xref: news.gmane.org gmane.lisp.guile.bugs:7919 Archived-At: --=-1VEnwe9Z1mpPAHI9svww Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 8bit Hi folks! Here're patches (based on stable-2.0) to fix this issue according to proposal 1. Please review them, I'm going to write a new CFFI parser with nyacc, so these patches is important for this plan. Thanks! On Sat, 2015-01-24 at 11:33 +0100, Ludovic Courtès wrote: > Mark H Weaver skribis: > > > ludo@gnu.org (Ludovic Courtès) writes: > > > >> Chaos Eternal skribis: > >> > >>> Proposals to solve this bug: > >>> > >>> Proposal 1. > >>> > >>> Adding a keyword argument to pointer->procedure, if set to true, the > >>> generated wrapper will check 'errno' immediately after ffi_call and > >>> return the errno as second value. > >>> > >>> the proposed pointer->procedure maybe like this: > >>> pointer->procedure return_type func_ptr arg_types #:return-errno > I agree #1 is now the best option so far. > > Ludo’. --=-1VEnwe9Z1mpPAHI9svww Content-Disposition: attachment; filename*0=0001-Add-option-to-pointer-procedure-to-return-errno-if-n.pat; filename*1=ch Content-Type: text/x-patch; name="0001-Add-option-to-pointer-procedure-to-return-errno-if-n.patch"; charset="UTF-8" Content-Transfer-Encoding: 7bit >From 88a99af4b5db9096c3cde51c72eb371b6be76754 Mon Sep 17 00:00:00 2001 From: Nala Ginrut Date: Thu, 31 Dec 2015 20:27:59 +0800 Subject: [PATCH 1/2] Add option to pointer->procedure to return errno if necessary --- libguile/foreign.c | 33 ++++++++++++++++++++++++--------- libguile/foreign.h | 2 +- 2 files changed, 25 insertions(+), 10 deletions(-) diff --git a/libguile/foreign.c b/libguile/foreign.c index 29cfc73..6909023 100644 --- a/libguile/foreign.c +++ b/libguile/foreign.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2015 Free Software Foundation, Inc. +/* Copyright (C) 2010-2016 Free Software Foundation, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -85,7 +85,7 @@ null_pointer_error (const char *func_name) } -static SCM cif_to_procedure (SCM cif, SCM func_ptr); +static SCM cif_to_procedure (SCM cif, SCM func_ptr, SCM return_errno); static SCM pointer_weak_refs = SCM_BOOL_F; @@ -753,24 +753,29 @@ make_cif (SCM return_type, SCM arg_types, const char *caller) } #undef FUNC_NAME -SCM_DEFINE (scm_pointer_to_procedure, "pointer->procedure", 3, 0, 0, - (SCM return_type, SCM func_ptr, SCM arg_types), +SCM_DEFINE (scm_pointer_to_procedure, "pointer->procedure", 3, 1, 0, + (SCM return_type, SCM func_ptr, SCM arg_types, SCM return_errno), "Make a foreign function.\n\n" "Given the foreign void pointer @var{func_ptr}, its argument and\n" "return types @var{arg_types} and @var{return_type}, return a\n" "procedure that will pass arguments to the foreign function\n" "and return appropriate values.\n\n" "@var{arg_types} should be a list of foreign types.\n" - "@code{return_type} should be a foreign type.") + "@code{return_type} should be a foreign type.\n" + "@var{return_errno} is @code{#f} in default, if set to #t, then\n" + "the @var{errno} will be returned as the second value.") #define FUNC_NAME s_scm_pointer_to_procedure { ffi_cif *cif; SCM_VALIDATE_POINTER (2, func_ptr); + if (SCM_UNLIKELY (SCM_UNBNDP (return_errno))) + return_errno = SCM_BOOL_F; + cif = make_cif (return_type, arg_types, FUNC_NAME); - return cif_to_procedure (scm_from_pointer (cif, NULL), func_ptr); + return cif_to_procedure (scm_from_pointer (cif, NULL), func_ptr, return_errno); } #undef FUNC_NAME @@ -940,7 +945,7 @@ get_objcode_trampoline (unsigned int nargs) } static SCM -cif_to_procedure (SCM cif, SCM func_ptr) +cif_to_procedure (SCM cif, SCM func_ptr, SCM return_errno) { ffi_cif *c_cif; SCM objcode, table, ret; @@ -949,7 +954,8 @@ cif_to_procedure (SCM cif, SCM func_ptr) objcode = get_objcode_trampoline (c_cif->nargs); table = scm_c_make_vector (2, SCM_UNDEFINED); - SCM_SIMPLE_VECTOR_SET (table, 0, scm_cons (cif, func_ptr)); + SCM_SIMPLE_VECTOR_SET (table, 0, + scm_cons (cif, scm_cons (func_ptr, return_errno))); SCM_SIMPLE_VECTOR_SET (table, 1, SCM_BOOL_F); /* name */ ret = scm_make_program (objcode, table, SCM_BOOL_F); @@ -1116,9 +1122,11 @@ scm_i_foreign_call (SCM foreign, const SCM *argv) unsigned i; size_t arg_size; scm_t_ptrdiff off; + SCM return_errno; cif = SCM_POINTER_VALUE (SCM_CAR (foreign)); - func = SCM_POINTER_VALUE (SCM_CDR (foreign)); + func = SCM_POINTER_VALUE (SCM_CADR (foreign)); + return_errno = SCM_CDDR (foreign); /* Argument pointers. */ args = alloca (sizeof (void *) * cif->nargs); @@ -1153,9 +1161,16 @@ scm_i_foreign_call (SCM foreign, const SCM *argv) rvalue = (void *) ROUND_UP ((scm_t_uintptr) data + off, max (sizeof (void *), cif->rtype->alignment)); + errno = 0; /* off we go! */ ffi_call (cif, func, rvalue, args); + if (SCM_LIKELY (scm_is_true (return_errno))) + { + return scm_values (scm_list_2 (pack (cif->rtype, rvalue, 1), + scm_from_int (errno))); + } + return pack (cif->rtype, rvalue, 1); } diff --git a/libguile/foreign.h b/libguile/foreign.h index 41c0b65..8541526 100644 --- a/libguile/foreign.h +++ b/libguile/foreign.h @@ -93,7 +93,7 @@ SCM_INTERNAL SCM scm_pointer_to_string (SCM pointer, SCM length, SCM encoding); */ SCM_API SCM scm_pointer_to_procedure (SCM return_type, SCM func_ptr, - SCM arg_types); + SCM arg_types, SCM return_errno); SCM_API SCM scm_procedure_to_pointer (SCM return_type, SCM func_ptr, SCM arg_types); SCM_INTERNAL SCM scm_i_foreign_call (SCM foreign, const SCM *argv); -- 1.7.10.4 --=-1VEnwe9Z1mpPAHI9svww Content-Disposition: attachment; filename="0002-updated-pointer-procedure-in-document.patch" Content-Type: text/x-patch; name="0002-updated-pointer-procedure-in-document.patch"; charset="UTF-8" Content-Transfer-Encoding: 7bit >From 71151759513f8163e45c328e5bcae8e89ebbf614 Mon Sep 17 00:00:00 2001 From: Nala Ginrut Date: Thu, 31 Dec 2015 20:28:36 +0800 Subject: [PATCH 2/2] updated pointer->procedure in document --- doc/ref/api-foreign.texi | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/doc/ref/api-foreign.texi b/doc/ref/api-foreign.texi index c2c49ec..9fd09f5 100644 --- a/doc/ref/api-foreign.texi +++ b/doc/ref/api-foreign.texi @@ -813,8 +813,8 @@ tightly packed structs and unions by hand. See the code for Of course, the land of C is not all nouns and no verbs: there are functions too, and Guile allows you to call them. -@deffn {Scheme Procedure} pointer->procedure return_type func_ptr arg_types -@deffnx {C Procedure} scm_pointer_to_procedure (return_type, func_ptr, arg_types) +@deffn {Scheme Procedure} pointer->procedure return_type func_ptr arg_types [return_errno=#f] +@deffnx {C Procedure} scm_pointer_to_procedure (return_type, func_ptr, arg_types, return_errno) Make a foreign function. Given the foreign void pointer @var{func_ptr}, its argument and @@ -825,6 +825,9 @@ and return appropriate values. @var{arg_types} should be a list of foreign types. @code{return_type} should be a foreign type. @xref{Foreign Types}, for more information on foreign types. +@var{return_errno} is @code{#f} in default, if set to @code{#t}, then @var{errno} +will be returned as the second value. + @end deffn Here is a better definition of @code{(math bessel)}: -- 1.7.10.4 --=-1VEnwe9Z1mpPAHI9svww--