With dynamic loading enabled the function ctk_textentry_input_null() lives in the persistent core while the macro CTK_TEXTENTRY() is typically used in loadable modules. So ctk_textentry_input_null() needs to be dynamically resolved.

On Win32 dynamic resolving isn't done by patching the dynamically loaded segments. Rather the code generated by the compiler for accessing symbols declared with __declspec(dllimport) is implicitly modified to actually go through pointer dereferenciations. The dynamic linker only initializes this pointers.

But with the symbol ctk_textentry_input_null becoming a pointer to a function it isn't a constant anymore and so it can't be used as initializer element - and thus breaking CTK_TEXTENTRY().

So the only viable solution seems to stick to the inversally available NULL pointer on Win32. But if there's an ugly #ifdef <platform> necessary anyway than it seems resonable to classify ctk_textentry_input_null as the special case and therefore use #ifdef SDCC:
- It saves some bytes on all non-SDCC platforms
- Is matches the exsisting inline documentation
This commit is contained in:
oliverschmidt 2009-02-28 10:43:30 +00:00
parent 75d8c75768
commit a7cb609321
2 changed files with 12 additions and 2 deletions

View file

@ -44,7 +44,7 @@
*
* This file is part of the Contiki operating system.
*
* $Id: ctk.c,v 1.23 2009/02/27 14:42:49 oliverschmidt Exp $
* $Id: ctk.c,v 1.24 2009/02/28 10:43:30 oliverschmidt Exp $
*
*/
@ -1165,6 +1165,7 @@ activate(CC_REGISTER_ARG struct ctk_widget *w)
return REDRAW_NONE;
}
/*---------------------------------------------------------------------------*/
#ifdef SDCC
/* Dummy function that we define to keep sdcc happy - with sdcc,
function pointers cannot be NULL. ctk_textentry_input is typedef'd
in ctk/ctk.h, hence the strange-looking function signature. */
@ -1173,6 +1174,7 @@ ctk_textentry_input_null(ctk_arch_key_t c, struct ctk_textentry *t)
{
return 0;
}
#endif /* SDCC */
/*---------------------------------------------------------------------------*/
static void CC_FASTCALL
textentry_input(ctk_arch_key_t c, CC_REGISTER_ARG struct ctk_textentry *t)

View file

@ -43,7 +43,7 @@
*
* This file is part of the Contiki desktop OS.
*
* $Id: ctk.h,v 1.8 2009/02/25 09:01:38 adamdunkels Exp $
* $Id: ctk.h,v 1.9 2009/02/28 10:43:30 oliverschmidt Exp $
*
*/
@ -266,9 +266,15 @@ typedef unsigned char (* ctk_textentry_input)(ctk_arch_key_t c,
* \param text A pointer to the buffer that should be edited.
* \param len The length of the text buffer
*/
#ifdef SDCC
#define CTK_TEXTENTRY(x, y, w, h, text, len) \
NULL, NULL, x, y, CTK_WIDGET_TEXTENTRY, w, 1, CTK_WIDGET_FLAG_INITIALIZER(0) text, len, \
CTK_TEXTENTRY_NORMAL, 0, 0, ctk_textentry_input_null
#else /* SDCC */
#define CTK_TEXTENTRY(x, y, w, h, text, len) \
NULL, NULL, x, y, CTK_WIDGET_TEXTENTRY, w, 1, CTK_WIDGET_FLAG_INITIALIZER(0) text, len, \
CTK_TEXTENTRY_NORMAL, 0, 0, NULL
#endif /* SDCC */
#define CTK_TEXTENTRY_INPUT(x, y, w, h, text, len, input) \
NULL, NULL, x, y, CTK_WIDGET_TEXTENTRY, w, h, CTK_WIDGET_FLAG_INITIALIZER(0) text, len, \
CTK_TEXTENTRY_NORMAL, 0, 0, input
@ -288,9 +294,11 @@ struct ctk_textentry {
ctk_textentry_input input;
};
#ifdef SDCC
/* Dummy function that we define to keep sdcc happy - with sdcc,
function pointers cannot be NULL.*/
unsigned char ctk_textentry_input_null(ctk_arch_key_t c, struct ctk_textentry *t);
#endif /* SDCC */
#if CTK_CONF_ICON_BITMAPS
#define CTK_ICON_BITMAP(bitmap) bitmap