diff --git a/3rdparty/pythonqt/src/PythonQtImporter.cpp b/3rdparty/pythonqt/src/PythonQtImporter.cpp index 2046ff9..81e26fd 100644 --- a/3rdparty/pythonqt/src/PythonQtImporter.cpp +++ b/3rdparty/pythonqt/src/PythonQtImporter.cpp @@ -445,90 +445,41 @@ PythonQtImport::getLong(unsigned char *buf) return x; } -FILE * -open_exclusive(const QString& filename) -{ -#if defined(O_EXCL)&&defined(O_CREAT)&&defined(O_WRONLY)&&defined(O_TRUNC) - /* Use O_EXCL to avoid a race condition when another process tries to - write the same file. When that happens, our open() call fails, - which is just fine (since it's only a cache). - XXX If the file exists and is writable but the directory is not - writable, the file will never be written. Oh well. - */ - QFile::remove(filename); - - int fd; - int flags = O_EXCL|O_CREAT|O_WRONLY|O_TRUNC; -#ifdef O_BINARY - flags |= O_BINARY; /* necessary for Windows */ -#endif -#ifdef WIN32 - fd = _wopen(filename.ucs2(), flags, 0666); -#else - fd = open(filename.local8Bit(), flags, 0666); -#endif - if (fd < 0) - return NULL; - return fdopen(fd, "wb"); -#else - /* Best we can do -- on Windows this can't happen anyway */ - return fopen(filename.toLocal8Bit().constData(), "wb"); -#endif -} - - void PythonQtImport::writeCompiledModule(PyCodeObject *co, const QString& filename, long mtime) { - FILE *fp; // we do not want to write Qt resources to disk, do we? if (filename.startsWith(":")) { return; } - fp = open_exclusive(filename); - if (fp == NULL) { - if (Py_VerboseFlag) - PySys_WriteStderr( - "# can't create %s\n", filename.toLatin1().constData()); - return; - } -#if PY_VERSION_HEX < 0x02040000 - PyMarshal_WriteLongToFile(PyImport_GetMagicNumber(), fp); -#else - PyMarshal_WriteLongToFile(PyImport_GetMagicNumber(), fp, Py_MARSHAL_VERSION); -#endif - /* First write a 0 for mtime */ -#if PY_VERSION_HEX < 0x02040000 - PyMarshal_WriteLongToFile(0L, fp); -#else - PyMarshal_WriteLongToFile(0L, fp, Py_MARSHAL_VERSION); -#endif + #if PY_VERSION_HEX < 0x02040000 - PyMarshal_WriteObjectToFile((PyObject *)co, fp); + PyObject* data = PyMarshal_WriteObjectToString((PyObject*) co); #else - PyMarshal_WriteObjectToFile((PyObject *)co, fp, Py_MARSHAL_VERSION); + PyObject* data = PyMarshal_WriteObjectToString((PyObject*) co, Py_MARSHAL_VERSION); #endif - if (ferror(fp)) { - if (Py_VerboseFlag) - PySys_WriteStderr("# can't write %s\n", filename.toLatin1().constData()); - /* Don't keep partial file */ - fclose(fp); - QFile::remove(filename); + + if (!data) { return; } - /* Now write the true mtime */ - fseek(fp, 4L, 0); -#if PY_VERSION_HEX < 0x02040000 - PyMarshal_WriteLongToFile(mtime, fp); -#else - PyMarshal_WriteLongToFile(mtime, fp, Py_MARSHAL_VERSION); -#endif - fflush(fp); - fclose(fp); - if (Py_VerboseFlag) - PySys_WriteStderr("# wrote %s\n", filename.toLatin1().constData()); -//#ifdef macintosh -// PyMac_setfiletype(cpathname, 'Pyth', 'PYC '); -//#endif + + QFile file(filename); + if (!file.open(QIODevice::WriteOnly)) { + Py_DECREF(data); + return; + } + + char* buffer = NULL; + Py_ssize_t length = 0; + PyString_AsStringAndSize(data, &buffer, &length); + + const quint32 magic_number = PyImport_GetMagicNumber(); + const quint32 mtime_32 = mtime; + + file.write(reinterpret_cast<const char*>(&magic_number), sizeof(magic_number)); + file.write(reinterpret_cast<const char*>(&mtime_32), sizeof(mtime_32)); + file.write(buffer, length); + + Py_DECREF(data); } /* Given the contents of a .py[co] file in a buffer, unmarshal the data