unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
From: Paul Eggert <eggert@cs.ucla.edu>
To: "Óscar Fuentes" <ofv@wanadoo.es>
Cc: Eli Zaretskii <eliz@gnu.org>,
	Andreas Schwab <schwab@linux-m68k.org>,
	emacs-devel@gnu.org
Subject: Re: External inline functions
Date: Sun, 06 Nov 2011 13:20:07 -0800	[thread overview]
Message-ID: <4EB6FA07.9000602@cs.ucla.edu> (raw)
In-Reply-To: <87fwi1asti.fsf@wanadoo.es>

Yes, that's right: pre-C99 'inline' is a portability minefield,
and GNU Emacs isn't portable even to C99's tricky semantics
for extern inline (among other things, extern inline functions
cannot call static functions).

I installed the following to work around the problems in this area that
I found.  But as this issue keeps coming up, how about if we
simply stop using extern inline functions?  They do not buy us
significant performance, and they are a hassle that is causing
portability problems, so this should be an easy call.

====

Fix some portability problems with 'inline'.
* dispextern.h (window_box, window_box_height, window_text_bottom_y)
(window_box_width, window_box_left, window_box_left_offset)
(window_box_right, window_box_right_offset): Declare extern.
Otherwise, these inline functions do not conform to C99 and
are miscompiled by Microsoft compilers.  Reported by Eli Zaretskii in
<http://lists.gnu.org/archive/html/emacs-devel/2011-11/msg00084.html>.
* intervals.c (adjust_intervals_for_insertion)
(adjust_intervals_for_deletion): Now extern, because otherwise the
extern inline functions 'offset_intervals' couldn't refer to it.
(static_offset_intervals): Remove.
(offset_intervals): Rewrite using the old contents of
static_offset_intervals.  The old version didn't conform to C99
because an extern inline function contained a reference to an
identifier with static linkage.
=== modified file 'src/dispextern.h'
--- src/dispextern.h	2011-10-25 16:36:20 +0000
+++ src/dispextern.h	2011-11-06 21:03:15 +0000
@@ -3006,14 +3006,14 @@
 void set_vertical_scroll_bar (struct window *);
 #endif
 int try_window (Lisp_Object, struct text_pos, int);
-void window_box (struct window *, int, int *, int *, int *, int *);
-int window_box_height (struct window *);
-int window_text_bottom_y (struct window *);
-int window_box_width (struct window *, int);
-int window_box_left (struct window *, int);
-int window_box_left_offset (struct window *, int);
-int window_box_right (struct window *, int);
-int window_box_right_offset (struct window *, int);
+extern void window_box (struct window *, int, int *, int *, int *, int *);
+extern int window_box_height (struct window *);
+extern int window_text_bottom_y (struct window *);
+extern int window_box_width (struct window *, int);
+extern int window_box_left (struct window *, int);
+extern int window_box_left_offset (struct window *, int);
+extern int window_box_right (struct window *, int);
+extern int window_box_right_offset (struct window *, int);
 int estimate_mode_line_height (struct frame *, enum face_id);
 void pixel_to_glyph_coords (struct frame *, int, int, int *, int *,
                             NativeRectangle *, int);

=== modified file 'src/intervals.c'
--- src/intervals.c	2011-10-26 01:18:13 +0000
+++ src/intervals.c	2011-11-06 21:03:14 +0000
@@ -52,6 +52,11 @@

 #define TMEM(sym, set) (CONSP (set) ? ! NILP (Fmemq (sym, set)) : ! NILP (set))

+extern INTERVAL adjust_intervals_for_insertion (INTERVAL,
+						EMACS_INT, EMACS_INT);
+extern void adjust_intervals_for_deletion (struct buffer *,
+					   EMACS_INT, EMACS_INT);
+
 static Lisp_Object merge_properties_sticky (Lisp_Object, Lisp_Object);
 static INTERVAL merge_interval_right (INTERVAL);
 static INTERVAL reproduce_tree (INTERVAL, INTERVAL);
@@ -798,7 +803,7 @@
    and check the hungry bits of both.  Then add the length going back up
    to the root.  */

-static INTERVAL
+INTERVAL
 adjust_intervals_for_insertion (INTERVAL tree, EMACS_INT position,
 				EMACS_INT length)
 {
@@ -859,7 +864,7 @@
    interval.  Another possibility would be to create a new interval for
    this text, and make it have the merged properties of both ends.  */

-static INTERVAL
+INTERVAL
 adjust_intervals_for_insertion (INTERVAL tree,
 				EMACS_INT position, EMACS_INT length)
 {
@@ -1369,7 +1374,7 @@
    text.  The deletion is effected at position START (which is a
    buffer position, i.e. origin 1).  */

-static void
+void
 adjust_intervals_for_deletion (struct buffer *buffer,
 			       EMACS_INT start, EMACS_INT length)
 {
@@ -1425,9 +1430,8 @@
    compiler that does not allow calling a static function (here,
    adjust_intervals_for_deletion) from a non-static inline function.  */

-static inline void
-static_offset_intervals (struct buffer *buffer, EMACS_INT start,
-			 EMACS_INT length)
+inline void
+offset_intervals (struct buffer *buffer, EMACS_INT start, EMACS_INT length)
 {
   if (NULL_INTERVAL_P (BUF_INTERVALS (buffer)) || length == 0)
     return;
@@ -1440,12 +1444,6 @@
       adjust_intervals_for_deletion (buffer, start, -length);
     }
 }
-
-inline void
-offset_intervals (struct buffer *buffer, EMACS_INT start, EMACS_INT length)
-{
-  static_offset_intervals (buffer, start, length);
-}
 \f
 /* Merge interval I with its lexicographic successor. The resulting
    interval is returned, and has the properties of the original




  reply	other threads:[~2011-11-06 21:20 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-11-06 18:36 External inline functions Eli Zaretskii
2011-11-06 19:00 ` Andreas Schwab
2011-11-06 20:39   ` Óscar Fuentes
2011-11-06 21:20     ` Paul Eggert [this message]
2011-11-07  3:51       ` Eli Zaretskii
2011-11-08  9:59         ` Chong Yidong
2011-11-08 20:07           ` Paul Eggert

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/emacs/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4EB6FA07.9000602@cs.ucla.edu \
    --to=eggert@cs.ucla.edu \
    --cc=eliz@gnu.org \
    --cc=emacs-devel@gnu.org \
    --cc=ofv@wanadoo.es \
    --cc=schwab@linux-m68k.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.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

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).