Changeset 54579 in webkit


Ignore:
Timestamp:
Feb 9, 2010 6:36:38 PM (14 years ago)
Author:
eric@webkit.org
Message:

2010-02-09 Jedrzej Nowacki <jedrzej.nowacki@nokia.com>

Reviewed by Simon Hausmann.

Fixes for QScriptValue::toNumber().

Fix ECMA compliance in QScriptValue for values unbound
to a QScriptEngine.

[Qt] QScriptValue::toNumber() is broken
https://bugs.webkit.org/show_bug.cgi?id=34592

  • qt/api/qscriptvalue_p.h: (QScriptValuePrivate::toNumber):
  • qt/tests/qscriptvalue/tst_qscriptvalue.h:
  • qt/tests/qscriptvalue/tst_qscriptvalue_generated.cpp: (tst_QScriptValue::toNumber_initData): (tst_QScriptValue::toNumber_makeData): (tst_QScriptValue::toNumber_test):
Location:
trunk/JavaScriptCore
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/ChangeLog

    r54577 r54579  
     12010-02-09  Jedrzej Nowacki  <jedrzej.nowacki@nokia.com>
     2
     3        Reviewed by Simon Hausmann.
     4
     5        Fixes for QScriptValue::toNumber().
     6
     7        Fix ECMA compliance in QScriptValue for values unbound
     8        to a QScriptEngine.
     9
     10        [Qt] QScriptValue::toNumber() is broken
     11        https://bugs.webkit.org/show_bug.cgi?id=34592
     12
     13        * qt/api/qscriptvalue_p.h:
     14        (QScriptValuePrivate::toNumber):
     15        * qt/tests/qscriptvalue/tst_qscriptvalue.h:
     16        * qt/tests/qscriptvalue/tst_qscriptvalue_generated.cpp:
     17        (tst_QScriptValue::toNumber_initData):
     18        (tst_QScriptValue::toNumber_makeData):
     19        (tst_QScriptValue::toNumber_test):
     20
    1212010-02-09  Jedrzej Nowacki  <jedrzej.nowacki@nokia.com>
    222
  • trunk/JavaScriptCore/qt/api/qscriptvalue_p.h

    r54577 r54579  
    2525#include "qscriptvalue.h"
    2626#include <JavaScriptCore/JavaScript.h>
     27#include <QtCore/qmath.h>
     28#include <QtCore/qnumeric.h>
    2729#include <QtCore/qshareddata.h>
    2830#include <QtCore/qvarlengtharray.h>
     
    469471qsreal QScriptValuePrivate::toNumber() const
    470472{
    471     // TODO Check it.
    472473    switch (m_state) {
    473474    case JSValue:
     
    476477        return JSValueToNumber(context(), value(), /* exception */ 0);
    477478    case CNumber:
     479        return m_number;
    478480    case CBool:
    479         return m_number;
     481        return m_number ? 1 : 0;
    480482    case Invalid:
     483        return 0;
    481484    case CSpecial:
    482         return false;
     485        return m_number == QScriptValue::NullValue ? 0 : qQNaN();
    483486    case CString:
    484         return m_string.isEmpty();
     487        bool ok;
     488        qsreal result = m_string.toDouble(&ok);
     489        if (ok)
     490            return result;
     491        result = m_string.toInt(&ok, 0); // Try other bases.
     492        if (ok)
     493            return result;
     494        if (m_string == "Infinity" || m_string == "-Infinity")
     495            return qInf();
     496        return m_string.length() ? qQNaN() : 0;
    485497    }
    486498
  • trunk/JavaScriptCore/qt/tests/qscriptvalue/tst_qscriptvalue.h

    r54577 r54579  
    7777    void isValid();
    7878
     79    void toNumber_data();
     80    void toNumber();
     81
    7982private:
    8083    typedef void (tst_QScriptValue::*InitDataFunction)();
     
    126129    void isValid_test(const char* expr, const QScriptValue& value);
    127130
     131    void toNumber_initData();
     132    void toNumber_makeData(const char*);
     133    void toNumber_test(const char*, const QScriptValue&);
     134
    128135private:
    129136    QScriptEngine* engine;
  • trunk/JavaScriptCore/qt/tests/qscriptvalue/tst_qscriptvalue_generated.cpp

    r54577 r54579  
    557557DEFINE_TEST_FUNCTION(isObject)
    558558
     559void tst_QScriptValue::toNumber_initData()
     560{
     561    QTest::addColumn<qsreal>("expected");
     562    initScriptValues();
     563}
     564
     565void tst_QScriptValue::toNumber_makeData(const char* expr)
     566{
     567    static QHash<QString, qsreal> toNumber;
     568    if (toNumber.isEmpty()) {
     569        toNumber.insert("QScriptValue()", 0);
     570        toNumber.insert("QScriptValue(QScriptValue::UndefinedValue)", qQNaN());
     571        toNumber.insert("QScriptValue(QScriptValue::NullValue)", 0);
     572        toNumber.insert("QScriptValue(true)", 1);
     573        toNumber.insert("QScriptValue(false)", 0);
     574        toNumber.insert("QScriptValue(int(122))", 122);
     575        toNumber.insert("QScriptValue(uint(124))", 124);
     576        toNumber.insert("QScriptValue(0)", 0);
     577        toNumber.insert("QScriptValue(0.0)", 0);
     578        toNumber.insert("QScriptValue(123.0)", 123);
     579        toNumber.insert("QScriptValue(6.37e-8)", 6.369999999999999e-08);
     580        toNumber.insert("QScriptValue(-6.37e-8)", -6.369999999999999e-08);
     581        toNumber.insert("QScriptValue(0x43211234)", 1126240820);
     582        toNumber.insert("QScriptValue(0x10000)", 65536);
     583        toNumber.insert("QScriptValue(0x10001)", 65537);
     584        toNumber.insert("QScriptValue(qSNaN())", qQNaN());
     585        toNumber.insert("QScriptValue(qQNaN())", qQNaN());
     586        toNumber.insert("QScriptValue(qInf())", qInf());
     587        toNumber.insert("QScriptValue(-qInf())", qInf());
     588        toNumber.insert("QScriptValue(\"NaN\")", qQNaN());
     589        toNumber.insert("QScriptValue(\"Infinity\")", qInf());
     590        toNumber.insert("QScriptValue(\"-Infinity\")", qInf());
     591        toNumber.insert("QScriptValue(\"ciao\")", qQNaN());
     592        toNumber.insert("QScriptValue(QString::fromLatin1(\"ciao\"))", qQNaN());
     593        toNumber.insert("QScriptValue(QString(\"\"))", 0);
     594        toNumber.insert("QScriptValue(QString())", 0);
     595        toNumber.insert("QScriptValue(QString(\"0\"))", 0);
     596        toNumber.insert("QScriptValue(QString(\"123\"))", 123);
     597        toNumber.insert("QScriptValue(QString(\"12.4\"))", 12.4);
     598        toNumber.insert("QScriptValue(0, QScriptValue::UndefinedValue)", qQNaN());
     599        toNumber.insert("QScriptValue(0, QScriptValue::NullValue)", 0);
     600        toNumber.insert("QScriptValue(0, true)", 1);
     601        toNumber.insert("QScriptValue(0, false)", 0);
     602        toNumber.insert("QScriptValue(0, int(122))", 122);
     603        toNumber.insert("QScriptValue(0, uint(124))", 124);
     604        toNumber.insert("QScriptValue(0, 0)", 0);
     605        toNumber.insert("QScriptValue(0, 0.0)", 0);
     606        toNumber.insert("QScriptValue(0, 123.0)", 123);
     607        toNumber.insert("QScriptValue(0, 6.37e-8)", 6.369999999999999e-08);
     608        toNumber.insert("QScriptValue(0, -6.37e-8)", -6.369999999999999e-08);
     609        toNumber.insert("QScriptValue(0, 0x43211234)", 1126240820);
     610        toNumber.insert("QScriptValue(0, 0x10000)", 65536);
     611        toNumber.insert("QScriptValue(0, 0x10001)", 65537);
     612        toNumber.insert("QScriptValue(0, qSNaN())", qQNaN());
     613        toNumber.insert("QScriptValue(0, qQNaN())", qQNaN());
     614        toNumber.insert("QScriptValue(0, qInf())", qInf());
     615        toNumber.insert("QScriptValue(0, -qInf())", qInf());
     616        toNumber.insert("QScriptValue(0, \"NaN\")", qQNaN());
     617        toNumber.insert("QScriptValue(0, \"Infinity\")", qInf());
     618        toNumber.insert("QScriptValue(0, \"-Infinity\")", qInf());
     619        toNumber.insert("QScriptValue(0, \"ciao\")", qQNaN());
     620        toNumber.insert("QScriptValue(0, QString::fromLatin1(\"ciao\"))", qQNaN());
     621        toNumber.insert("QScriptValue(0, QString(\"\"))", 0);
     622        toNumber.insert("QScriptValue(0, QString())", 0);
     623        toNumber.insert("QScriptValue(0, QString(\"0\"))", 0);
     624        toNumber.insert("QScriptValue(0, QString(\"123\"))", 123);
     625        toNumber.insert("QScriptValue(0, QString(\"12.3\"))", 12.3);
     626        toNumber.insert("QScriptValue(engine, QScriptValue::UndefinedValue)", qQNaN());
     627        toNumber.insert("QScriptValue(engine, QScriptValue::NullValue)", 0);
     628        toNumber.insert("QScriptValue(engine, true)", 1);
     629        toNumber.insert("QScriptValue(engine, false)", 0);
     630        toNumber.insert("QScriptValue(engine, int(122))", 122);
     631        toNumber.insert("QScriptValue(engine, uint(124))", 124);
     632        toNumber.insert("QScriptValue(engine, 0)", 0);
     633        toNumber.insert("QScriptValue(engine, 0.0)", 0);
     634        toNumber.insert("QScriptValue(engine, 123.0)", 123);
     635        toNumber.insert("QScriptValue(engine, 6.37e-8)", 6.369999999999999e-08);
     636        toNumber.insert("QScriptValue(engine, -6.37e-8)", -6.369999999999999e-08);
     637        toNumber.insert("QScriptValue(engine, 0x43211234)", 1126240820);
     638        toNumber.insert("QScriptValue(engine, 0x10000)", 65536);
     639        toNumber.insert("QScriptValue(engine, 0x10001)", 65537);
     640        toNumber.insert("QScriptValue(engine, qSNaN())", qQNaN());
     641        toNumber.insert("QScriptValue(engine, qQNaN())", qQNaN());
     642        toNumber.insert("QScriptValue(engine, qInf())", qInf());
     643        toNumber.insert("QScriptValue(engine, -qInf())", qInf());
     644        toNumber.insert("QScriptValue(engine, \"NaN\")", qQNaN());
     645        toNumber.insert("QScriptValue(engine, \"Infinity\")", qInf());
     646        toNumber.insert("QScriptValue(engine, \"-Infinity\")", qInf());
     647        toNumber.insert("QScriptValue(engine, \"ciao\")", qQNaN());
     648        toNumber.insert("QScriptValue(engine, QString::fromLatin1(\"ciao\"))", qQNaN());
     649        toNumber.insert("QScriptValue(engine, QString(\"\"))", 0);
     650        toNumber.insert("QScriptValue(engine, QString())", 0);
     651        toNumber.insert("QScriptValue(engine, QString(\"0\"))", 0);
     652        toNumber.insert("QScriptValue(engine, QString(\"123\"))", 123);
     653        toNumber.insert("QScriptValue(engine, QString(\"1.23\"))", 1.23);
     654        toNumber.insert("engine->evaluate(\"[]\")", 0);
     655        toNumber.insert("engine->evaluate(\"{}\")", qQNaN());
     656        toNumber.insert("engine->evaluate(\"Object.prototype\")", qQNaN());
     657        toNumber.insert("engine->evaluate(\"Date.prototype\")", qQNaN());
     658        toNumber.insert("engine->evaluate(\"Array.prototype\")", 0);
     659        toNumber.insert("engine->evaluate(\"Function.prototype\")", qQNaN());
     660        toNumber.insert("engine->evaluate(\"Error.prototype\")", qQNaN());
     661        toNumber.insert("engine->evaluate(\"Object\")", qQNaN());
     662        toNumber.insert("engine->evaluate(\"Array\")", qQNaN());
     663        toNumber.insert("engine->evaluate(\"Number\")", qQNaN());
     664        toNumber.insert("engine->evaluate(\"Function\")", qQNaN());
     665        toNumber.insert("engine->evaluate(\"(function() { return 1; })\")", qQNaN());
     666        toNumber.insert("engine->evaluate(\"(function() { return 'ciao'; })\")", qQNaN());
     667        toNumber.insert("engine->evaluate(\"(function() { throw new Error('foo'); })\")", qQNaN());
     668        toNumber.insert("engine->evaluate(\"/foo/\")", qQNaN());
     669        toNumber.insert("engine->evaluate(\"new Object()\")", qQNaN());
     670        toNumber.insert("engine->evaluate(\"new Array()\")", 0);
     671        toNumber.insert("engine->evaluate(\"new Error()\")", qQNaN());
     672    }
     673    newRow(expr) << toNumber.value(expr);
     674}
     675
     676void tst_QScriptValue::toNumber_test(const char*, const QScriptValue& value)
     677{
     678    QFETCH(qsreal, expected);
     679    if (qIsNaN(expected)) {
     680        QVERIFY(qIsNaN(value.toNumber()));
     681        return;
     682    }
     683    if (qIsInf(expected)) {
     684        QVERIFY(qIsInf(value.toNumber()));
     685        return;
     686    }
     687    QCOMPARE(value.toNumber(), expected);
     688}
     689
     690DEFINE_TEST_FUNCTION(toNumber)
Note: See TracChangeset for help on using the changeset viewer.