Mercurial > hgrepos > Python > libs > ConfigMix
comparison configmix/_speedups.c @ 637:4499e9b4855d
The ``{{::DEL::}}`` is not subject to interpolation any more.
This fixes the handling of these deletion markers when merging
configurations: sometimes they were tried to be interpolated -- and
this failed.
| author | Franz Glasner <f.glasner@feldmann-mg.com> |
|---|---|
| date | Fri, 04 Mar 2022 17:35:27 +0100 |
| parents | 33264c660fca |
| children | 999cfca55d25 |
comparison
equal
deleted
inserted
replaced
| 636:301cf2337fde | 637:4499e9b4855d |
|---|---|
| 32 PyObject *MISSING; | 32 PyObject *MISSING; |
| 33 PyObject *MARKER; | 33 PyObject *MARKER; |
| 34 PyObject *STARTTOK; | 34 PyObject *STARTTOK; |
| 35 PyObject *ENDTOK; | 35 PyObject *ENDTOK; |
| 36 PyObject *REF_NAMESPACE; | 36 PyObject *REF_NAMESPACE; |
| 37 PyObject *DEL_VALUE; | |
| 37 }; | 38 }; |
| 38 | 39 |
| 39 | 40 |
| 40 static PyObject * _fast_getvar_s(PyObject *config, PyObject *varname, PyObject *default_, struct speedups_state *sstate, int *cacheable); | 41 static PyObject * _fast_getvar_s(PyObject *config, PyObject *varname, PyObject *default_, struct speedups_state *sstate, int *cacheable); |
| 41 | 42 |
| 711 { | 712 { |
| 712 PyObject *config; | 713 PyObject *config; |
| 713 PyObject *s; | 714 PyObject *s; |
| 714 PyObject *cache; | 715 PyObject *cache; |
| 715 | 716 |
| 717 int cmp; | |
| 716 Py_ssize_t s_len; | 718 Py_ssize_t s_len; |
| 717 Py_ssize_t idx; | 719 Py_ssize_t idx; |
| 718 Py_ssize_t i, j; | 720 Py_ssize_t i, j; |
| 719 PyObject *parts = NULL; | 721 PyObject *parts = NULL; |
| 720 Py_ssize_t parts_len; | 722 Py_ssize_t parts_len; |
| 747 } | 749 } |
| 748 sstate = PyModule_GetState(self); | 750 sstate = PyModule_GetState(self); |
| 749 if (sstate == NULL) { | 751 if (sstate == NULL) { |
| 750 PyErr_SetString(PyExc_RuntimeError, "no module state available"); | 752 PyErr_SetString(PyExc_RuntimeError, "no module state available"); |
| 751 return NULL; | 753 return NULL; |
| 754 } | |
| 755 | |
| 756 cmp = PyUnicode_Compare(s, sstate->DEL_VALUE); | |
| 757 if ((cmp < 0) && PyErr_Occurred()) { | |
| 758 return NULL; | |
| 759 } | |
| 760 if (cmp == 0) { | |
| 761 return Py_NewRef(s); | |
| 752 } | 762 } |
| 753 | 763 |
| 754 idx = PyUnicode_Find(s, sstate->STARTTOK, 0, s_len, 1); | 764 idx = PyUnicode_Find(s, sstate->STARTTOK, 0, s_len, 1); |
| 755 if (idx < 0) { | 765 if (idx < 0) { |
| 756 PyErr_Clear(); | 766 PyErr_Clear(); |
| 955 { | 965 { |
| 956 PyObject *config; | 966 PyObject *config; |
| 957 PyObject *s; | 967 PyObject *s; |
| 958 PyObject *cache = NULL; | 968 PyObject *cache = NULL; |
| 959 | 969 |
| 970 int cmp; | |
| 960 Py_ssize_t s_len; | 971 Py_ssize_t s_len; |
| 961 Py_ssize_t start, rest, end; | 972 Py_ssize_t start, rest, end; |
| 962 PyObject *tmp; | 973 PyObject *tmp; |
| 963 PyObject *result = NULL; | 974 PyObject *result = NULL; |
| 964 PyObject *varname = NULL; | 975 PyObject *varname = NULL; |
| 987 | 998 |
| 988 sstate = PyModule_GetState(self); | 999 sstate = PyModule_GetState(self); |
| 989 if (sstate == NULL) { | 1000 if (sstate == NULL) { |
| 990 PyErr_SetString(PyExc_RuntimeError, "no module state available"); | 1001 PyErr_SetString(PyExc_RuntimeError, "no module state available"); |
| 991 return NULL; | 1002 return NULL; |
| 1003 } | |
| 1004 | |
| 1005 cmp = PyUnicode_Compare(s, sstate->DEL_VALUE); | |
| 1006 if ((cmp < 0) && PyErr_Occurred()) { | |
| 1007 return NULL; | |
| 1008 } | |
| 1009 if (cmp == 0) { | |
| 1010 return Py_NewRef(s); | |
| 992 } | 1011 } |
| 993 | 1012 |
| 994 start = PyUnicode_Find(s, sstate->STARTTOK, 0, s_len, 1); | 1013 start = PyUnicode_Find(s, sstate->STARTTOK, 0, s_len, 1); |
| 995 if (start == -2) { | 1014 if (start == -2) { |
| 996 return NULL; | 1015 return NULL; |
| 1651 if (sstate->REF_NAMESPACE == NULL) { | 1670 if (sstate->REF_NAMESPACE == NULL) { |
| 1652 return -1; | 1671 return -1; |
| 1653 } | 1672 } |
| 1654 PyUnicode_InternInPlace(&(sstate->REF_NAMESPACE)); | 1673 PyUnicode_InternInPlace(&(sstate->REF_NAMESPACE)); |
| 1655 | 1674 |
| 1675 sstate->DEL_VALUE = PyUnicode_FromStringAndSize("{{::DEL::}}", 3); | |
| 1676 if (sstate->DEL_VALUE == NULL) { | |
| 1677 return -1; | |
| 1678 } | |
| 1679 PyUnicode_InternInPlace(&(sstate->DEL_VALUE)); | |
| 1680 | |
| 1656 return 0; | 1681 return 0; |
| 1657 } | 1682 } |
| 1658 | 1683 |
| 1659 | 1684 |
| 1660 static | 1685 static |
| 1675 Py_VISIT(sstate->MISSING); | 1700 Py_VISIT(sstate->MISSING); |
| 1676 Py_VISIT(sstate->MARKER); | 1701 Py_VISIT(sstate->MARKER); |
| 1677 Py_VISIT(sstate->STARTTOK); | 1702 Py_VISIT(sstate->STARTTOK); |
| 1678 Py_VISIT(sstate->ENDTOK); | 1703 Py_VISIT(sstate->ENDTOK); |
| 1679 Py_VISIT(sstate->REF_NAMESPACE); | 1704 Py_VISIT(sstate->REF_NAMESPACE); |
| 1705 Py_VISIT(sstate->DEL_VALUE); | |
| 1680 } | 1706 } |
| 1681 return 0; | 1707 return 0; |
| 1682 } | 1708 } |
| 1683 | 1709 |
| 1684 | 1710 |
| 1700 Py_CLEAR(sstate->MISSING); | 1726 Py_CLEAR(sstate->MISSING); |
| 1701 Py_CLEAR(sstate->MARKER); | 1727 Py_CLEAR(sstate->MARKER); |
| 1702 Py_CLEAR(sstate->STARTTOK); | 1728 Py_CLEAR(sstate->STARTTOK); |
| 1703 Py_CLEAR(sstate->ENDTOK); | 1729 Py_CLEAR(sstate->ENDTOK); |
| 1704 Py_CLEAR(sstate->REF_NAMESPACE); | 1730 Py_CLEAR(sstate->REF_NAMESPACE); |
| 1731 Py_CLEAR(sstate->DEL_VALUE); | |
| 1705 } | 1732 } |
| 1706 return 0; | 1733 return 0; |
| 1707 } | 1734 } |
| 1708 | 1735 |
| 1709 | 1736 |
