Mercurial > hg > xemacs-beta
view tests/sigpipe.c @ 5566:4654c01af32b
Improve the implementation, documentation of #'labels, #'flet.
lisp/ChangeLog addition:
2011-09-07 Aidan Kehoe <kehoea@parhasard.net>
* bytecomp.el:
* bytecomp.el (for-effect): Move this earlier in the file, it's
referenced in byte-compile-initial-macro-environment.
* bytecomp.el (byte-compile-initial-macro-environment):
In the byte-compile-macro-environment definition for #'labels, put
off the compiling the lambda bodies until the point where the rest
of the form is being compiled, allowing the lambda bodies to
access appropriate values for byte-compile-bound-variables, and
reducing excessive warning about free variables.
Add a byte-compile-macro-environment definition for #'flet. This
modifies byte-compile-function-environment appropriately, and
warns about bindings of functions that have macro definitions in
the current environment, about functions that have byte codes, and
about functions that have byte-compile methods (which may not do
what the user wants at runtime).
* bytecomp.el (byte-compile-funcall):
If FUNCTION is constant, call #'byte-compile-callargs-warn if
that's appropriate, giving warnings about problems with calling
functions bound with #'labels.
* cl-macs.el:
* cl-macs.el (flet):
Mention the main difference from Common Lisp, that the bindings
are dynamic, not lexical. Counsel the use of #'labels, not #'flet,
for this and other reasons. Explain the limited single use case for
#'flet. Cross-reference to bytecomp.el in a comment.
* cl-macs.el (labels):
Go into detail on which functions may be called from
where. Explain how to access the function definition of a label
within FORM. Add a comment cross-referencing to bytecomp.el.
man/ChangeLog addition:
2011-09-07 Aidan Kehoe <kehoea@parhasard.net>
* cl.texi (Function Bindings):
Move #'labels first, describe it in more detail, explaining that
it is to be preferred over #'flet, and explaining why.
Explain that dynamic bindings with #'flet will also not work when
functions are accessed through their bytecodes.
author | Aidan Kehoe <kehoea@parhasard.net> |
---|---|
date | Wed, 07 Sep 2011 16:26:45 +0100 |
parents | 308d34e9f07d |
children |
line wrap: on
line source
/* code is all from loser.c and loser.el by Mly Copyright (C) 2002 Richard Mlynarik <mly@pobox.com> This file is part of XEmacs. XEmacs is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. XEmacs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with XEmacs. If not, see <http://www.gnu.org/licenses/>. Commentary: Compile this file. Run it in the background giving it a command line argument PORT which is a positive integer 1024 < PORT < 32768 (avoid the numbers assigned in /etc/services). Then start up a fresh (you're going to crash) XEmacs. Execute the following (defun lose (port) (interactive "nUrk: ") (require 'comint) (while t (condition-case e (let* ((name "*lose*") (b (get-buffer-create name))) (switch-to-buffer b) (comint-mode) (comint-exec b name (cons "127.0.0.1" port) nil '()) (process-send-string (get-buffer-process b) "\377\373\001") (process-send-string (get-buffer-process b) "\377\373\001")) (error (message "URK: %s" e)) (sit-for 1)))) Then M-x lose RET PORT RET and you lose big (in XEmacs 21.1, anyway). Note: the error messages are proper functioning. What should eventually happen after a number of SIGPIPEs is that you get a SIGSEGV and life is bad and XEmacs is dead. */ #include <arpa/inet.h> int main (int argc, char **argv) { struct sockaddr_in junk; int s; memset (&junk, 0, sizeof (junk)); junk.sin_family = AF_INET; junk.sin_addr.s_addr = htonl (INADDR_ANY); /* un*x sucks */ junk.sin_port = htons (atoi (argv[1])); /* un*x blows */ s = socket (PF_INET, SOCK_STREAM, 0); bind (s, (struct sockaddr *)&junk, sizeof (junk)); listen (s, 1); for (;;) { int loser = accept (s, NULL, 0); close (loser); } }