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