Index: PC/_winreg.c =================================================================== --- PC/_winreg.c (revision 56404) +++ PC/_winreg.c (working copy) @@ -404,7 +404,7 @@ PyHKEYObject *pyhkey = (PyHKEYObject *)ob; char resBuf[160]; wsprintf(resBuf, "", pyhkey->hkey); - return PyString_FromString(resBuf); + return PyUnicode_FromString(resBuf); } static int @@ -444,6 +444,7 @@ PyHKEY_binaryFailureFunc, /* nb_and */ PyHKEY_binaryFailureFunc, /* nb_xor */ PyHKEY_binaryFailureFunc, /* nb_or */ + NULL, /* nb_coerce */ PyHKEY_intFunc, /* nb_int */ PyHKEY_unaryFailureFunc, /* nb_long */ PyHKEY_unaryFailureFunc, /* nb_float */ @@ -729,11 +730,10 @@ return FALSE; need_decref = 1; } - if (!PyString_Check(value)) + if (!PyBytes_Check(value)) return FALSE; *retDataSize = 1 + strlen( - PyString_AS_STRING( - (PyStringObject *)value)); + PyBytes_AS_STRING(value)); } *retDataBuf = (BYTE *)PyMem_NEW(DWORD, *retDataSize); if (*retDataBuf==NULL){ @@ -744,8 +744,7 @@ strcpy((char *)*retDataBuf, ""); else strcpy((char *)*retDataBuf, - PyString_AS_STRING( - (PyStringObject *)value)); + PyBytes_AS_STRING(value)); if (need_decref) Py_DECREF(value); break; @@ -770,7 +769,7 @@ PyObject *t; t = PyList_GET_ITEM( (PyListObject *)value,j); - if (PyString_Check(t)) { + if (PyBytes_Check(t)) { obs[j] = t; Py_INCREF(t); } else if (PyUnicode_Check(t)) { @@ -783,8 +782,7 @@ } else goto reg_multi_fail; size += 1 + strlen( - PyString_AS_STRING( - (PyStringObject *)obs[j])); + PyBytes_AS_STRING(obs[j])); } *retDataSize = size + 1; @@ -800,12 +798,9 @@ { PyObject *t; t = obs[j]; - strcpy(P, - PyString_AS_STRING( - (PyStringObject *)t)); + strcpy(P, PyBytes_AS_STRING(t)); P += 1 + strlen( - PyString_AS_STRING( - (PyStringObject *)t)); + PyBytes_AS_STRING(t)); Py_DECREF(obs[j]); } /* And doubly-terminate the list... */ @@ -922,7 +917,7 @@ obData = Py_None; } else - obData = Py_BuildValue("s#", + obData = Py_BuildValue("y#", (char *)retDataBuf, retDataSize); break; @@ -1047,7 +1042,7 @@ if (rc != ERROR_SUCCESS) return PyErr_SetFromWindowsErrWithFunction(rc, "RegEnumKeyEx"); - retStr = PyString_FromStringAndSize(tmpbuf, len); + retStr = PyUnicode_FromStringAndSize(tmpbuf, len); return retStr; /* can be NULL */ } @@ -1109,7 +1104,7 @@ retVal = NULL; goto fail; } - retVal = Py_BuildValue("sOi", retValueBuf, obData, typ); + retVal = Py_BuildValue("UOi", retValueBuf, obData, typ); Py_DECREF(obData); fail: PyMem_Free(retValueBuf); @@ -1232,17 +1227,19 @@ != ERROR_SUCCESS) return PyErr_SetFromWindowsErrWithFunction(rc, "RegQueryValue"); - retStr = PyString_FromStringAndSize(NULL, bufSize); - if (retStr == NULL) - return NULL; - retBuf = PyString_AS_STRING(retStr); + retBuf = (char *)PyMem_Malloc(bufSize); + if (retBuf == NULL) + return PyErr_NoMemory(); + if ((rc = RegQueryValue(hKey, subKey, retBuf, &bufSize)) != ERROR_SUCCESS) { - Py_DECREF(retStr); + PyMem_Free(retBuf); return PyErr_SetFromWindowsErrWithFunction(rc, "RegQueryValue"); } - _PyString_Resize(&retStr, strlen(retBuf)); + + retStr = PyUnicode_DecodeMBCS(retBuf, strlen(retBuf), NULL); + PyMem_Free(retBuf); return retStr; } Index: Lib/test/test_winreg.py =================================================================== --- Lib/test/test_winreg.py (revision 56404) +++ Lib/test/test_winreg.py (working copy) @@ -4,7 +4,7 @@ from _winreg import * import os, sys -from test.test_support import verify, have_unicode +from test.test_support import verify test_key_name = "SOFTWARE\\Python Registry Test Key - Delete Me" @@ -13,17 +13,10 @@ ("String Val", "A string value", REG_SZ), ("StringExpand", "The path is %path%", REG_EXPAND_SZ), ("Multi-string", ["Lots", "of", "string", "values"], REG_MULTI_SZ), - ("Raw Data", ("binary"+chr(0)+"data"), REG_BINARY), + ("Raw Data", bytes("binary"+chr(0)+"data"), REG_BINARY), ("Big String", "x"*(2**14-1), REG_SZ), - ("Big Binary", "x"*(2**14), REG_BINARY), + ("Big Binary", b"x"*(2**14), REG_BINARY), ] -if have_unicode: - test_data+=[ - (str("Unicode Val"), str("A Unicode value"), REG_SZ,), - ("UnicodeExpand", str("The path is %path%"), REG_EXPAND_SZ), - ("Multi-unicode", [str("Lots"), str("of"), str("unicode"), str("values")], REG_MULTI_SZ), - ("Multi-mixed", [str("Unicode"), str("and"), "string", "values"],REG_MULTI_SZ), - ] def WriteTestData(root_key): # Set the default value for this key. @@ -65,7 +58,7 @@ def ReadTestData(root_key): # Check we can get default value for this key. val = QueryValue(root_key, test_key_name) - verify(val=="Default value", "Registry didn't give back the correct value") + verify(type(val) is str and val=="Default value", "Registry didn't give back the correct value") key = OpenKey(root_key, test_key_name) # Read the sub-keys