Hello community, here is the log from the commit of package ki18n for openSUSE:Factory checked in at 2014-02-27 00:01:13 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/ki18n (Old) and /work/SRC/openSUSE:Factory/.ki18n.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "ki18n" Changes: -------- --- /work/SRC/openSUSE:Factory/ki18n/ki18n.changes 2014-02-24 11:01:09.000000000 +0100 +++ /work/SRC/openSUSE:Factory/.ki18n.new/ki18n.changes 2014-02-27 00:01:14.000000000 +0100 @@ -1,0 +2,7 @@ +Sun Feb 23 22:43:10 UTC 2014 - hrvoje.sen...@gmail.com + +- Added patches from upstream + * 0008-Cleanup-after-QtScript-port.patch + * 0009-Do-not-leak-script-interfaces-and-their-script-engin.patch + +------------------------------------------------------------------- New: ---- 0008-Cleanup-after-QtScript-port.patch 0009-Do-not-leak-script-interfaces-and-their-script-engin.patch ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ ki18n.spec ++++++ --- /var/tmp/diff_new_pack.1gxaTH/_old 2014-02-27 00:01:15.000000000 +0100 +++ /var/tmp/diff_new_pack.1gxaTH/_new 2014-02-27 00:01:15.000000000 +0100 @@ -41,6 +41,10 @@ Patch2: 0006-Separate-ktranscript-plugin-test-into-its-own-autote.patch # PATCH-FIX-UPSTREAM 0007-Ported-KTranscript-script-engine-use-from-KJS-to-QtS.patch Patch3: 0007-Ported-KTranscript-script-engine-use-from-KJS-to-QtS.patch +# PATCH-FIX-UPSTREAM 0008-Cleanup-after-QtScript-port.patch +Patch4: 0008-Cleanup-after-QtScript-port.patch +# PATCH-FIX-UPSTREAM 0009-Do-not-leak-script-interfaces-and-their-script-engin.patch +Patch5: 0009-Do-not-leak-script-interfaces-and-their-script-engin.patch BuildRoot: %{_tmppath}/%{name}-%{version}-build %description @@ -78,6 +82,8 @@ %patch1 -p1 %patch2 -p1 %patch3 -p1 +%patch4 -p1 +%patch5 -p1 %build %cmake_kf5 -d build ++++++ 0008-Cleanup-after-QtScript-port.patch ++++++ >From 463f76bc765e9fc9279a19ab29da9e1024f927f9 Mon Sep 17 00:00:00 2001 From: Kevin Krammer <kram...@kde.org> Date: Sun, 23 Feb 2014 20:51:37 +0100 Subject: [PATCH 8/9] Cleanup after QtScript port Update framework tier. Remove unused enum. Remove no longer applicable search for KJS. Consistent block braces for if statements. REVIEW: 115979 --- KF5I18nConfig.cmake.in | 2 - ki18n.yaml | 2 +- src/ktranscript.cpp | 105 +++++++++++++++++++++---------------------------- 3 files changed, 46 insertions(+), 63 deletions(-) diff --git a/KF5I18nConfig.cmake.in b/KF5I18nConfig.cmake.in index 7225bf5..64dc500 100644 --- a/KF5I18nConfig.cmake.in +++ b/KF5I18nConfig.cmake.in @@ -2,8 +2,6 @@ set(KI18N_MODULE_DIR "${PACKAGE_PREFIX_DIR}/@CMAKECONFIG_INSTALL_DIR@") -find_dependency(KF5JS "@KF5_VERSION@") - include("${CMAKE_CURRENT_LIST_DIR}/KF5I18nTargets.cmake") include("${CMAKE_CURRENT_LIST_DIR}/KF5I18NMacros.cmake") diff --git a/ki18n.yaml b/ki18n.yaml index 9b601d5..c54f87b 100644 --- a/ki18n.yaml +++ b/ki18n.yaml @@ -1 +1 @@ -tier: 2 +tier: 1 diff --git a/src/ktranscript.cpp b/src/ktranscript.cpp index 4cdae75..1ce0d1a 100644 --- a/src/ktranscript.cpp +++ b/src/ktranscript.cpp @@ -122,35 +122,6 @@ public: Q_INVOKABLE QScriptValue getConfBool(const QScriptValue &key, const QScriptValue &dval = QScriptValue::NullValue); Q_INVOKABLE QScriptValue getConfNumber(const QScriptValue &key, const QScriptValue &dval = QScriptValue::NullValue); - enum { - Load, - Setcall, - Hascall, - Acall, - SetcallForall, - Fallback, - Nsubs, - Subs, - Vals, - Msgctxt, - Dynctxt, - Msgid, - Msgkey, - Msgstrf, - Dbgputs, - Warnputs, - LocaleCountry, - NormKey, - LoadProps, - GetProp, - SetProp, - ToUpperFirst, - ToLowerFirst, - GetConfString, - GetConfBool, - GetConfNumber - }; - // Helper methods to interface functions. QScriptValue load(const QScriptValueList &fnames); QString loadProps_text(const QString &fpath); @@ -354,8 +325,8 @@ QScriptValue variantToJsValue(const QVariant &val) QVariant::Type vtype = val.type(); if (vtype == QVariant::String) { return QScriptValue(val.toString()); - } else if (vtype == QVariant::Double \ - || vtype == QVariant::Int || vtype == QVariant::UInt \ + } else if (vtype == QVariant::Double + || vtype == QVariant::Int || vtype == QVariant::UInt || vtype == QVariant::LongLong || vtype == QVariant::ULongLong) { return QScriptValue(val.toDouble()); } else { @@ -429,9 +400,9 @@ TsConfig readConfig(const QString &fname) // throw or log error, depending on context availability static QScriptValue throwError(QScriptContext *context, QScriptContext::Error errorCode, const QString &message) { - if (context) + if (context) { return context->throwError(errorCode, message); - + } qCritical() << "Script error" << errorCode << ":" << message; return QScriptValue::UndefinedValue; @@ -609,32 +580,32 @@ QString KTranscriptImp::eval(const QList<QVariant> &argv, val = func.call(gobj, arglist); } - if (fallback) + if (fallback) { // Fallback to ordinary translation requested. - { + // Possibly clear exception state. if (engine->hasUncaughtException()) { engine->clearExceptions(); } return QString(); - } else if (!engine->hasUncaughtException()) + } else if (!engine->hasUncaughtException()) { // Evaluation successful. - { - if (val.isString()) + + if (val.isString()) { // Good to go. - { + return val.toString(); - } else + } else { // Accept only strings. - { + QString strval = val.toString(); error = QString::fromLatin1("Non-string return value: %1").arg(strval); return QString(); } - } else + } else { // Exception raised. - { + error = expt2str(engine); engine->clearExceptions(); @@ -733,7 +704,7 @@ void KTranscriptImp::setupInterpreter(const QString &lang) } Scriptface::Scriptface(QScriptEngine *scriptEngine_, const TsConfigGroup &config_, QObject *parent) - : QObject(parent), scriptEngine(scriptEngine_), fallbackRequest(NULL), config(config_) + : QObject(parent), scriptEngine(scriptEngine_), fallbackRequest(0), config(config_) {} Scriptface::~Scriptface() @@ -765,15 +736,18 @@ QScriptValue Scriptface::load() QScriptValue Scriptface::setcall(const QScriptValue &name, const QScriptValue &func, const QScriptValue &fval) { - if (!name.isString()) + if (!name.isString()) { return throwError(context(), QScriptContext::TypeError, SPREF"setcall: expected string as first argument"); - if (!func.isFunction()) + } + if (!func.isFunction()) { return throwError(context(), QScriptContext::TypeError, SPREF"setcall: expected function as second argument"); - if (!(fval.isObject() || fval.isNull())) + } + if (!(fval.isObject() || fval.isNull())) { return throwError(context(), QScriptContext::TypeError, SPREF"setcall: expected object or null as third argument"); + } QString qname = name.toString(); funcs[qname] = func; @@ -792,9 +766,10 @@ QScriptValue Scriptface::setcall(const QScriptValue &name, const QScriptValue &f QScriptValue Scriptface::hascall(const QScriptValue &name) { - if (!name.isString()) + if (!name.isString()) { return throwError(context(), QScriptContext::TypeError, SPREF"hascall: expected string as first argument"); + } QString qname = name.toString(); return QScriptValue(funcs.contains(qname)); @@ -844,15 +819,18 @@ QScriptValue Scriptface::acall() QScriptValue Scriptface::setcallForall(const QScriptValue &name, const QScriptValue &func, const QScriptValue &fval) { - if (!name.isString()) + if (!name.isString()) { return throwError(context(), QScriptContext::TypeError, SPREF"setcallForall: expected string as first argument"); - if (!func.isFunction()) + } + if (!func.isFunction()) { return throwError(context(), QScriptContext::TypeError, SPREF"setcallForall: expected function as second argument"); - if (!(fval.isObject() || fval.isNull())) + } + if (!(fval.isObject() || fval.isNull())) { return throwError(context(), QScriptContext::TypeError, SPREF"setcallForall: expected object or null as third argument"); + } QString qname = name.toString(); funcs[qname] = func; @@ -874,7 +852,7 @@ QScriptValue Scriptface::setcallForall(const QScriptValue &name, const QScriptVa QScriptValue Scriptface::fallback() { - if (fallbackRequest != NULL) { + if (fallbackRequest) { *fallbackRequest = true; } return QScriptValue::UndefinedValue; @@ -887,28 +865,32 @@ QScriptValue Scriptface::nsubs() QScriptValue Scriptface::subs(const QScriptValue &index) { - if (!index.isNumber()) + if (!index.isNumber()) { return throwError(context(), QScriptContext::TypeError, SPREF"subs: expected number as first argument"); + } int i = qRound(index.toNumber()); - if (i < 0 || i >= subList->size()) + if (i < 0 || i >= subList->size()) { return throwError(context(), QScriptContext::RangeError, SPREF"subs: index out of range"); + } return QScriptValue(subList->at(i)); } QScriptValue Scriptface::vals(const QScriptValue &index) { - if (!index.isNumber()) + if (!index.isNumber()) { return throwError(context(), QScriptContext::TypeError, SPREF"vals: expected number as first argument"); + } int i = qRound(index.toNumber()); - if (i < 0 || i >= valList->size()) + if (i < 0 || i >= valList->size()) { return throwError(context(), QScriptContext::RangeError, SPREF"vals: index out of range"); + } return variantToJsValue(valList->at(i)); } @@ -920,9 +902,10 @@ QScriptValue Scriptface::msgctxt() QScriptValue Scriptface::dynctxt(const QScriptValue &key) { - if (!key.isString()) + if (!key.isString()) { return throwError(context(), QScriptContext::TypeError, SPREF"dynctxt: expected string as first argument"); + } QString qkey = key.toString(); if (dyncontext->contains(qkey)) { @@ -948,9 +931,10 @@ QScriptValue Scriptface::msgstrf() QScriptValue Scriptface::dbgputs(const QScriptValue &str) { - if (!str.isString()) + if (!str.isString()) { return throwError(context(), QScriptContext::TypeError, SPREF"dbgputs: expected string as first argument"); + } QString qstr = str.toString(); @@ -961,9 +945,10 @@ QScriptValue Scriptface::dbgputs(const QScriptValue &str) QScriptValue Scriptface::warnputs(const QScriptValue &str) { - if (!str.isString()) + if (!str.isString()) { return throwError(context(), QScriptContext::TypeError, SPREF"warnputs: expected string as first argument"); + } QString qstr = str.toString(); @@ -1680,7 +1665,7 @@ QHash<QByteArray, QByteArray> Scriptface::resolveUnparsedProps(const QByteArray QFile *file = ref.first; quint64 offset = ref.second; QHash<QByteArray, QByteArray> props; - if (file != NULL && file->seek(offset)) { + if (file && file->seek(offset)) { QByteArray fstr = file->read(4 + 4); qlonglong pos = 0; quint32 numpkeys = bin_read_int(fstr, fstr.size(), pos); -- 1.8.5.2 ++++++ 0009-Do-not-leak-script-interfaces-and-their-script-engin.patch ++++++ >From b0a60d0feb2dcac7af5f921be830bc4d9b9d3d18 Mon Sep 17 00:00:00 2001 From: Kevin Krammer <kram...@kde.org> Date: Sun, 23 Feb 2014 22:44:56 +0100 Subject: [PATCH 9/9] Do not leak script interfaces and their script engines Create the script engine as a QObject child of the interface and delete all interfaces in KTranscriptImp's destructor. REVIEW: 115983 --- src/ktranscript.cpp | 42 ++++++++++++++++++------------------------ 1 file changed, 18 insertions(+), 24 deletions(-) diff --git a/src/ktranscript.cpp b/src/ktranscript.cpp index 1ce0d1a..44c8b63 100644 --- a/src/ktranscript.cpp +++ b/src/ktranscript.cpp @@ -89,7 +89,7 @@ class Scriptface : public QObject, public QScriptable { Q_OBJECT public: - explicit Scriptface(QScriptEngine *scriptEngine_, const TsConfigGroup &config, QObject *parent = 0); + explicit Scriptface(const TsConfigGroup &config, QObject *parent = 0); ~Scriptface(); // Interface functions. @@ -131,9 +131,8 @@ public: void put(const QString &propertyName, const QScriptValue &value); - // Link to its interpreter. - // FIXME: Probably accessible without the explicit link. - QScriptEngine *scriptEngine; + // Link to its script engine + QScriptEngine *const scriptEngine; // Current message data. const QString *msgcontext; @@ -475,10 +474,7 @@ KTranscriptImp::KTranscriptImp() KTranscriptImp::~KTranscriptImp() { - // FIXME: vallgrind shows an afwul lot of "invalid read" in WTF:: stuff - // when deref is called... Are we leaking somewhere? - //foreach (Scriptface *sface, m_sface.values()) - // sface->jsi->deref(); + qDeleteAll(m_sface); } QString KTranscriptImp::eval(const QList<QVariant> &argv, @@ -680,33 +676,31 @@ void KTranscriptImp::loadModules(const QList<QStringList> &mods, #define SFNAME "Ts" void KTranscriptImp::setupInterpreter(const QString &lang) { - // Create new interpreter. - QScriptEngine *engine = new QScriptEngine; - - // Add scripting interface into the interpreter. + // Add scripting interface + // Creates its own script engine and registers with it // NOTE: Config may not contain an entry for the language, in which case // it is automatically constructed as an empty hash. This is intended. - Scriptface *sface = new Scriptface(engine, config[lang], engine); + Scriptface *sface = new Scriptface(config[lang]); + + // Store scriptface + m_sface[lang] = sface; + + //dbgout("=====> Created interpreter for '%1'", lang); +} +Scriptface::Scriptface(const TsConfigGroup &config_, QObject *parent) + : QObject(parent), scriptEngine(new QScriptEngine(this)), fallbackRequest(0), config(config_) +{ QScriptEngine::QObjectWrapOptions wrapOptions; wrapOptions |= QScriptEngine::ExcludeSuperClassContents; wrapOptions |= QScriptEngine::ExcludeDeleteLater; wrapOptions |= QScriptEngine::ExcludeChildObjects; wrapOptions |= QScriptEngine::ExcludeSlots; - QScriptValue object = engine->newQObject(sface, QScriptEngine::QtOwnership, wrapOptions); - engine->globalObject().setProperty(SFNAME, object); - - // Store scriptface - m_sface[lang] = sface; - - //dbgout("=====> Created interpreter for '%1'", lang); + QScriptValue object = scriptEngine->newQObject(this, QScriptEngine::QtOwnership, wrapOptions); + scriptEngine->globalObject().setProperty(SFNAME, object); } -Scriptface::Scriptface(QScriptEngine *scriptEngine_, const TsConfigGroup &config_, QObject *parent) - : QObject(parent), scriptEngine(scriptEngine_), fallbackRequest(0), config(config_) -{} - Scriptface::~Scriptface() { qDeleteAll(loadedPmapHandles); -- 1.8.5.2 -- To unsubscribe, e-mail: opensuse-commit+unsubscr...@opensuse.org For additional commands, e-mail: opensuse-commit+h...@opensuse.org