From: ludo@gnu.org (Ludovic Courtès)
To: guile-devel@gnu.org
Subject: Re: [BDW-GC] Static allocation of subrs
Date: Tue, 03 Feb 2009 00:38:07 +0100 [thread overview]
Message-ID: <87iqnsbeao.fsf@gnu.org> (raw)
In-Reply-To: 87wsc8jys1.fsf@arudy.ossau.uklinux.net
Hi Neil,
Note: I reply to messages in order of least difficulty. ;-)
Neil Jerram <neil@ossau.uklinux.net> writes:
> ludo@gnu.org (Ludovic Courtès) writes:
>> For these reasons, we may want to merge this patch in `master' as
>> well.
>
> Yes, I think so.
Noted, will do.
>> 2. The second step does the actual work [1]. Currently, it only
>> deals with subrs, i.e., primitive procedures with "relatively few"
>> arguments (see `create_gsubr ()').
>
> Presumably that is in practice almost all of the primitives, though?
That's 200 gsubrs, vs. 873 "simple" subrs.
>> To distinguish subrs (few arguments) from gsubrs (unrestricted
>> arity, see `default:' in `create_gsubr ()'), a Dirty Hack(tm) was
>> needed. The hack is that `SCM_DEFINE' is an alias for a new macro
>> `SCM_DEFINE_SUBR_reqX_optY_rstZ', where X, Y and Z are the number
>> of required, optional and rest arguments. If X, Y and Z are such
>> that a raw subr can be used, then the macro is an alias for
>> `SCM_DEFINE_SUBR', which does the actual static allocation;
>> otherwise, it's an alias for `SCM_DEFINE_GSUBR', which is the same
>> as `SCM_DEFINE' in `master'.
>
> Not so bad, IMO.
It breaks cases like primitive procedures with more than 16 arguments
(because I arbitrarily decided that `snarf-gsubr.h' would contain
definitions up to 16 req/opt args), and situations like:
SCM_DEFINE (scm_foo, "foo", 0001, 0002, 0003, ...)
This is probably acceptable in practice.
>> The dirtiest part of the hack is the generation of "snarf-gsubr.h"
>> which contains definitions of `SCM_DEFINE_SUBR_reqX_optY_rstZ' for
>> a "reasonable" number of combinations of X, Y and Z (C++ template
>> specialization would solve this problem much more elegantly...).
>
> This part is quite dirty, as you say. I'm not sure what's the
> advantage of the generation at make time. Wouldn't it be simpler, and
> have the same function, just to hardcode all these definitions
> directly in snarf.h?
Given the size of `snarf-gsubr.h' (there are 16 * 16 * 2 = 512
combinations), I'd rather keep it separated. The makefile rule is an
efficient way to compress it. ;-)
>> [0] http://git.savannah.gnu.org/gitweb/?p=guile.git;a=commitdiff;h=2ee5aa25dbd679b175707762f5961585027e1397
>
> Should probably remove the comments about how many subrs there are,
> since it's no longer relevant.
Right.
> I see there's no NEWS in the commit; is that because there's no impact
> on the API? Even if so, I imagine it might merit a line in the 2.0
> release notes. If you agree, I'd encourage you to write the NEWS now,
> rather than adding it later.
Right. It's just that I have not maintained any NEWS file for
BDW-GC-related changes, initially.
> + meta_info = scm_gc_malloc (2 * sizeof (* meta_info),
> + "subr meta-info");
>
> I found the space between "*" and "meta_info" confusing for a few
> seconds, so would have a preference for "*meta_info".
Yes, I feel the same today (I probably felt differently that day). :-)
>> [1] http://git.savannah.gnu.org/gitweb/?p=guile.git;a=commitdiff;h=46f9baf49a8ea4461e8494c75a88b87d0f5c5195
>
> Why does the macro code sometimes use scm_i_paste, and sometimes ##
> directly?
The `scm_i_paste ()' macro is needed so that macro-expansion of
definitions like those of `srfi-4.i.c' work as expected. There are a
few cases where it isn't used (e.g., in `SCM_IMMUTABLE_DOUBLE_CELL ()'),
but I guess it didn't cause any problem because `scm_i_paste ()' was
properly used by callers. We could unify that but `scm_i_paste ()' has
the drawback of having a long name.
> Finally SCM_SUBR_ARITY_TO_TYPE... The implementation feels a bit
> messy, but I don't have any alternative to suggest, so I guess that's
> OK.
The problem is that this information is shared among 3 places:
`SCM_SUBR_ARITY_TO_TYPE ()', `create_gsubr ()', and
`SCM_DEFINE_SUBR_reqX_optY_rstZ ()'. Ideally, all 3 would be generated
from a single source.
Besides, I think we need to review the use of subr/gsubr tag in detail
to see whether we can make better use of them.
> But what about the fact that it's added to the libguile API? I
> realize that this is necessary to some extent so that snarf.h can be
> used by application code - but can we somehow restrict
> SCM_SUBR_ARITY_TO_TYPE to being used in that context, so that it
> doesn't become on ongoing constraint for us?
I share your concern, but I have no idea of how to avoid it. We could
add `_I_' in its name, perhaps. Hopefully, it's too low-level for
anyone to try it.
Thanks,
Ludo'.
next prev parent reply other threads:[~2009-02-02 23:38 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-01-31 21:43 [BDW-GC] Static allocation of subrs Ludovic Courtès
[not found] ` <77A87EC6-5495-4F14-9AEB-3489B3AC0210@raeburn.org>
2009-02-02 8:42 ` Ludovic Courtès
2009-02-02 21:48 ` Neil Jerram
2009-02-02 23:38 ` Ludovic Courtès [this message]
2009-02-03 20:13 ` Neil Jerram
2009-03-16 18:17 ` Ludovic Courtès
2009-02-11 23:19 ` Ludovic Courtès
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.gnu.org/software/guile/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87iqnsbeao.fsf@gnu.org \
--to=ludo@gnu.org \
--cc=guile-devel@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).