Mercurial > hg > xemacs-beta
view src/lisp-union.h @ 5656:e9c3fe82127d
Co-operate with the byte-optimizer in the bytecomp.el labels implementation.
lisp/ChangeLog addition:
2012-05-05 Aidan Kehoe <kehoea@parhasard.net>
Co-operate with the byte-optimizer in the bytecomp.el labels
implementation, don't work against it.
* byte-optimize.el:
* byte-optimize.el (byte-compile-inline-expand):
Call #'byte-compile-unfold-lambda explicitly here, don't assume
that the byte-optimizer will do it.
* byte-optimize.el (byte-compile-unfold-lambda):
Call #'byte-optimize-body on the body, don't just mapcar
#'byte-optimize-form along it.
* byte-optimize.el (byte-optimize-lambda): New. Optimize a lambda
form.
* byte-optimize.el (byte-optimize-form-code-walker):
Descend lambda expressions, defun, and defmacro, relevant for
lexically-oriented operators like #'labels.
* byte-optimize.el (byte-optimize-body): Only return a non-eq
object if we've actually optimized something
* bytecomp.el (byte-compile-initial-macro-environment):
In the labels implementation, work with the byte optimizer, not
against it; warn when labels are defined but not used,
automatically inline labels that are used only once.
* bytecomp.el (byte-recompile-directory):
No need to wrap #'byte-compile-report-error in a lambda with
#'call-with-condition-handler here.
* bytecomp.el (byte-compile-form):
Don't inline compiled-function objects, they're probably labels.
* bytecomp.el (byte-compile-funcall):
No longer inline lambdas, trust the byte optimizer to have done it
properly, even for labels.
* cl-extra.el (cl-macroexpand-all):
Treat labels established by the byte compiler distinctly from
those established by cl-macs.el.
* cl-macs.el (cl-do-proclaim):
Treat labels established by the byte compiler distinctly from
those established by cl-macs.el.
* gui.el (make-gui-button):
When referring to the #'gui-button-action label, quote it using
function, otherwise there's a warning from the byte compiler.
author | Aidan Kehoe <kehoea@parhasard.net> |
---|---|
date | Sat, 05 May 2012 20:48:24 +0100 |
parents | 56144c8593a8 |
children |
line wrap: on
line source
/* Fundamental definitions for XEmacs Lisp interpreter -- union objects. Copyright (C) 1985, 1986, 1987, 1992, 1993, 1994 Free Software Foundation, Inc. Copyright (C) 2002, 2005, 2010 Ben Wing. 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/>. */ /* Divergent from FSF. */ /* Definition of Lisp_Object type as a union. The declaration order of the objects within the struct members of the union is dependent on ENDIAN-ness. See lisp-disunion.h for more details. */ typedef union Lisp_Object { /* if non-valbits are at lower addresses */ #ifdef WORDS_BIGENDIAN struct { EMACS_UINT val : VALBITS; enum_field (Lisp_Type) type : GCTYPEBITS; } gu; struct { signed EMACS_INT val : FIXNUM_VALBITS; unsigned int bits : FIXNUM_GCBITS; } s; struct { EMACS_UINT val : FIXNUM_VALBITS; unsigned int bits : FIXNUM_GCBITS; } u; #else /* non-valbits are at higher addresses */ struct { enum_field (Lisp_Type) type : GCTYPEBITS; EMACS_UINT val : VALBITS; } gu; struct { unsigned int bits : FIXNUM_GCBITS; signed EMACS_INT val : FIXNUM_VALBITS; } s; struct { unsigned int bits : FIXNUM_GCBITS; EMACS_UINT val : FIXNUM_VALBITS; } u; #endif /* non-valbits are at higher addresses */ EMACS_UINT ui; signed EMACS_INT i; /* This was formerly declared `void *v' etc. but that causes GCC to accept any (yes, any) pointer as the argument of a function declared to accept a Lisp_Object. */ struct nosuchstruct *v; } Lisp_Object; #define XCHARVAL(x) ((EMACS_INT)(x).gu.val) #define XPNTRVAL(x) ((x).ui) #define XREALFIXNUM(x) ((EMACS_INT)(x).s.val) #define XUINT(x) ((EMACS_UINT)(x).u.val) #define XTYPE(x) ((x).gu.type) #define EQ(x,y) ((x).v == (y).v) DECLARE_INLINE_HEADER ( Lisp_Object make_fixnum_verify (EMACS_INT val) ) { Lisp_Object obj; obj.s.bits = 1; obj.s.val = val; type_checking_assert (XREALFIXNUM (obj) == val); return obj; } DECLARE_INLINE_HEADER ( Lisp_Object make_fixnum (EMACS_INT val) ) { Lisp_Object obj; obj.s.bits = 1; obj.s.val = val; return obj; } DECLARE_INLINE_HEADER ( Lisp_Object make_char_1 (Ichar val) ) { Lisp_Object obj; obj.gu.type = Lisp_Type_Char; obj.gu.val = val; return obj; } DECLARE_INLINE_HEADER ( Lisp_Object wrap_pointer_1 (const void *ptr) ) { Lisp_Object obj; obj.ui = (EMACS_UINT) ptr; return obj; } extern MODULE_API Lisp_Object Qnull_pointer, Qzero; #define FIXNUMP(x) ((x).s.bits) #define FIXNUM_PLUS(x,y) make_fixnum (XFIXNUM (x) + XFIXNUM (y)) #define FIXNUM_MINUS(x,y) make_fixnum (XFIXNUM (x) - XFIXNUM (y)) #define FIXNUM_PLUS1(x) make_fixnum (XFIXNUM (x) + 1) #define FIXNUM_MINUS1(x) make_fixnum (XFIXNUM (x) - 1) /* WARNING!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! You can only GET_LISP_FROM_VOID something that had previously been STORE_LISP_IN_VOID'd. If you want to go the other way, use STORE_VOID_IN_LISP and GET_VOID_FROM_LISP, or use make_opaque_ptr(). */ /* Convert a Lisp object to a void * pointer, as when it needs to be passed to a toolkit callback function */ #define STORE_LISP_IN_VOID(larg) ((void *) ((larg).v)) /* Convert a void * pointer back into a Lisp object, assuming that the pointer was generated by STORE_LISP_IN_VOID. */ DECLARE_INLINE_HEADER ( Lisp_Object GET_LISP_FROM_VOID (const void *arg) ) { Lisp_Object larg; larg.v = (struct nosuchstruct *) arg; return larg; } /* Convert a Lisp_Object into something that can't be used as an lvalue. Useful for type-checking. */ #if (__GNUC__ > 1) #define NON_LVALUE(larg) ({ (larg); }) #else /* Well, you can't really do it without using a function call, and there's no real point in that; no-union-type is the rule, and that will catch errors. */ #define NON_LVALUE(larg) (larg) #endif