Tcl Source Code

View Ticket
Login
Ticket UUID: 580433
Title: CONST prototypes in 8.4.
Type: Bug Version: obsolete: 8.4b2
Submitter: ghowlett Created on: 2002-07-12 05:55:35
Subsystem: None Assigned To: dgp
Priority: 5 Medium Severity:
Status: Closed Last Modified: 2002-08-05 10:28:33
Resolution: Fixed Closed By: dgp
    Closed on: 2002-08-05 03:28:33
Description:
There are several prototypes that formerly in 8.3 returned 
char * values.  One example is Tcl_SetVar2.  

They now return CONST char * values.   This should be 
CONST84 char * so that extension writers can define
USE_NON_CONST.  

--gah
User Comments: dgp added on 2002-08-05 10:28:33:
Logged In: YES 
user_id=80530

fixed by acceptance of Patch 585105.

dgp added on 2002-07-24 10:51:38:
Logged In: YES 
user_id=80530

see also Patch 585105.

dgp added on 2002-07-16 08:06:01:

File Added - 27096: tkconst.patch

Logged In: YES 
user_id=80530


Here is a companion patch for Tk.

dgp added on 2002-07-16 06:42:00:

File Added - 27089: const.patch

dgp added on 2002-07-16 06:41:59:
Logged In: YES 
user_id=80530


Here's a patch that addresses the issue.

Apply the patch, `make genstubs`, and install.
The resulting headers will be configurable 
like so:

#define USE_NON_CONST

will disable all new CONSTs that cause any
kind of source incompatibility with Tcl 8.3.
This is the "#define & go" option.

#define USE_COMPAT_CONST

this does what USE_NON_CONST
used to do -- disables only those new
CONSTs that would otherwise force
one to support only 8.4 and up.

With neither of those defined, the
header will supply the documented
Tcl 8.4 interfaces.

The patch also CONSTifies a few more
APIs -- notably the Tcl_CmdProc typedef.
Now that USE_NON_CONST offers a way
to completely avoid the changes, there's no
reason to delay the really tough one.

Note that Tk, like other extensions,
will need modifications to use the
features of this patch.

Please try and comment.

ghowlett added on 2002-07-13 02:30:22:
Logged In: YES 
user_id=137748

Unfortunately it's counterproductive. 
It causes extensions to drop support of 8.4 (or more 
accurately, people won't take the time to make them
compile with 8.4).  It's too bad that source code 
compatibility isn't as valued as binary compatibilty.  
That's what CONST84 is supposed to prevent.

--gah

dgp added on 2002-07-13 02:15:42:
Logged In: YES 
user_id=80530


That's just not what USE_NON_CONST / CONST84 is for.

CONST84 exists to disable only those new CONSTs that
would otherwise force extensions to drop (compiling) 
support for pre-8.4 Tcl, because compilers do not know
how to convert a (char **) to a (const char **).
USE_NON_CONST allows for support for both 8.3
and 8.4 headers until a package naturally wants to
require 8.4 because it is using 8.4 features.

Tcl routines that now return (CONST char *) where
they previously returned (char *) do not need such a
mechanism, because compilers do know how to
convert (char *) values into (const char *) values.
This means that extensions can update their code
to compile with both 8.3 and 8.4 headers, and
that's what they're expected to do to begin
supporting Tcl 8.4.

Tcl 8.4 does not offer a "#define and go" migration
option for dealing with the CONST-ification changes.
At a minimum, extensions must deal with the source
incompatibility approved by TIP 27.

It's possible that such a "#define and go" option could be
provided, but it would need to be something new, not a
dual meaning imposed on CONST84.  I'd rather not
go that way, but it is possible.

ghowlett added on 2002-07-13 01:30:44:
Logged In: YES 
user_id=137748

Adding const in the caller's code cacades changes
throughout. Either one
wants to use const everywhere or they don't.  There's no
middle ground.

This is a nuisance for everyone trying to port old code to
8.4.  What's
the issue for not using CONST84 instead?  

--gah

dgp added on 2002-07-13 01:18:21:
Logged In: YES 
user_id=80530


The CONST84 macro is tied only to those
changes that cannot be reconciled.  The
return of a CONST char * where a char *
was returned before can be reconciled by
adding "const" in the caller, so that the
modified code compiles with both 8.3
and 8.4 headers.

This type of source incompatibility
was approved in TIP 27.

Attachments: