Mercurial > hg > xemacs-beta
annotate src/ui-gtk.h @ 4686:cdabd56ce1b5
Fix various small issues with the multiple-value implementation.
lisp/ChangeLog addition:
2009-08-31 Aidan Kehoe <kehoea@parhasard.net>
* byte-optimize.el (byte-optimize-form-code-walker):
Be careful about discarding multiple values when optimising
#'prog1 calls.
(byte-optimize-or):
Preserve any trailing nil, as this is a supported way to
explicitly discard multiple values.
(byte-optimize-cond-1):
Discard multiple values with a singleton followed by no more
clauses.
* bytecomp.el (progn):
(prog1):
(prog2):
Be careful about discarding multiple values in the byte-hunk
handler of these three forms.
* bytecomp.el (byte-compile-prog1, byte-compile-prog2):
Don't call #'values explicitly, use `(or ,(pop form) nil) instead,
since that compiles to bytecode, not a funcall.
* bytecomp.el (byte-compile-values):
With one non-const argument, byte-compile to `(or ,(second form)
nil), not an explicit #'values call.
* bytecomp.el (byte-compile-insert-header):
Be nicer in the error message to emacs versions that don't
understand our bytecode.
src/ChangeLog addition:
2009-08-31 Aidan Kehoe <kehoea@parhasard.net>
* eval.c (For, Fand):
Don't declare val as REGISTER in these functions, for some reason
it breaks the non-DEBUG union build. These functions are only
called from interpreted code, the performance implication doesn't
matter. Thank you Robert Delius Royar!
* eval.c (Fmultiple_value_list_internal):
Error on too many arguments.
tests/ChangeLog addition:
2009-08-31 Aidan Kehoe <kehoea@parhasard.net>
* automated/lisp-tests.el (Assert-rounding):
Remove an overly-verbose failure message here.
Correct a couple of tests which were buggy in themselves. Add
three new tests, checking the behaviour of #'or and #'and when
passed zero arguments, and a Known-Bug-Expect-Failure call
involving letf and values. (The bug predates the C-level
multiple-value implementation.)
author | Aidan Kehoe <kehoea@parhasard.net> |
---|---|
date | Sun, 06 Sep 2009 19:36:02 +0100 |
parents | 1e7cc382eb16 |
children | db7068430402 |
rev | line source |
---|---|
462 | 1 /* ui-gtk.h |
2 ** | |
3 ** Description: | |
4 ** | |
5 ** Created by: William M. Perry | |
6 ** Copyright (c) 2000 Aventail Corporation | |
7 ** | |
8 */ | |
9 | |
10 #ifndef __UI_GTK_H__ | |
11 #define __UI_GTK_H__ | |
12 | |
13 /* Encapsulate a foreign function call */ | |
14 #include <gtk/gtk.h> | |
15 #include "sysdll.h" | |
16 #include "lrecord.h" | |
17 | |
18 typedef void (*ffi_actual_function) (void); | |
19 typedef void (*ffi_marshalling_function) (ffi_actual_function, GtkArg *); | |
20 | |
21 #define MAX_GTK_ARGS 100 | |
22 | |
23 typedef struct { | |
3017 | 24 struct LCRECORD_HEADER header; |
462 | 25 GtkType return_type; |
26 GtkType args[MAX_GTK_ARGS]; | |
27 gint n_args; | |
28 Lisp_Object function_name; | |
29 dll_func function_ptr; | |
30 ffi_marshalling_function marshal; | |
31 } emacs_ffi_data; | |
32 | |
33 DECLARE_LRECORD (emacs_ffi, emacs_ffi_data); | |
34 | |
35 #define XFFI(x) XRECORD (x, emacs_ffi, emacs_ffi_data) | |
617 | 36 #define wrap_emacs_ffi(p) wrap_record (p, emacs_ffi) |
462 | 37 #define FFIP(x) RECORDP (x, emacs_ffi) |
38 #define CHECK_FFI(x) CHECK_RECORD (x, emacs_ffi) | |
39 | |
40 /* Encapsulate a GtkObject in Lisp */ | |
41 typedef struct { | |
3017 | 42 struct LCRECORD_HEADER header; |
462 | 43 gboolean alive_p; |
44 GtkObject *object; | |
45 Lisp_Object plist; | |
46 } emacs_gtk_object_data; | |
47 | |
48 DECLARE_LRECORD (emacs_gtk_object, emacs_gtk_object_data); | |
49 | |
50 #define XGTK_OBJECT(x) XRECORD (x, emacs_gtk_object, emacs_gtk_object_data) | |
617 | 51 #define wrap_emacs_gtk_object(p) wrap_record (p, emacs_gtk_object) |
462 | 52 #define GTK_OBJECTP(x) RECORDP (x, emacs_gtk_object) |
53 #define CHECK_GTK_OBJECT(x) CHECK_RECORD (x, emacs_gtk_object) | |
54 | |
55 extern Lisp_Object build_gtk_object (GtkObject *obj); | |
56 | |
57 /* Encapsulate a GTK_TYPE_BOXED in lisp */ | |
58 typedef struct { | |
3017 | 59 struct LCRECORD_HEADER header; |
462 | 60 GtkType object_type; |
61 void *object; | |
62 } emacs_gtk_boxed_data; | |
63 | |
64 DECLARE_LRECORD (emacs_gtk_boxed, emacs_gtk_boxed_data); | |
65 | |
66 #define XGTK_BOXED(x) XRECORD (x, emacs_gtk_boxed, emacs_gtk_boxed_data) | |
617 | 67 #define wrap_emacs_gtk_boxed(p) wrap_record (p, emacs_gtk_boxed) |
462 | 68 #define GTK_BOXEDP(x) RECORDP (x, emacs_gtk_boxed) |
69 #define CHECK_GTK_BOXED(x) CHECK_RECORD (x, emacs_gtk_boxed) | |
70 | |
778 | 71 extern Lisp_Object build_gtk_boxed (void *obj, GtkType t); |
72 | |
462 | 73 #endif /* __UI_GTK_H__ */ |