Sujet : Re: vectcl and tcl9
De : wortkarg3 (at) *nospam* yahoo.com (Harald Oehlmann)
Groupes : comp.lang.tclDate : 23. Jan 2025, 15:04:49
Autres entêtes
Organisation : A noiseless patient Spider
Message-ID : <vmtia1$1h979$1@dont-email.me>
References : 1 2 3 4 5 6 7 8 9
User-Agent : Mozilla Thunderbird
Here is what Brian wrote by private E-Mail:
My fork of VecTCL using Abstract Lists is in github:
https://github.com/bgriffinfortytwo/VecTcl9It has not been updated with the current state of Tcl 9. Nor has it been updated with any potential changes in VecTCL since this original proof of concept was created. It's on my todo list. :)
-Brian
Am 22.01.2025 um 18:08 schrieb Harald Oehlmann:
Am 22.01.2025 um 16:33 schrieb Ralf Fassel:
* Ralf Fassel <ralfixx@gmx.de>
| I recompiled vectcl 0.2.1 as provided by Paul against tcl 9.0 and tcl 8.6.15.
| 'make test' in vectcl fails in many cases with tcl9, where the same
| tests succeed in 8.6.15.
>
| package require vectcl
| => 0.2.1
|
| numarray concat {{1.0 2.0} {3.0 4.0}} 5.0 0
| tcl 8 => {1.0 2.0} {3.0 4.0} {5.0 5.0}
| tcl 9 => error: expected integer but got "1.0 2.0"
>
Ok, being curious...
>
The deeper reason for those failures is that vectcl uses type info for
TclObjs, and tcl9 no longer registers type 'int' (cf.
>
tclObj.c,
const Tcl_ObjType tclIntType = {
"int", /* name */
...
};
void TclInitObjSubsystem(void)
>
8.6.15
Tcl_RegisterObjType(&tclIntType);
9.0.0
---
>
>
Now vectcl does in two places:
>
const Tcl_ObjType * tclIntType = Tcl_GetObjType("int");
>
and compares that in many places to the obj type
>
if (objPtr->typePtr == tclIntType)
>
Since 'int' is not registered in 9.0, Tcl_GetObjType will return NULL
there, thus the vectcl code treats a not-set obj-type as int, which
explains the errors.
>
Quick and dirty setting the vectcl lookup variables for
Tcl_GetObjType("int") to 0xdeadbeef if they are NULL makes all tests
succeed.
>
>
--- vectcl-0.2.1/generic/vectcl.c~ 2025-01-22 12:50:45.750839906 +0100
+++ vectcl-0.2.1/generic/vectcl.c 2025-01-22 16:15:43.747690082 +0100
@@ -2577,6 +2590,7 @@
tclListType = (Tcl_ObjType *) Tcl_GetObjType("list");
tclDoubleType = Tcl_GetObjType("double");
tclIntType = Tcl_GetObjType("int");
+ if (0 ==tclIntType) tclIntType = 0xdeadbeef;
#ifndef TCL_WIDE_INT_IS_LONG
tclWideIntType = Tcl_GetObjType("wideInt");
#endif
>
>
--- vectcl-0.2.1/generic/nacomplex.c~ 2015-07-08 22:38:34.000000000 +0200
+++ vectcl-0.2.1/generic/nacomplex.c 2025-01-22 16:18:04.682876166 +0100
@@ -67,7 +67,7 @@
/* Maybe this should go into a static const array */
const Tcl_ObjType * tclDoubleType = Tcl_GetObjType("double");
- const Tcl_ObjType * tclIntType = Tcl_GetObjType("int");
+ const Tcl_ObjType * tclIntType = Tcl_GetObjType("int") || 0xdeadbeef;
>
if (objPtr -> typePtr == tclIntType) {
int value;
>
% make test
Tests ended at Wed Jan 22 16:18:11 CET 2025
all.tcl: Total 210 Passed 210 Skipped 0 Failed 0
>
Of course this defeats the performance gains intended by the type
lookup, but since I don't know why "int" is no longer registered as type
in the tcl core, and what is to be used as substitution, I can not offer
any better fix for vectcl.
>
R'
Ralf,
great that you found out, my appreciation !
The same question was raised by TkInter and PerlTk and solved with a new function. I loosely remember, that Tcl_GetNumber should now be used for this purpose:
https://core.tcl-lang.org/tips/doc/trunk/tip/638.md
This routine returns the integer type. I suppose, a test fir int is a result of "TCL_NUMBER_INT".
Nevertheless, we still need Brian, as this "conversion" part was replaced by the new abstract layer.
Thank you all,
Harald