Changeset 54579 in webkit
- Timestamp:
- Feb 9, 2010 6:36:38 PM (14 years ago)
- Location:
- trunk/JavaScriptCore
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/ChangeLog
r54577 r54579 1 2010-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 1 21 2010-02-09 Jedrzej Nowacki <jedrzej.nowacki@nokia.com> 2 22 -
trunk/JavaScriptCore/qt/api/qscriptvalue_p.h
r54577 r54579 25 25 #include "qscriptvalue.h" 26 26 #include <JavaScriptCore/JavaScript.h> 27 #include <QtCore/qmath.h> 28 #include <QtCore/qnumeric.h> 27 29 #include <QtCore/qshareddata.h> 28 30 #include <QtCore/qvarlengtharray.h> … … 469 471 qsreal QScriptValuePrivate::toNumber() const 470 472 { 471 // TODO Check it.472 473 switch (m_state) { 473 474 case JSValue: … … 476 477 return JSValueToNumber(context(), value(), /* exception */ 0); 477 478 case CNumber: 479 return m_number; 478 480 case CBool: 479 return m_number ;481 return m_number ? 1 : 0; 480 482 case Invalid: 483 return 0; 481 484 case CSpecial: 482 return false;485 return m_number == QScriptValue::NullValue ? 0 : qQNaN(); 483 486 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; 485 497 } 486 498 -
trunk/JavaScriptCore/qt/tests/qscriptvalue/tst_qscriptvalue.h
r54577 r54579 77 77 void isValid(); 78 78 79 void toNumber_data(); 80 void toNumber(); 81 79 82 private: 80 83 typedef void (tst_QScriptValue::*InitDataFunction)(); … … 126 129 void isValid_test(const char* expr, const QScriptValue& value); 127 130 131 void toNumber_initData(); 132 void toNumber_makeData(const char*); 133 void toNumber_test(const char*, const QScriptValue&); 134 128 135 private: 129 136 QScriptEngine* engine; -
trunk/JavaScriptCore/qt/tests/qscriptvalue/tst_qscriptvalue_generated.cpp
r54577 r54579 557 557 DEFINE_TEST_FUNCTION(isObject) 558 558 559 void tst_QScriptValue::toNumber_initData() 560 { 561 QTest::addColumn<qsreal>("expected"); 562 initScriptValues(); 563 } 564 565 void 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 676 void 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 690 DEFINE_TEST_FUNCTION(toNumber)
Note: See TracChangeset
for help on using the changeset viewer.