From 13d9114a51d1c63fb18d21d2abe4cade17b13612 Mon Sep 17 00:00:00 2001 From: "jan.nijtmans" Date: Sat, 31 Aug 2024 23:58:22 +0000 Subject: [PATCH] Experiment: Break Tk_GetColor/Tk_Get3DBorder's Tk_Uid contract in the worst possible way: Allocate a new object before every call, and dispose it immediately afterwards. This shows that the Tk_Uid argument doesn't really need to be a Tk_Uid --- generic/tk3d.c | 21 +++++++++++++++++++-- generic/tkColor.c | 19 +++++++++++++++++-- 2 files changed, 36 insertions(+), 4 deletions(-) diff --git a/generic/tk3d.c b/generic/tk3d.c index 8082f0c92..32717fba0 100644 --- a/generic/tk3d.c +++ b/generic/tk3d.c @@ -179,8 +179,8 @@ Tk_Alloc3DBorderFromObj( *-------------------------------------------------------------- */ -Tk_3DBorder -Tk_Get3DBorder( +static Tk_3DBorder +Tk_Get3DBorder_( Tcl_Interp *interp, /* Place to store an error message. */ Tk_Window tkwin, /* Token for window in which border will be * drawn. */ @@ -254,6 +254,23 @@ Tk_Get3DBorder( borderPtr->bgGC = Tk_GetGC(tkwin, GCForeground, &gcValues); return (Tk_3DBorder) borderPtr; } + +Tk_3DBorder +Tk_Get3DBorder( + Tcl_Interp *interp, /* Place to store an error message. */ + Tk_Window tkwin, /* Token for window in which border will be + * drawn. */ + Tk_Uid colorName) /* String giving name of color for window + * background. */ +{ + Tk_3DBorder x; + Tcl_Obj *obj = Tcl_NewStringObj(colorName, -1); + + x = Tk_Get3DBorder_(interp, tkwin, Tcl_GetString(obj)); + Tcl_DecrRefCount(obj); + return x; + +} /* *-------------------------------------------------------------- diff --git a/generic/tkColor.c b/generic/tkColor.c index baff5e794..1793b859b 100644 --- a/generic/tkColor.c +++ b/generic/tkColor.c @@ -185,8 +185,8 @@ Tk_AllocColorFromObj( *---------------------------------------------------------------------- */ -XColor * -Tk_GetColor( +static XColor * +Tk_GetColor_( Tcl_Interp *interp, /* Place to leave error message if color can't * be found. */ Tk_Window tkwin, /* Window in which color will be used. */ @@ -265,6 +265,21 @@ Tk_GetColor( return &tkColPtr->color; } +XColor * +Tk_GetColor( + Tcl_Interp *interp, /* Place to leave error message if color can't + * be found. */ + Tk_Window tkwin, /* Window in which color will be used. */ + Tk_Uid name) /* Name of color to be allocated (in form + * suitable for passing to XParseColor). */ +{ + XColor *x; + Tcl_Obj *obj = Tcl_NewStringObj(name, -1); + + x = Tk_GetColor_(interp, tkwin, Tcl_GetString(obj)); + Tcl_DecrRefCount(obj); + return x; +} /* *---------------------------------------------------------------------- *