Fix return type for C linkage.
authorErik Verbruggen <erik.verbruggen@me.com>
Wed, 24 Apr 2013 12:28:52 +0000 (14:28 +0200)
committerLars Knoll <lars.knoll@digia.com>
Wed, 24 Apr 2013 15:28:07 +0000 (17:28 +0200)
warning:
      '__qmljs_numberToString' has C-linkage specified, but returns user-defined type 'QString' which is incompatible with C [-Wreturn-type-c-linkage]
QString __qmljs_numberToString(double num, int radix = 10);
        ^

Change-Id: I1537b0e5f6c61915f4bd3c4d4607846b74e7a6d9
Reviewed-by: Lars Knoll <lars.knoll@digia.com>
src/qml/qml/v4vm/qv4runtime.cpp
src/qml/qml/v4vm/qv4runtime_p.h
src/qml/qml/v8/qjsvalue.cpp

index 528ac4e..6d0a3e2 100644 (file)
@@ -99,22 +99,27 @@ void Exception::partiallyUnwindContext(ExecutionContext *catchingContext)
 
 extern "C" {
 
-QString __qmljs_numberToString(double num, int radix)
+void __qmljs_numberToString(QString *result, double num, int radix)
 {
+    Q_ASSERT(result);
+
     if (std::isnan(num)) {
-        return QStringLiteral("NaN");
+        *result = QStringLiteral("NaN");
+        return;
     } else if (qIsInf(num)) {
-        return QLatin1String(num < 0 ? "-Infinity" : "Infinity");
+        *result = QLatin1String(num < 0 ? "-Infinity" : "Infinity");
+        return;
     }
 
     if (radix == 10) {
         char str[100];
         double_conversion::StringBuilder builder(str, sizeof(str));
         double_conversion::DoubleToStringConverter::EcmaScriptConverter().ToShortest(num, &builder);
-        return QString::fromLatin1(builder.Finalize());
+        *result = QString::fromLatin1(builder.Finalize());
+        return;
     }
 
-    QString str;
+    result->clear();
     bool negative = false;
 
     if (num < 0) {
@@ -128,25 +133,23 @@ QString __qmljs_numberToString(double num, int radix)
     do {
         char c = (char)::fmod(num, radix);
         c = (c < 10) ? (c + '0') : (c - 10 + 'a');
-        str.prepend(QLatin1Char(c));
+        result->prepend(QLatin1Char(c));
         num = ::floor(num / radix);
     } while (num != 0);
 
     if (frac != 0) {
-        str.append(QLatin1Char('.'));
+        result->append(QLatin1Char('.'));
         do {
             frac = frac * radix;
             char c = (char)::floor(frac);
             c = (c < 10) ? (c + '0') : (c - 10 + 'a');
-            str.append(QLatin1Char(c));
+            result->append(QLatin1Char(c));
             frac = frac - ::floor(frac);
         } while (frac != 0);
     }
 
     if (negative)
-        str.prepend(QLatin1Char('-'));
-
-    return str;
+        result->prepend(QLatin1Char('-'));
 }
 
 void __qmljs_init_closure(ExecutionContext *ctx, Value *result, Function *clos)
@@ -457,7 +460,9 @@ double __qmljs_string_to_number(const QString &string)
 
 Value __qmljs_string_from_number(ExecutionContext *ctx, double number)
 {
-    String *string = ctx->engine->newString(__qmljs_numberToString(number, 10));
+    QString qstr;
+    __qmljs_numberToString(&qstr, number, 10);
+    String *string = ctx->engine->newString(qstr);
     return Value::fromString(string);
 }
 
index e9510d3..649178a 100644 (file)
@@ -186,7 +186,7 @@ QV4::Bool __qmljs_to_boolean(const QV4::Value &value);
 double __qmljs_to_number(const QV4::Value &value);
 QV4::Value __qmljs_to_string(const QV4::Value &value, QV4::ExecutionContext *ctx);
 Q_QML_EXPORT QV4::String *__qmljs_convert_to_string(QV4::ExecutionContext *ctx, const QV4::Value &value);
-QString __qmljs_numberToString(double num, int radix = 10);
+void __qmljs_numberToString(QString *result, double num, int radix = 10);
 QV4::Value __qmljs_to_object(QV4::ExecutionContext *ctx, const QV4::Value &value);
 QV4::Object *__qmljs_convert_to_object(QV4::ExecutionContext *ctx, const QV4::Value &value);
 
index c446740..ae91822 100644 (file)
@@ -347,8 +347,11 @@ QString QJSValue::toString() const
         else
             return QStringLiteral("false");
     }
-    else if (d->value.isNumber())
-        return __qmljs_numberToString(d->value.asDouble());
+    else if (d->value.isNumber()) {
+        QString result;
+        __qmljs_numberToString(&result, d->value.asDouble());
+        return result;
+    }
 
     QV4::ExecutionContext *ctx = d->engine ? d->engine->current : 0;
     try {