From d43b63f7c3ecded6e6135bb7025d151343a0dcce Mon Sep 17 00:00:00 2001 From: "jan.nijtmans" Date: Thu, 5 May 2022 13:32:33 +0000 Subject: Proposed fix for [eedd795d98]: sizeof(enum) != sizeof(int) --- generic/tkButton.c | 28 +++++++++++----------- generic/tkConfig.c | 59 ++++++++++++++++++++++++++++++++++++++++++----- generic/tkInt.h | 2 ++ generic/tkMenubutton.c | 8 +++---- generic/tkPanedWindow.c | 6 ++--- generic/tkPlace.c | 2 +- generic/tkScale.c | 4 ++-- generic/tkText.c | 4 ++-- generic/tkTextTag.c | 2 +- generic/ttk/ttkEntry.c | 2 +- generic/ttk/ttkNotebook.c | 4 ++-- 11 files changed, 85 insertions(+), 36 deletions(-) diff --git a/generic/tkButton.c b/generic/tkButton.c index 78bb5e1..344d1f1 100644 --- a/generic/tkButton.c +++ b/generic/tkButton.c @@ -82,8 +82,8 @@ static const Tk_OptionSpec labelOptionSpecs[] = { tkDefButtonBorderWidth, Tk_Offset(TkButton, borderWidthPtr), Tk_Offset(TkButton, borderWidth), 0, 0, 0}, {TK_OPTION_STRING_TABLE, "-compound", "compound", "Compound", - DEF_BUTTON_COMPOUND, -1, Tk_Offset(TkButton, compound), 0, - tkCompoundStrings, 0}, + DEF_BUTTON_COMPOUND, -1, Tk_Offset(TkButton, compound), + 0, tkCompoundStrings, 0}, {TK_OPTION_CURSOR, "-cursor", "cursor", "Cursor", DEF_BUTTON_CURSOR, -1, Tk_Offset(TkButton, cursor), TK_OPTION_NULL_OK, 0, 0}, @@ -125,7 +125,7 @@ static const Tk_OptionSpec labelOptionSpecs[] = { DEF_LABCHKRAD_RELIEF, -1, Tk_Offset(TkButton, relief), 0, 0, 0}, {TK_OPTION_STRING_TABLE, "-state", "state", "State", DEF_BUTTON_STATE, -1, Tk_Offset(TkButton, state), - 0, tkStateStrings, 0}, + TK_OPTION_ENUM_VAR, tkStateStrings, 0}, {TK_OPTION_STRING, "-takefocus", "takeFocus", "TakeFocus", DEF_LABEL_TAKE_FOCUS, Tk_Offset(TkButton, takeFocusPtr), -1, TK_OPTION_NULL_OK, 0, 0}, @@ -170,14 +170,14 @@ static const Tk_OptionSpec buttonOptionSpecs[] = { DEF_BUTTON_COMMAND, Tk_Offset(TkButton, commandPtr), -1, TK_OPTION_NULL_OK, 0, 0}, {TK_OPTION_STRING_TABLE, "-compound", "compound", "Compound", - DEF_BUTTON_COMPOUND, -1, Tk_Offset(TkButton, compound), 0, - tkCompoundStrings, 0}, + DEF_BUTTON_COMPOUND, -1, Tk_Offset(TkButton, compound), + 0, tkCompoundStrings, 0}, {TK_OPTION_CURSOR, "-cursor", "cursor", "Cursor", DEF_BUTTON_CURSOR, -1, Tk_Offset(TkButton, cursor), TK_OPTION_NULL_OK, 0, 0}, {TK_OPTION_STRING_TABLE, "-default", "default", "Default", - DEF_BUTTON_DEFAULT, -1, Tk_Offset(TkButton, defaultState), - 0, tkStateStrings, 0}, + DEF_BUTTON_DEFAULT, -1, Tk_Offset(TkButton, defaultState), + TK_OPTION_ENUM_VAR, tkStateStrings, 0}, {TK_OPTION_COLOR, "-disabledforeground", "disabledForeground", "DisabledForeground", DEF_BUTTON_DISABLED_FG_COLOR, -1, Tk_Offset(TkButton, disabledFg), TK_OPTION_NULL_OK, @@ -226,7 +226,7 @@ static const Tk_OptionSpec buttonOptionSpecs[] = { 0, 0, 0}, {TK_OPTION_STRING_TABLE, "-state", "state", "State", DEF_BUTTON_STATE, -1, Tk_Offset(TkButton, state), - 0, tkStateStrings, 0}, + TK_OPTION_ENUM_VAR, tkStateStrings, 0}, {TK_OPTION_STRING, "-takefocus", "takeFocus", "TakeFocus", DEF_BUTTON_TAKE_FOCUS, Tk_Offset(TkButton, takeFocusPtr), -1, TK_OPTION_NULL_OK, 0, 0}, @@ -271,8 +271,8 @@ static const Tk_OptionSpec checkbuttonOptionSpecs[] = { DEF_BUTTON_COMMAND, Tk_Offset(TkButton, commandPtr), -1, TK_OPTION_NULL_OK, 0, 0}, {TK_OPTION_STRING_TABLE, "-compound", "compound", "Compound", - DEF_BUTTON_COMPOUND, -1, Tk_Offset(TkButton, compound), 0, - tkCompoundStrings, 0}, + 0, -1, Tk_Offset(TkButton, compound), + 0, tkCompoundStrings, 0}, {TK_OPTION_CURSOR, "-cursor", "cursor", "Cursor", DEF_BUTTON_CURSOR, -1, Tk_Offset(TkButton, cursor), TK_OPTION_NULL_OK, 0, 0}, @@ -331,7 +331,7 @@ static const Tk_OptionSpec checkbuttonOptionSpecs[] = { TK_OPTION_NULL_OK, 0, 0}, {TK_OPTION_STRING_TABLE, "-state", "state", "State", DEF_BUTTON_STATE, -1, Tk_Offset(TkButton, state), - 0, tkStateStrings, 0}, + TK_OPTION_ENUM_VAR, tkStateStrings, 0}, {TK_OPTION_STRING, "-takefocus", "takeFocus", "TakeFocus", DEF_BUTTON_TAKE_FOCUS, Tk_Offset(TkButton, takeFocusPtr), -1, TK_OPTION_NULL_OK, 0, 0}, @@ -384,8 +384,8 @@ static const Tk_OptionSpec radiobuttonOptionSpecs[] = { DEF_BUTTON_COMMAND, Tk_Offset(TkButton, commandPtr), -1, TK_OPTION_NULL_OK, 0, 0}, {TK_OPTION_STRING_TABLE, "-compound", "compound", "Compound", - DEF_BUTTON_COMPOUND, -1, Tk_Offset(TkButton, compound), 0, - tkCompoundStrings, 0}, + DEF_BUTTON_COMPOUND, -1, Tk_Offset(TkButton, compound), + 0, tkCompoundStrings, 0}, {TK_OPTION_CURSOR, "-cursor", "cursor", "Cursor", DEF_BUTTON_CURSOR, -1, Tk_Offset(TkButton, cursor), TK_OPTION_NULL_OK, 0, 0}, @@ -441,7 +441,7 @@ static const Tk_OptionSpec radiobuttonOptionSpecs[] = { TK_OPTION_NULL_OK, 0, 0}, {TK_OPTION_STRING_TABLE, "-state", "state", "State", DEF_BUTTON_STATE, -1, Tk_Offset(TkButton, state), - 0, tkStateStrings, 0}, + TK_OPTION_ENUM_VAR, tkStateStrings, 0}, {TK_OPTION_STRING, "-takefocus", "takeFocus", "TakeFocus", DEF_BUTTON_TAKE_FOCUS, Tk_Offset(TkButton, takeFocusPtr), -1, TK_OPTION_NULL_OK, 0, 0}, diff --git a/generic/tkConfig.c b/generic/tkConfig.c index 5639de4..21b8afc 100644 --- a/generic/tkConfig.c +++ b/generic/tkConfig.c @@ -27,6 +27,16 @@ #include "tkFont.h" /* + * The following encoding is used in TYPE_FLAGS: + * + * if sizeof(type) == sizeof(int) => TYPE_FLAGS(type) = 0 + * if sizeof(type) == 1 => TYPE_FLAGS(type) = 64 + * if sizeof(type) == 2 => TYPE_FLAGS(type) = 128 + */ +#define TYPE_FLAGS(type) (((int)(sizeof(type)&(sizeof(int)-1))<<6)) +#define TYPE_MASK (((((int)sizeof(int)-1))|3)<<6) + +/* * The following definition keeps track of all of * the option tables that have been created for a thread. */ @@ -688,8 +698,20 @@ DoObjConfig( } } if (internalPtr != NULL) { - *((int *) oldInternalPtr) = *((int *) internalPtr); - *((int *) internalPtr) = newValue; + if (optionPtr->specPtr->flags & TYPE_MASK) { + if ((optionPtr->specPtr->flags & TYPE_MASK) == TYPE_FLAGS(char)) { + *((signed char *) oldInternalPtr) = *((signed char *) internalPtr); + *((signed char *) internalPtr) = newValue; + } else if ((optionPtr->specPtr->flags & TYPE_MASK) == TYPE_FLAGS(short)) { + *((short *) oldInternalPtr) = *((short *) internalPtr); + *((short *) internalPtr) = newValue; + } else { + Tcl_Panic("Invalid flags for %s", "TK_OPTION_STRING_TABLE"); + } + } else { + *((int *) oldInternalPtr) = *((int *) internalPtr); + *((int *) internalPtr) = newValue; + } } break; } @@ -1411,7 +1433,17 @@ Tk_RestoreSavedOptions( *((char **) internalPtr) = *((char **) ptr); break; case TK_OPTION_STRING_TABLE: - *((int *) internalPtr) = *((int *) ptr); + if (optionPtr->specPtr->flags & TYPE_MASK) { + if ((optionPtr->specPtr->flags & TYPE_MASK) == TYPE_FLAGS(char)) { + *((signed char *) internalPtr) = *((signed char *) ptr); + } else if ((optionPtr->specPtr->flags & TYPE_MASK) == TYPE_FLAGS(short)) { + *((short *) internalPtr) = *((short *) ptr); + } else { + Tcl_Panic("Invalid flags for %s", "TK_OPTION_STRING_TABLE"); + } + } else { + *((int *) internalPtr) = *((int *) ptr); + } break; case TK_OPTION_COLOR: *((XColor **) internalPtr) = *((XColor **) ptr); @@ -1882,9 +1914,24 @@ GetObjectForOption( case TK_OPTION_STRING: objPtr = Tcl_NewStringObj(*((char **)internalPtr), -1); break; - case TK_OPTION_STRING_TABLE: - objPtr = Tcl_NewStringObj(((char **) optionPtr->specPtr->clientData)[ - *((int *) internalPtr)], -1); + case TK_OPTION_STRING_TABLE: { + int value; + if (optionPtr->specPtr->flags & TYPE_MASK) { + if ((optionPtr->specPtr->flags & TYPE_MASK) == TYPE_FLAGS(char)) { + value = *((signed char *)internalPtr); + } else if ((optionPtr->specPtr->flags & TYPE_MASK) == TYPE_FLAGS(short)) { + value = *((short *)internalPtr); + } else { + Tcl_Panic("Invalid flags for %s", "TK_OPTION_STRING_TABLE"); + } + } else { + value = *((int *)internalPtr); + } + if (value >= 0) { + objPtr = Tcl_NewStringObj(((char **) optionPtr->specPtr->clientData)[ + value], -1); + } + } break; case TK_OPTION_COLOR: { XColor *colorPtr = *((XColor **)internalPtr); diff --git a/generic/tkInt.h b/generic/tkInt.h index b19e3bd..d3bf908 100644 --- a/generic/tkInt.h +++ b/generic/tkInt.h @@ -19,6 +19,8 @@ #include "tkPort.h" #endif +#define TK_OPTION_ENUM_VAR ((int)(sizeof(Tk_OptionType)&(sizeof(int)-1))<<6) + /* * Ensure WORDS_BIGENDIAN is defined correctly: * Needs to happen here in addition to configure to work with fat compiles on diff --git a/generic/tkMenubutton.c b/generic/tkMenubutton.c index 091fe09..86c09de 100644 --- a/generic/tkMenubutton.c +++ b/generic/tkMenubutton.c @@ -70,7 +70,7 @@ static const Tk_OptionSpec optionSpecs[] = { TK_OPTION_NULL_OK, 0, 0}, {TK_OPTION_STRING_TABLE, "-direction", "direction", "Direction", DEF_MENUBUTTON_DIRECTION, -1, Tk_Offset(TkMenuButton, direction), - 0, directionStrings, 0}, + TK_OPTION_ENUM_VAR, directionStrings, 0}, {TK_OPTION_COLOR, "-disabledforeground", "disabledForeground", "DisabledForeground", DEF_MENUBUTTON_DISABLED_FG_COLOR, -1, Tk_Offset(TkMenuButton, disabledFg), TK_OPTION_NULL_OK, @@ -114,11 +114,11 @@ static const Tk_OptionSpec optionSpecs[] = { DEF_MENUBUTTON_RELIEF, -1, Tk_Offset(TkMenuButton, relief), 0, 0, 0}, {TK_OPTION_STRING_TABLE, "-compound", "compound", "Compound", - DEF_BUTTON_COMPOUND, -1, Tk_Offset(TkMenuButton, compound), 0, - tkCompoundStrings, 0}, + DEF_BUTTON_COMPOUND, -1, Tk_Offset(TkMenuButton, compound), + 0, tkCompoundStrings, 0}, {TK_OPTION_STRING_TABLE, "-state", "state", "State", DEF_MENUBUTTON_STATE, -1, Tk_Offset(TkMenuButton, state), - 0, tkStateStrings, 0}, + TK_OPTION_ENUM_VAR, tkStateStrings, 0}, {TK_OPTION_STRING, "-takefocus", "takeFocus", "TakeFocus", DEF_MENUBUTTON_TAKE_FOCUS, -1, Tk_Offset(TkMenuButton, takeFocus), TK_OPTION_NULL_OK, 0, 0}, diff --git a/generic/tkPanedWindow.c b/generic/tkPanedWindow.c index 06a42d4..f5e01d1 100644 --- a/generic/tkPanedWindow.c +++ b/generic/tkPanedWindow.c @@ -301,7 +301,7 @@ static const Tk_OptionSpec optionSpecs[] = { Tk_Offset(PanedWindow, resizeOpaque), 0, 0, 0}, {TK_OPTION_STRING_TABLE, "-orient", "orient", "Orient", DEF_PANEDWINDOW_ORIENT, -1, Tk_Offset(PanedWindow, orient), - 0, orientStrings, GEOMETRY}, + TK_OPTION_ENUM_VAR, orientStrings, GEOMETRY}, {TK_OPTION_BORDER, "-proxybackground", "proxyBackground", "ProxyBackground", 0, -1, Tk_Offset(PanedWindow, proxyBackground), TK_OPTION_NULL_OK, (ClientData) DEF_PANEDWINDOW_BG_MONO, 0}, @@ -356,8 +356,8 @@ static const Tk_OptionSpec paneOptionSpecs[] = { DEF_PANEDWINDOW_PANE_STICKY, -1, Tk_Offset(Pane, sticky), 0, &stickyOption, 0}, {TK_OPTION_STRING_TABLE, "-stretch", "stretch", "Stretch", - DEF_PANEDWINDOW_PANE_STRETCH, -1, Tk_Offset(Pane, stretch), 0, - (ClientData) stretchStrings, 0}, + DEF_PANEDWINDOW_PANE_STRETCH, -1, Tk_Offset(Pane, stretch), + TK_OPTION_ENUM_VAR, stretchStrings, 0}, {TK_OPTION_PIXELS, "-width", NULL, NULL, DEF_PANEDWINDOW_PANE_WIDTH, Tk_Offset(Pane, widthPtr), Tk_Offset(Pane, width), TK_OPTION_NULL_OK, 0, 0}, diff --git a/generic/tkPlace.c b/generic/tkPlace.c index 3212a58..12192d2 100644 --- a/generic/tkPlace.c +++ b/generic/tkPlace.c @@ -84,7 +84,7 @@ static const Tk_OptionSpec optionSpecs[] = { {TK_OPTION_ANCHOR, "-anchor", NULL, NULL, "nw", -1, Tk_Offset(Content, anchor), 0, 0, 0}, {TK_OPTION_STRING_TABLE, "-bordermode", NULL, NULL, "inside", -1, - Tk_Offset(Content, borderMode), 0, borderModeStrings, 0}, + Tk_Offset(Content, borderMode), TK_OPTION_ENUM_VAR, borderModeStrings, 0}, {TK_OPTION_PIXELS, "-height", NULL, NULL, "", Tk_Offset(Content, heightPtr), Tk_Offset(Content, height), TK_OPTION_NULL_OK, 0, 0}, {TK_OPTION_WINDOW, "-in", NULL, NULL, "", -1, Tk_Offset(Content, inTkwin), diff --git a/generic/tkScale.c b/generic/tkScale.c index 330454e..79cfecb 100644 --- a/generic/tkScale.c +++ b/generic/tkScale.c @@ -86,7 +86,7 @@ static const Tk_OptionSpec optionSpecs[] = { DEF_SCALE_LENGTH, -1, Tk_Offset(TkScale, length), 0, 0, 0}, {TK_OPTION_STRING_TABLE, "-orient", "orient", "Orient", DEF_SCALE_ORIENT, -1, Tk_Offset(TkScale, orient), - 0, orientStrings, 0}, + TK_OPTION_ENUM_VAR, orientStrings, 0}, {TK_OPTION_RELIEF, "-relief", "relief", "Relief", DEF_SCALE_RELIEF, -1, Tk_Offset(TkScale, relief), 0, 0, 0}, {TK_OPTION_INT, "-repeatdelay", "repeatDelay", "RepeatDelay", @@ -109,7 +109,7 @@ static const Tk_OptionSpec optionSpecs[] = { 0, 0, 0}, {TK_OPTION_STRING_TABLE, "-state", "state", "State", DEF_SCALE_STATE, -1, Tk_Offset(TkScale, state), - 0, tkStateStrings, 0}, + TK_OPTION_ENUM_VAR, tkStateStrings, 0}, {TK_OPTION_STRING, "-takefocus", "takeFocus", "TakeFocus", DEF_SCALE_TAKE_FOCUS, Tk_Offset(TkScale, takeFocusPtr), -1, TK_OPTION_NULL_OK, 0, 0}, diff --git a/generic/tkText.c b/generic/tkText.c index 2e6ebbc..86ea9f4 100644 --- a/generic/tkText.c +++ b/generic/tkText.c @@ -179,7 +179,7 @@ static const Tk_OptionSpec optionSpecs[] = { {TK_OPTION_STRING_TABLE, "-insertunfocussed", "insertUnfocussed", "InsertUnfocussed", DEF_TEXT_INSERT_UNFOCUSSED, -1, Tk_Offset(TkText, insertUnfocussed), - 0, insertUnfocussedStrings, 0}, + TK_OPTION_ENUM_VAR, insertUnfocussedStrings, 0}, {TK_OPTION_PIXELS, "-insertwidth", "insertWidth", "InsertWidth", DEF_TEXT_INSERT_WIDTH, -1, Tk_Offset(TkText, insertWidth), 0, 0, 0}, @@ -238,7 +238,7 @@ static const Tk_OptionSpec optionSpecs[] = { TK_TEXT_LINE_GEOMETRY}, {TK_OPTION_STRING_TABLE, "-wrap", "wrap", "Wrap", DEF_TEXT_WRAP, -1, Tk_Offset(TkText, wrapMode), - 0, wrapStrings, TK_TEXT_LINE_GEOMETRY}, + TK_OPTION_ENUM_VAR, wrapStrings, TK_TEXT_LINE_GEOMETRY}, {TK_OPTION_STRING, "-xscrollcommand", "xScrollCommand", "ScrollCommand", DEF_TEXT_XSCROLL_COMMAND, -1, Tk_Offset(TkText, xScrollCmd), TK_OPTION_NULL_OK, 0, 0}, diff --git a/generic/tkTextTag.c b/generic/tkTextTag.c index a8b3791..16e96fc 100644 --- a/generic/tkTextTag.c +++ b/generic/tkTextTag.c @@ -100,7 +100,7 @@ static const Tk_OptionSpec tagOptionSpecs[] = { TK_OPTION_NULL_OK, 0, 0}, {TK_OPTION_STRING_TABLE, "-wrap", NULL, NULL, NULL, -1, Tk_Offset(TkTextTag, wrapMode), - TK_OPTION_NULL_OK, wrapStrings, 0}, + TK_OPTION_NULL_OK|TK_OPTION_ENUM_VAR, wrapStrings, 0}, {TK_OPTION_END, NULL, NULL, NULL, NULL, 0, 0, 0, 0, 0} }; diff --git a/generic/ttk/ttkEntry.c b/generic/ttk/ttkEntry.c index 025a0f6..6cf88c3 100644 --- a/generic/ttk/ttkEntry.c +++ b/generic/ttk/ttkEntry.c @@ -174,7 +174,7 @@ static Tk_OptionSpec EntryOptionSpecs[] = { TK_OPTION_NULL_OK,0,TEXTVAR_CHANGED}, {TK_OPTION_STRING_TABLE, "-validate", "validate", "Validate", "none", -1, Tk_Offset(Entry, entry.validate), - 0, (void *) validateStrings, 0}, + TK_OPTION_ENUM_VAR, validateStrings, 0}, {TK_OPTION_STRING, "-validatecommand", "validateCommand", "ValidateCommand", NULL, -1, Tk_Offset(Entry, entry.validateCmd), TK_OPTION_NULL_OK, 0, 0}, diff --git a/generic/ttk/ttkNotebook.c b/generic/ttk/ttkNotebook.c index 24dea7b..c16aa75 100644 --- a/generic/ttk/ttkNotebook.c +++ b/generic/ttk/ttkNotebook.c @@ -60,14 +60,14 @@ static Tk_OptionSpec TabOptionSpecs[] = { {TK_OPTION_STRING_TABLE, "-state", "", "", "normal", -1,Tk_Offset(Tab,state), - 0, (void *)TabStateStrings, 0 }, + TK_OPTION_ENUM_VAR, TabStateStrings, 0 }, {TK_OPTION_STRING, "-text", "text", "Text", "", Tk_Offset(Tab,textObj), -1, 0,0,GEOMETRY_CHANGED }, {TK_OPTION_STRING, "-image", "image", "Image", NULL/*default*/, Tk_Offset(Tab,imageObj), -1, TK_OPTION_NULL_OK,0,GEOMETRY_CHANGED }, {TK_OPTION_STRING_TABLE, "-compound", "compound", "Compound", NULL, Tk_Offset(Tab,compoundObj), -1, - TK_OPTION_NULL_OK, (void *)ttkCompoundStrings, GEOMETRY_CHANGED }, + TK_OPTION_NULL_OK, ttkCompoundStrings, GEOMETRY_CHANGED }, {TK_OPTION_INT, "-underline", "underline", "Underline", "-1", Tk_Offset(Tab,underlineObj), -1, 0,0,GEOMETRY_CHANGED }, {TK_OPTION_END, NULL, NULL, NULL, NULL, 0, 0, 0, 0, 0 } -- cgit v0.12