Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Use ListRepPtr(.) and other cleanup. |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | core-8-5-branch |
Files: | files | file ages | folders |
SHA1: |
3dba2563a1ce58177201b16ae2144a5a |
User & Date: | dgp 2011-04-18 21:24:55 |
Context
2011-04-19
| ||
16:38 | Reduce internals access in the implementation of [<foo>::pkgconfig list]. check-in: 52560d396e user: dgp tags: core-8-5-branch | |
2011-04-18
| ||
21:42 | Use ListRepPtr(.) and other cleanup. check-in: e7e05e37cc user: dgp tags: trunk | |
21:24 | Use ListRepPtr(.) and other cleanup. check-in: 3dba2563a1 user: dgp tags: core-8-5-branch | |
18:31 | Define and use macros that test whether a Tcl list value is canonical. check-in: 13ac6c8c7b user: dgp tags: core-8-5-branch | |
Changes
Changes to ChangeLog.
1 2 3 4 5 6 7 8 | 2011-04-18 Don Porter <[email protected]> * generic/tclInt.h: Define and use macros that test whether * generic/tclBasic.c: a Tcl list value is canonical. * generic/tclUtil.c: 2011-04-18 Jan Nijtmans <[email protected]> | > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 | 2011-04-18 Don Porter <[email protected]> * generic/tclCmdIL.c: Use ListRepPtr(.) and other cleanup. * generic/tclConfig.c: * generic/tclListObj.c: * generic/tclInt.h: Define and use macros that test whether * generic/tclBasic.c: a Tcl list value is canonical. * generic/tclUtil.c: 2011-04-18 Jan Nijtmans <[email protected]> |
︙ | ︙ |
Changes to generic/tclCmdIL.c.
︙ | ︙ | |||
1536 1537 1538 1539 1540 1541 1542 | InfoLoadedCmd( ClientData dummy, /* Not used. */ Tcl_Interp *interp, /* Current interpreter. */ int objc, /* Number of arguments. */ Tcl_Obj *CONST objv[]) /* Argument objects. */ { char *interpName; | < | < | 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 | InfoLoadedCmd( ClientData dummy, /* Not used. */ Tcl_Interp *interp, /* Current interpreter. */ int objc, /* Number of arguments. */ Tcl_Obj *CONST objv[]) /* Argument objects. */ { char *interpName; if ((objc != 1) && (objc != 2)) { Tcl_WrongNumArgs(interp, 1, objv, "?interp?"); return TCL_ERROR; } if (objc == 1) { /* Get loaded pkgs in all interpreters. */ interpName = NULL; } else { /* Get pkgs just in specified interp. */ interpName = TclGetString(objv[1]); } return TclGetLoadedPackages(interp, interpName); } /* *---------------------------------------------------------------------- * * InfoNameOfExecutableCmd -- * |
︙ | ︙ | |||
2399 2400 2401 2402 2403 2404 2405 | Tcl_LrepeatObjCmd( ClientData dummy, /* Not used. */ Tcl_Interp *interp, /* Current interpreter. */ register int objc, /* Number of arguments. */ register Tcl_Obj *CONST objv[]) /* The argument objects. */ { | | | < | 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 | Tcl_LrepeatObjCmd( ClientData dummy, /* Not used. */ Tcl_Interp *interp, /* Current interpreter. */ register int objc, /* Number of arguments. */ register Tcl_Obj *CONST objv[]) /* The argument objects. */ { int elementCount, i, totalElems; Tcl_Obj *listPtr, **dataArray; List *listRepPtr; /* * Check arguments for legality: * lrepeat posInt value ?value ...? */ if (objc < 3) { Tcl_WrongNumArgs(interp, 1, objv, "positiveCount value ?value ...?"); return TCL_ERROR; } if (TCL_ERROR == TclGetIntFromObj(interp, objv[1], &elementCount)) { return TCL_ERROR; } if (elementCount < 1) { Tcl_AppendResult(interp, "must have a count of at least 1", NULL); return TCL_ERROR; } |
︙ | ︙ | |||
2450 2451 2452 2453 2454 2455 2456 | /* * Get an empty list object that is allocated large enough to hold each * init value elementCount times. */ listPtr = Tcl_NewListObj(totalElems, NULL); | | | 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 | /* * Get an empty list object that is allocated large enough to hold each * init value elementCount times. */ listPtr = Tcl_NewListObj(totalElems, NULL); listRepPtr = ListRepPtr(listPtr); listRepPtr->elemCount = elementCount*objc; dataArray = &listRepPtr->elements; /* * Set the elements. Note that we handle the common degenerate case of a * single value being repeated separately to permit the compiler as much * room as possible to optimize a loop that might be run a very large |
︙ | ︙ | |||
2635 2636 2637 2638 2639 2640 2641 | */ if (!elemc) { Tcl_SetObjResult(interp, objv[1]); return TCL_OK; } | | > | < | | | < < < < < < < < < | 2632 2633 2634 2635 2636 2637 2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651 2652 2653 2654 2655 2656 2657 2658 2659 2660 2661 2662 | */ if (!elemc) { Tcl_SetObjResult(interp, objv[1]); return TCL_OK; } if (Tcl_IsShared(objv[1]) || (ListRepPtr(objv[1])->refCount > 1)) { /* Bug 1675044 */ Tcl_Obj *resultObj, **dataArray; List *listRepPtr; resultObj = Tcl_NewListObj(elemc, NULL); listRepPtr = ListRepPtr(resultObj); listRepPtr->elemCount = elemc; dataArray = &listRepPtr->elements; for (i=0,j=elemc-1 ; i<elemc ; i++,j--) { dataArray[j] = elemv[i]; Tcl_IncrRefCount(elemv[i]); } Tcl_SetObjResult(interp, resultObj); } else { /* * Not shared, so swap "in place". This relies on Tcl_LOGE above * returning a pointer to the live array of Tcl_Obj values. */ for (i=0,j=elemc-1 ; i<j ; i++,j--) { |
︙ | ︙ | |||
3759 3760 3761 3762 3763 3764 3765 | if (sortInfo.resultCode == TCL_OK) { List *listRepPtr; Tcl_Obj **newArray, *objPtr; int i; resultPtr = Tcl_NewListObj(sortInfo.numElements, NULL); | | | 3747 3748 3749 3750 3751 3752 3753 3754 3755 3756 3757 3758 3759 3760 3761 | if (sortInfo.resultCode == TCL_OK) { List *listRepPtr; Tcl_Obj **newArray, *objPtr; int i; resultPtr = Tcl_NewListObj(sortInfo.numElements, NULL); listRepPtr = ListRepPtr(resultPtr); newArray = &listRepPtr->elements; if (indices) { for (i = 0; elementPtr != NULL ; elementPtr = elementPtr->nextPtr){ objPtr = Tcl_NewIntObj(PTR2INT(elementPtr->objPtr)); newArray[i++] = objPtr; Tcl_IncrRefCount(objPtr); } |
︙ | ︙ |
Changes to generic/tclConfig.c.
︙ | ︙ | |||
269 270 271 272 273 274 275 | if (!listPtr) { Tcl_SetResult(interp, "insufficient memory to create list", TCL_STATIC); return TCL_ERROR; } if (n) { | | < | 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 | if (!listPtr) { Tcl_SetResult(interp, "insufficient memory to create list", TCL_STATIC); return TCL_ERROR; } if (n) { List *listRepPtr = ListRepPtr(listPtr); Tcl_DictSearch s; Tcl_Obj *key, **vals; int done, i = 0; listRepPtr->elemCount = n; vals = &listRepPtr->elements; |
︙ | ︙ |
Changes to generic/tclListObj.c.
︙ | ︙ | |||
443 444 445 446 447 448 449 | } result = SetListFromAny(interp, listPtr); if (result != TCL_OK) { return result; } } | | | 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 | } result = SetListFromAny(interp, listPtr); if (result != TCL_OK) { return result; } } listRepPtr = ListRepPtr(listPtr); *objcPtr = listRepPtr->elemCount; *objvPtr = &listRepPtr->elements; return TCL_OK; } /* *---------------------------------------------------------------------- |
︙ | ︙ | |||
561 562 563 564 565 566 567 | result = SetListFromAny(interp, listPtr); if (result != TCL_OK) { return result; } } | | | 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 | result = SetListFromAny(interp, listPtr); if (result != TCL_OK) { return result; } } listRepPtr = ListRepPtr(listPtr); numElems = listRepPtr->elemCount; numRequired = numElems + 1 ; /* * If there is no room in the current array of element pointers, allocate * a new, larger array and copy the pointers to it. If the List struct is * shared, allocate a new one. |
︙ | ︙ | |||
672 673 674 675 676 677 678 | result = SetListFromAny(interp, listPtr); if (result != TCL_OK) { return result; } } | | | 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 | result = SetListFromAny(interp, listPtr); if (result != TCL_OK) { return result; } } listRepPtr = ListRepPtr(listPtr); if ((index < 0) || (index >= listRepPtr->elemCount)) { *objPtrPtr = NULL; } else { *objPtrPtr = (&listRepPtr->elements)[index]; } return TCL_OK; |
︙ | ︙ | |||
727 728 729 730 731 732 733 | result = SetListFromAny(interp, listPtr); if (result != TCL_OK) { return result; } } | | | 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 | result = SetListFromAny(interp, listPtr); if (result != TCL_OK) { return result; } } listRepPtr = ListRepPtr(listPtr); *intPtr = listRepPtr->elemCount; return TCL_OK; } /* *---------------------------------------------------------------------- * |
︙ | ︙ | |||
814 815 816 817 818 819 820 | * Note that when count == 0 and objc == 0, this routine is logically a * no-op, removing and adding no elements to the list. However, by flowing * through this routine anyway, we get the important side effect that the * resulting listPtr is a list in canoncial form. This is important. * Resist any temptation to optimize this case. */ | | | 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 | * Note that when count == 0 and objc == 0, this routine is logically a * no-op, removing and adding no elements to the list. However, by flowing * through this routine anyway, we get the important side effect that the * resulting listPtr is a list in canoncial form. This is important. * Resist any temptation to optimize this case. */ listRepPtr = ListRepPtr(listPtr); elemPtrs = &listRepPtr->elements; numElems = listRepPtr->elemCount; if (first < 0) { first = 0; } if (first >= numElems) { |
︙ | ︙ | |||
1498 1499 1500 1501 1502 1503 1504 | } result = SetListFromAny(interp, listPtr); if (result != TCL_OK) { return result; } } | | | 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 | } result = SetListFromAny(interp, listPtr); if (result != TCL_OK) { return result; } } listRepPtr = ListRepPtr(listPtr); elemCount = listRepPtr->elemCount; elemPtrs = &listRepPtr->elements; /* * Ensure that the index is in bounds. */ |
︙ | ︙ | |||
1583 1584 1585 1586 1587 1588 1589 | *---------------------------------------------------------------------- */ static void FreeListInternalRep( Tcl_Obj *listPtr) /* List object with internal rep to free. */ { | | | 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 | *---------------------------------------------------------------------- */ static void FreeListInternalRep( Tcl_Obj *listPtr) /* List object with internal rep to free. */ { register List *listRepPtr = ListRepPtr(listPtr); register Tcl_Obj **elemPtrs = &listRepPtr->elements; register Tcl_Obj *objPtr; int numElems = listRepPtr->elemCount; int i; if (--listRepPtr->refCount <= 0) { for (i = 0; i < numElems; i++) { |
︙ | ︙ | |||
1623 1624 1625 1626 1627 1628 1629 | */ static void DupListInternalRep( Tcl_Obj *srcPtr, /* Object with internal rep to copy. */ Tcl_Obj *copyPtr) /* Object with internal rep to set. */ { | | | 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 | */ static void DupListInternalRep( Tcl_Obj *srcPtr, /* Object with internal rep to copy. */ Tcl_Obj *copyPtr) /* Object with internal rep to set. */ { List *listRepPtr = ListRepPtr(srcPtr); listRepPtr->refCount++; copyPtr->internalRep.twoPtrValue.ptr1 = (void *) listRepPtr; copyPtr->internalRep.twoPtrValue.ptr2 = NULL; copyPtr->typePtr = &tclListType; } |
︙ | ︙ | |||
1839 1840 1841 1842 1843 1844 1845 | static void UpdateStringOfList( Tcl_Obj *listPtr) /* List object with string rep to update. */ { # define LOCAL_SIZE 20 int localFlags[LOCAL_SIZE], *flagPtr; | | | 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 | static void UpdateStringOfList( Tcl_Obj *listPtr) /* List object with string rep to update. */ { # define LOCAL_SIZE 20 int localFlags[LOCAL_SIZE], *flagPtr; List *listRepPtr = ListRepPtr(listPtr); int numElems = listRepPtr->elemCount; register int i; char *elem, *dst; int length; Tcl_Obj **elemPtrs; /* |
︙ | ︙ |