120 lines
3.6 KiB
Diff
120 lines
3.6 KiB
Diff
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
|