Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | avoid mem-leak (methodVariables is object-hash, so key refCount is incremented automaticaly); grave speedup of method variables (share same object "fullNamePtr" between imvPtr and ivPtr); remove obsolete or unneeded code. |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | sebres-on-dmnd-resolver-perf-branch |
Files: | files | file ages | folders |
SHA3-256: |
4e0bd29adf7f970866d8ffba31fa4b31 |
User & Date: | sebres 2019-11-04 21:20:15.690 |
Context
2019-11-04
| ||
21:24 | integrate bug fix of [777ae99cfb], fixes mem-leaks, certain optimizations check-in: 8b790617eb user: sebres tags: trunk | |
21:20 | avoid mem-leak (methodVariables is object-hash, so key refCount is incremented automaticaly); grave speedup of method variables (share same object "fullNamePtr" between imvPtr and ivPtr); remove obsolete or unneeded code. Closed-Leaf check-in: 4e0bd29adf user: sebres tags: sebres-on-dmnd-resolver-perf-branch | |
20:28 | fixes [777ae99cfb]: previous var-lookup in class body (in ::itcl::parser) could obtain inherited common vars, be sure it does not exists after new uninitialized common creation; more test cases covering corner cases; remove unneeded calls of Itcl_BuildVirtualTables, since resolveVars is build on demand (moved to ItclResolveVarEntry). check-in: 6c5eb55b81 user: sebres tags: sebres-on-dmnd-resolver-perf-branch | |
Changes
Changes to generic/itclClass.c.
︙ | ︙ | |||
456 457 458 459 460 461 462 | */ if (iclsPtr->flags & ITCL_TYPE) { namePtr = Tcl_NewStringObj("type", -1); (void) Itcl_CreateVariable(interp, iclsPtr, namePtr, NULL, NULL, &ivPtr); ivPtr->protection = ITCL_PROTECTED; /* always "protected" */ ivPtr->flags |= ITCL_TYPE_VAR; /* mark as "type" variable */ | < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 | */ if (iclsPtr->flags & ITCL_TYPE) { namePtr = Tcl_NewStringObj("type", -1); (void) Itcl_CreateVariable(interp, iclsPtr, namePtr, NULL, NULL, &ivPtr); ivPtr->protection = ITCL_PROTECTED; /* always "protected" */ ivPtr->flags |= ITCL_TYPE_VAR; /* mark as "type" variable */ } if (iclsPtr->flags & (ITCL_ECLASS)) { namePtr = Tcl_NewStringObj("win", -1); (void) Itcl_CreateVariable(interp, iclsPtr, namePtr, NULL, NULL, &ivPtr); ivPtr->protection = ITCL_PROTECTED; /* always "protected" */ ivPtr->flags |= ITCL_WIN_VAR; /* mark as "win" variable */ } if (iclsPtr->flags & (ITCL_TYPE|ITCL_WIDGET|ITCL_WIDGETADAPTOR)) { namePtr = Tcl_NewStringObj("self", -1); (void) Itcl_CreateVariable(interp, iclsPtr, namePtr, NULL, NULL, &ivPtr); ivPtr->protection = ITCL_PROTECTED; /* always "protected" */ ivPtr->flags |= ITCL_SELF_VAR; /* mark as "self" variable */ namePtr = Tcl_NewStringObj("selfns", -1); (void) Itcl_CreateVariable(interp, iclsPtr, namePtr, NULL, NULL, &ivPtr); ivPtr->protection = ITCL_PROTECTED; /* always "protected" */ ivPtr->flags |= ITCL_SELFNS_VAR; /* mark as "selfns" variable */ namePtr = Tcl_NewStringObj("win", -1); (void) Itcl_CreateVariable(interp, iclsPtr, namePtr, NULL, NULL, &ivPtr); ivPtr->protection = ITCL_PROTECTED; /* always "protected" */ ivPtr->flags |= ITCL_WIN_VAR; /* mark as "win" variable */ } namePtr = Tcl_NewStringObj("this", -1); (void) Itcl_CreateVariable(interp, iclsPtr, namePtr, NULL, NULL, &ivPtr); ivPtr->protection = ITCL_PROTECTED; /* always "protected" */ ivPtr->flags |= ITCL_THIS_VAR; /* mark as "this" variable */ if (infoPtr->currClassFlags & (ITCL_ECLASS|ITCL_TYPE|ITCL_WIDGETADAPTOR|ITCL_WIDGET)) { /* * Add the built-in "itcl_options" variable to the list of * data members. */ namePtr = Tcl_NewStringObj("itcl_options", -1); (void) Itcl_CreateVariable(interp, iclsPtr, namePtr, NULL, NULL, &ivPtr); ivPtr->protection = ITCL_PROTECTED; /* always "protected" */ ivPtr->flags |= ITCL_OPTIONS_VAR; /* mark as "itcl_options" * variable */ } if (infoPtr->currClassFlags & ITCL_ECLASS) { /* * Add the built-in "itcl_option_components" variable to the list of * data members. */ namePtr = Tcl_NewStringObj("itcl_option_components", -1); (void) Itcl_CreateVariable(interp, iclsPtr, namePtr, NULL, NULL, &ivPtr); ivPtr->protection = ITCL_PROTECTED; /* always "protected" */ ivPtr->flags |= ITCL_OPTION_COMP_VAR; /* mark as "itcl_option_components" * variable */ } if (infoPtr->currClassFlags & (ITCL_WIDGET|ITCL_WIDGETADAPTOR)) { /* * Add the built-in "thiswin" variable to the list of data members. */ namePtr = Tcl_NewStringObj("thiswin", -1); (void) Itcl_CreateVariable(interp, iclsPtr, namePtr, NULL, NULL, &ivPtr); ivPtr->protection = ITCL_PROTECTED; /* always "protected" */ ivPtr->flags |= ITCL_THIS_VAR; /* mark as "thiswin" variable */ } if (infoPtr->currClassFlags & (ITCL_WIDGET|ITCL_WIDGETADAPTOR)) { /* create the itcl_hull component */ ItclComponent *icPtr; namePtr = Tcl_NewStringObj("itcl_hull", 9); /* itcl_hull must not be an ITCL_COMMON!! */ if (ItclCreateComponent(interp, iclsPtr, namePtr, 0, &icPtr) != |
︙ | ︙ | |||
2135 2136 2137 2138 2139 2140 2141 | Itcl_PreserveData(ioptPtr); Itcl_EventuallyFree(ioptPtr, (Tcl_FreeProc *) ItclDeleteOption); return TCL_OK; } /* * ------------------------------------------------------------------------ | | | < | | | | | < | | | < < < > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 | Itcl_PreserveData(ioptPtr); Itcl_EventuallyFree(ioptPtr, (Tcl_FreeProc *) ItclDeleteOption); return TCL_OK; } /* * ------------------------------------------------------------------------ * ItclCreateMethodVariable(), Itcl_CreateMethodVariable() * * Creates a new class methdovariable definition. If this is a public * methodvariable, * * Returns TCL_ERROR along with an error message in the specified * interpreter if anything goes wrong. Otherwise, this returns * TCL_OK and a pointer to the new option definition in "imvPtr". * ------------------------------------------------------------------------ */ int ItclCreateMethodVariable( Tcl_Interp *interp, /* interpreter managing this transaction */ ItclVariable *ivPtr, /* variable reference (from Itcl_CreateVariable) */ Tcl_Obj* defaultPtr, /* initial value */ Tcl_Obj* callbackPtr, /* code invoked when variable is set */ ItclMethodVariable** imvPtrPtr) /* returns: new methdovariable definition */ { int isNew; ItclMethodVariable *imvPtr; Tcl_HashEntry *hPtr; /* * Add this methodvariable to the options table for the class. * Make sure that the methodvariable name does not already exist. */ hPtr = Tcl_CreateHashEntry(&ivPtr->iclsPtr->methodVariables, (char *)ivPtr->namePtr, &isNew); if (!isNew) { Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), "methdovariable name \"", Tcl_GetString(ivPtr->namePtr), "\" already defined in class \"", Tcl_GetString (ivPtr->iclsPtr->fullNamePtr), "\"", NULL); return TCL_ERROR; } /* * If everything looks good, create the option definition. */ imvPtr = (ItclMethodVariable*)ckalloc(sizeof(ItclMethodVariable)); memset(imvPtr, 0, sizeof(ItclMethodVariable)); imvPtr->iclsPtr = ivPtr->iclsPtr; imvPtr->protection = Itcl_Protection(interp, 0); imvPtr->namePtr = ivPtr->namePtr; Tcl_IncrRefCount(imvPtr->namePtr); imvPtr->fullNamePtr = ivPtr->fullNamePtr; Tcl_IncrRefCount(imvPtr->fullNamePtr); imvPtr->defaultValuePtr = defaultPtr; if (defaultPtr != NULL) { Tcl_IncrRefCount(imvPtr->defaultValuePtr); } imvPtr->callbackPtr = callbackPtr; if (callbackPtr != NULL) { Tcl_IncrRefCount(imvPtr->callbackPtr); } if (imvPtr->protection == ITCL_DEFAULT_PROTECT) { imvPtr->protection = ITCL_PROTECTED; } Tcl_SetHashValue(hPtr, imvPtr); *imvPtrPtr = imvPtr; return TCL_OK; } /* * TODO: remove this if unused (seems to be internal API only), * now superseded by ItclCreateMethodVariable. */ int Itcl_CreateMethodVariable( Tcl_Interp *interp, /* interpreter managing this transaction */ ItclClass* iclsPtr, /* class containing this variable */ Tcl_Obj* namePtr, /* variable name */ Tcl_Obj* defaultPtr, /* initial value */ Tcl_Obj* callbackPtr, /* code invoked when variable is set */ ItclMethodVariable** imvPtrPtr) /* returns: new methdovariable definition */ { ItclVariable *ivPtr; Tcl_HashEntry *hPtr; /* * Search variable reference (ivPtr). */ hPtr = Tcl_FindHashEntry(&iclsPtr->variables, (char *)namePtr); if (!hPtr || !(ivPtr = (ItclVariable*)Tcl_GetHashValue(hPtr))) { Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), "variable name \"", Tcl_GetString(namePtr), "\" is not declared in class \"", Tcl_GetString (iclsPtr->fullNamePtr), "\"", NULL); return TCL_ERROR; } /* * Create method variable. */ return ItclCreateMethodVariable(interp, ivPtr, defaultPtr, callbackPtr, imvPtrPtr); } /* * ------------------------------------------------------------------------ * Itcl_GetCommonVar() * * Returns the current value for a common class variable. The member |
︙ | ︙ |
Changes to generic/itclInt.h.
︙ | ︙ | |||
712 713 714 715 716 717 718 719 720 721 722 723 724 725 | MODULE_SCOPE int Itcl_ClassCompiledVarResolver2(Tcl_Interp *interp, const char* name, int length, Tcl_Namespace *nsPtr, struct Tcl_ResolvedVarInfo **rPtr); MODULE_SCOPE int ItclSetParserResolver(Tcl_Namespace *nsPtr); MODULE_SCOPE void ItclProcErrorProc(Tcl_Interp *interp, Tcl_Obj *procNameObj); MODULE_SCOPE int Itcl_CreateOption (Tcl_Interp *interp, ItclClass *iclsPtr, ItclOption *ioptPtr); MODULE_SCOPE int Itcl_CreateMethodVariable (Tcl_Interp *interp, ItclClass *iclsPtr, Tcl_Obj *name, Tcl_Obj *defaultPtr, Tcl_Obj *callbackPtr, ItclMethodVariable **imvPtr); MODULE_SCOPE int DelegationInstall(Tcl_Interp *interp, ItclObject *ioPtr, ItclClass *iclsPtr); MODULE_SCOPE ItclClass *ItclNamespace2Class(Tcl_Namespace *nsPtr); MODULE_SCOPE const char* ItclGetCommonInstanceVar(Tcl_Interp *interp, | > > > | 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 | MODULE_SCOPE int Itcl_ClassCompiledVarResolver2(Tcl_Interp *interp, const char* name, int length, Tcl_Namespace *nsPtr, struct Tcl_ResolvedVarInfo **rPtr); MODULE_SCOPE int ItclSetParserResolver(Tcl_Namespace *nsPtr); MODULE_SCOPE void ItclProcErrorProc(Tcl_Interp *interp, Tcl_Obj *procNameObj); MODULE_SCOPE int Itcl_CreateOption (Tcl_Interp *interp, ItclClass *iclsPtr, ItclOption *ioptPtr); MODULE_SCOPE int ItclCreateMethodVariable(Tcl_Interp *interp, ItclVariable *ivPtr, Tcl_Obj* defaultPtr, Tcl_Obj* callbackPtr, ItclMethodVariable** imvPtrPtr); MODULE_SCOPE int Itcl_CreateMethodVariable (Tcl_Interp *interp, ItclClass *iclsPtr, Tcl_Obj *name, Tcl_Obj *defaultPtr, Tcl_Obj *callbackPtr, ItclMethodVariable **imvPtr); MODULE_SCOPE int DelegationInstall(Tcl_Interp *interp, ItclObject *ioPtr, ItclClass *iclsPtr); MODULE_SCOPE ItclClass *ItclNamespace2Class(Tcl_Namespace *nsPtr); MODULE_SCOPE const char* ItclGetCommonInstanceVar(Tcl_Interp *interp, |
︙ | ︙ |
Changes to generic/itclParse.c.
︙ | ︙ | |||
4219 4220 4221 4222 4223 4224 4225 | } if (Itcl_CreateVariable(interp, iclsPtr, namePtr, Tcl_GetString(defaultPtr), NULL, &ivPtr) != TCL_OK) { return TCL_ERROR; } iclsPtr->numVariables++; | | | 4219 4220 4221 4222 4223 4224 4225 4226 4227 4228 4229 4230 4231 4232 4233 | } if (Itcl_CreateVariable(interp, iclsPtr, namePtr, Tcl_GetString(defaultPtr), NULL, &ivPtr) != TCL_OK) { return TCL_ERROR; } iclsPtr->numVariables++; result = ItclCreateMethodVariable(interp, ivPtr, defaultPtr, callbackPtr, &imvPtr); if (result != TCL_OK) { return result; } objPtr = Tcl_NewStringObj("@itcl-builtin-setget ", -1); Tcl_AppendToObj(objPtr, Tcl_GetString(namePtr), -1); Tcl_AppendToObj(objPtr, " ", 1); |
︙ | ︙ |