Path: ...!weretis.net!feeder9.news.weretis.net!news.quux.org!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!eternal-september.org!.POSTED!not-for-mail From: Harald Oehlmann Newsgroups: comp.lang.tcl Subject: Re: vectcl and tcl9 Date: Wed, 22 Jan 2025 18:08:08 +0100 Organization: A noiseless patient Spider Lines: 100 Message-ID: References: <2af45bfa-e1ae-4a45-90c3-83af0678f820@clevelandgolf.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Injection-Date: Wed, 22 Jan 2025 18:08:09 +0100 (CET) Injection-Info: dont-email.me; posting-host="daf1f9fb24e711baf92504fb85805fb3"; logging-data="1171351"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX1/Qy9yDBCPtx4mJmkfAZQo1" User-Agent: Mozilla Thunderbird Cancel-Lock: sha1:PtfPOZURGA2DtnWfRHBVbA3ThS0= In-Reply-To: Content-Language: en-GB Bytes: 4638 Am 22.01.2025 um 16:33 schrieb Ralf Fassel: > * Ralf Fassel > | 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