Changeset 61726 in webkit


Ignore:
Timestamp:
Jun 23, 2010 6:49:17 PM (14 years ago)
Author:
commit-queue@webkit.org
Message:

2010-06-23 Jedrzej Nowacki <jedrzej.nowacki@nokia.com>

Reviewed by Simon Hausmann.

Optimization of the QScriptValuePrivate.

Patch change only internals of the QScriptValuePrivate.
Most of the QScriptValuePrivate's attributes were moved
into an union.

[Qt] Optimization of the QScriptVAluePrivate.
https://bugs.webkit.org/show_bug.cgi?id=40415

  • qt/api/qscriptengine_p.cpp: (QScriptEnginePrivate::globalObject):
  • qt/api/qscriptvalue_p.h: (QScriptValuePrivate::): (QScriptValuePrivate::~QScriptValuePrivate): (QScriptValuePrivate::QScriptValuePrivate): (QScriptValuePrivate::toString): (QScriptValuePrivate::toNumber): (QScriptValuePrivate::toBool): (QScriptValuePrivate::toObject): (QScriptValuePrivate::equals): (QScriptValuePrivate::strictlyEquals): (QScriptValuePrivate::assignEngine): (QScriptValuePrivate::operator JSValueRef): (QScriptValuePrivate::operator JSObjectRef): (QScriptValuePrivate::refinedJSValue):
Location:
trunk/JavaScriptCore
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/ChangeLog

    r61712 r61726  
     12010-06-23  Jedrzej Nowacki  <jedrzej.nowacki@nokia.com>
     2
     3        Reviewed by Simon Hausmann.
     4
     5        Optimization of the QScriptValuePrivate.
     6
     7        Patch change only internals of the QScriptValuePrivate.
     8        Most of the QScriptValuePrivate's attributes were moved
     9        into an union.
     10
     11        [Qt] Optimization of the QScriptVAluePrivate.
     12        https://bugs.webkit.org/show_bug.cgi?id=40415
     13
     14        * qt/api/qscriptengine_p.cpp:
     15        (QScriptEnginePrivate::globalObject):
     16        * qt/api/qscriptvalue_p.h:
     17        (QScriptValuePrivate::):
     18        (QScriptValuePrivate::~QScriptValuePrivate):
     19        (QScriptValuePrivate::QScriptValuePrivate):
     20        (QScriptValuePrivate::toString):
     21        (QScriptValuePrivate::toNumber):
     22        (QScriptValuePrivate::toBool):
     23        (QScriptValuePrivate::toObject):
     24        (QScriptValuePrivate::equals):
     25        (QScriptValuePrivate::strictlyEquals):
     26        (QScriptValuePrivate::assignEngine):
     27        (QScriptValuePrivate::operator JSValueRef):
     28        (QScriptValuePrivate::operator JSObjectRef):
     29        (QScriptValuePrivate::refinedJSValue):
     30
    1312010-06-23  Kwang Yul Seo  <skyul@company100.net>
    232
  • trunk/JavaScriptCore/qt/api/qscriptengine_p.cpp

    r61003 r61726  
    8686{
    8787    JSObjectRef globalObject = JSContextGetGlobalObject(m_context);
    88     return new QScriptValuePrivate(this, globalObject, globalObject);
     88    return new QScriptValuePrivate(this, globalObject);
    8989}
  • trunk/JavaScriptCore/qt/api/qscriptvalue_p.h

    r61003 r61726  
    5050        value is kept in m_number
    5151    CBool -> QSVP is created from bool and no JSC engine has been associated yet. Current value is kept
    52         in m_number
     52        in m_bool
    5353    CNull -> QSVP is null, but a JSC engine hasn't been associated yet.
    5454    CUndefined -> QSVP is undefined, but a JSC engine hasn't been associated yet.
     
    9090
    9191    inline QScriptValuePrivate(const QScriptEnginePrivate* engine, JSValueRef value);
    92     inline QScriptValuePrivate(const QScriptEnginePrivate* engine, JSValueRef value, JSObjectRef object);
     92    inline QScriptValuePrivate(const QScriptEnginePrivate* engine, JSObjectRef object);
    9393
    9494    inline bool isValid() const;
     
    138138    } m_state;
    139139    QScriptEnginePtr m_engine;
    140     QString m_string;
    141     qsreal m_number;
    142     JSValueRef m_value;
    143     JSObjectRef m_object;
    144 
    145     inline void setValue(JSValueRef);
     140    union Value
     141    {
     142        bool m_bool;
     143        qsreal m_number;
     144        JSValueRef m_value;
     145        JSObjectRef m_object;
     146        QString* m_string;
     147
     148        Value() : m_number(0) {}
     149        Value(bool value) : m_bool(value) {}
     150        Value(int number) : m_number(number) {}
     151        Value(uint number) : m_number(number) {}
     152        Value(qsreal number) : m_number(number) {}
     153        Value(JSValueRef value) : m_value(value) {}
     154        Value(JSObjectRef object) : m_object(object) {}
     155        Value(QString* string) : m_string(string) {}
     156    } u;
    146157
    147158    inline bool inherits(const char*);
     
    167178QScriptValuePrivate::~QScriptValuePrivate()
    168179{
    169     if (m_value)
    170         JSValueUnprotect(*m_engine, m_value);
     180    if (isJSBased())
     181        JSValueUnprotect(*m_engine, u.m_value);
     182    else if (isStringBased())
     183        delete u.m_string;
    171184}
    172185
    173186QScriptValuePrivate::QScriptValuePrivate()
    174187    : m_state(Invalid)
    175     , m_value(0)
    176188{
    177189}
     
    179191QScriptValuePrivate::QScriptValuePrivate(const QString& string)
    180192    : m_state(CString)
    181     , m_string(string)
    182     , m_value(0)
     193    , u(new QString(string))
    183194{
    184195}
     
    186197QScriptValuePrivate::QScriptValuePrivate(bool value)
    187198    : m_state(CBool)
    188     , m_number(value)
    189     , m_value(0)
     199    , u(value)
    190200{
    191201}
     
    193203QScriptValuePrivate::QScriptValuePrivate(int number)
    194204    : m_state(CNumber)
    195     , m_number(number)
    196     , m_value(0)
     205    , u(number)
    197206{
    198207}
     
    200209QScriptValuePrivate::QScriptValuePrivate(uint number)
    201210    : m_state(CNumber)
    202     , m_number(number)
    203     , m_value(0)
     211    , u(number)
    204212{
    205213}
     
    207215QScriptValuePrivate::QScriptValuePrivate(qsreal number)
    208216    : m_state(CNumber)
    209     , m_number(number)
    210     , m_value(0)
     217    , u(number)
    211218{
    212219}
     
    214221QScriptValuePrivate::QScriptValuePrivate(QScriptValue::SpecialValue value)
    215222    : m_state(value == QScriptValue::NullValue ? CNull : CUndefined)
    216     , m_value(0)
    217223{
    218224}
     
    221227    : m_state(JSPrimitive)
    222228    , m_engine(const_cast<QScriptEnginePrivate*>(engine))
    223     , m_value(engine->makeJSValue(value))
     229    , u(engine->makeJSValue(value))
    224230{
    225231    Q_ASSERT(engine);
    226     JSValueProtect(*m_engine, m_value);
     232    JSValueProtect(*m_engine, u.m_value);
    227233}
    228234
     
    230236    : m_state(JSPrimitive)
    231237    , m_engine(const_cast<QScriptEnginePrivate*>(engine))
    232     , m_value(m_engine->makeJSValue(value))
     238    , u(m_engine->makeJSValue(value))
    233239{
    234240    Q_ASSERT(engine);
    235     JSValueProtect(*m_engine, m_value);
     241    JSValueProtect(*m_engine, u.m_value);
    236242}
    237243
     
    239245    : m_state(JSPrimitive)
    240246    , m_engine(const_cast<QScriptEnginePrivate*>(engine))
    241     , m_value(m_engine->makeJSValue(value))
     247    , u(m_engine->makeJSValue(value))
    242248{
    243249    Q_ASSERT(engine);
    244     JSValueProtect(*m_engine, m_value);
     250    JSValueProtect(*m_engine, u.m_value);
    245251}
    246252
     
    248254    : m_state(JSPrimitive)
    249255    , m_engine(const_cast<QScriptEnginePrivate*>(engine))
    250     , m_value(m_engine->makeJSValue(value))
     256    , u(m_engine->makeJSValue(value))
    251257{
    252258    Q_ASSERT(engine);
    253     JSValueProtect(*m_engine, m_value);
     259    JSValueProtect(*m_engine, u.m_value);
    254260}
    255261
     
    257263    : m_state(JSPrimitive)
    258264    , m_engine(const_cast<QScriptEnginePrivate*>(engine))
    259     , m_value(m_engine->makeJSValue(value))
     265    , u(m_engine->makeJSValue(value))
    260266{
    261267    Q_ASSERT(engine);
    262     JSValueProtect(*m_engine, m_value);
     268    JSValueProtect(*m_engine, u.m_value);
    263269}
    264270
     
    266272    : m_state(JSPrimitive)
    267273    , m_engine(const_cast<QScriptEnginePrivate*>(engine))
    268     , m_value(m_engine->makeJSValue(value))
     274    , u(m_engine->makeJSValue(value))
    269275{
    270276    Q_ASSERT(engine);
    271     JSValueProtect(*m_engine, m_value);
     277    JSValueProtect(*m_engine, u.m_value);
    272278}
    273279
     
    275281    : m_state(JSValue)
    276282    , m_engine(const_cast<QScriptEnginePrivate*>(engine))
    277     , m_value(value)
     283    , u(value)
    278284{
    279285    Q_ASSERT(engine);
    280286    Q_ASSERT(value);
    281     JSValueProtect(*m_engine, m_value);
    282 }
    283 
    284 QScriptValuePrivate::QScriptValuePrivate(const QScriptEnginePrivate* engine, JSValueRef value, JSObjectRef object)
     287    JSValueProtect(*m_engine, u.m_value);
     288}
     289
     290QScriptValuePrivate::QScriptValuePrivate(const QScriptEnginePrivate* engine, JSObjectRef object)
    285291    : m_state(JSObject)
    286292    , m_engine(const_cast<QScriptEnginePrivate*>(engine))
    287     , m_value(value)
    288     , m_object(object)
     293    , u(object)
    289294{
    290295    Q_ASSERT(engine);
    291     Q_ASSERT(value);
    292296    Q_ASSERT(object);
    293     JSValueProtect(*m_engine, m_value);
     297    JSValueProtect(*m_engine, object);
    294298}
    295299
     
    423427        return QString();
    424428    case CBool:
    425         return m_number ? QString::fromLatin1("true") : QString::fromLatin1("false");
     429        return u.m_bool ? QString::fromLatin1("true") : QString::fromLatin1("false");
    426430    case CString:
    427         return m_string;
     431        return *u.m_string;
    428432    case CNumber:
    429         return QScriptConverter::toString(m_number);
     433        return QScriptConverter::toString(u.m_number);
    430434    case CNull:
    431435        return QString::fromLatin1("null");
     
    451455        return JSValueToNumber(*m_engine, *this, /* exception */ 0);
    452456    case CNumber:
    453         return m_number;
     457        return u.m_number;
    454458    case CBool:
    455         return m_number ? 1 : 0;
     459        return u.m_bool ? 1 : 0;
    456460    case CNull:
    457461    case Invalid:
     
    461465    case CString:
    462466        bool ok;
    463         qsreal result = m_string.toDouble(&ok);
     467        qsreal result = u.m_string->toDouble(&ok);
    464468        if (ok)
    465469            return result;
    466         result = m_string.toInt(&ok, 0); // Try other bases.
     470        result = u.m_string->toInt(&ok, 0); // Try other bases.
    467471        if (ok)
    468472            return result;
    469         if (m_string == "Infinity" || m_string == "-Infinity")
     473        if (*u.m_string == "Infinity" || *u.m_string == "-Infinity")
    470474            return qInf();
    471         return m_string.length() ? qQNaN() : 0;
     475        return u.m_string->length() ? qQNaN() : 0;
    472476    }
    473477
     
    485489        return true;
    486490    case CNumber:
    487         return !(qIsNaN(m_number) || !m_number);
     491        return !(qIsNaN(u.m_number) || !u.m_number);
    488492    case CBool:
    489         return m_number;
     493        return u.m_bool;
    490494    case Invalid:
    491495    case CNull:
     
    493497        return false;
    494498    case CString:
    495         return m_string.length();
     499        return u.m_string->length();
    496500    }
    497501
     
    552556        {
    553557            // Exception can't occur here.
    554             JSObjectRef object = JSValueToObject(*engine, engine->makeJSValue(m_string), /* exception */ 0);
     558            JSObjectRef object = JSValueToObject(*engine, engine->makeJSValue(*u.m_string), /* exception */ 0);
    555559            Q_ASSERT(object);
    556             return new QScriptValuePrivate(engine, object, object);
     560            return new QScriptValuePrivate(engine, object);
    557561        }
    558562    case CNumber:
    559563        {
    560564            // Exception can't occur here.
    561             JSObjectRef object = JSValueToObject(*engine, engine->makeJSValue(m_number), /* exception */ 0);
     565            JSObjectRef object = JSValueToObject(*engine, engine->makeJSValue(u.m_number), /* exception */ 0);
    562566            Q_ASSERT(object);
    563             return new QScriptValuePrivate(engine, object, object);
     567            return new QScriptValuePrivate(engine, object);
    564568        }
    565569    case CBool:
    566570        {
    567571            // Exception can't occure here.
    568             JSObjectRef object = JSValueToObject(*engine, engine->makeJSValue(static_cast<bool>(m_number)), /* exception */ 0);
     572            JSObjectRef object = JSValueToObject(*engine, engine->makeJSValue(u.m_bool), /* exception */ 0);
    569573            Q_ASSERT(object);
    570             return new QScriptValuePrivate(engine, object, object);
     574            return new QScriptValuePrivate(engine, object);
    571575        }
    572576    case JSValue:
     
    616620    if ((m_state == other->m_state) && !isJSBased()) {
    617621        if (isNumberBased())
    618             return m_number == other->m_number;
     622            return u.m_number == other->u.m_number;
    619623        Q_ASSERT(isStringBased());
    620         return m_string == other->m_string;
     624        return *u.m_string == *(other->u.m_string);
    621625    }
    622626
     
    656660    if (isStringBased()) {
    657661        if (other->isStringBased())
    658             return m_string == other->m_string;
     662            return *u.m_string == *(other->u.m_string);
    659663        if (other->isJSBased()) {
    660664            assignEngine(other->engine());
     
    664668    if (isNumberBased()) {
    665669        if (other->isNumberBased())
    666             return m_number == other->m_number;
     670            return u.m_number == other->u.m_number;
    667671        if (other->isJSBased()) {
    668672            assignEngine(other->engine());
     
    691695    switch (m_state) {
    692696    case CBool:
    693         value = engine->makeJSValue(static_cast<bool>(m_number));
     697        value = engine->makeJSValue(u.m_bool);
    694698        break;
    695699    case CString:
    696         value = engine->makeJSValue(m_string);
     700        value = engine->makeJSValue(*u.m_string);
     701        delete u.m_string;
    697702        break;
    698703    case CNumber:
    699         value = engine->makeJSValue(m_number);
     704        value = engine->makeJSValue(u.m_number);
    700705        break;
    701706    case CNull:
     
    714719    m_engine = engine;
    715720    m_state = JSPrimitive;
    716     setValue(value);
     721    u.m_value = value;
     722    JSValueProtect(*m_engine, value);
    717723    return true;
    718724}
     
    764770{
    765771    Q_ASSERT(isJSBased());
    766     return m_value;
     772    Q_ASSERT(u.m_value);
     773    return u.m_value;
    767774}
    768775
     
    770777{
    771778    Q_ASSERT(m_state == JSObject);
    772     return m_object;
    773 }
    774 
    775 void QScriptValuePrivate::setValue(JSValueRef value)
    776 {
    777     if (m_value)
    778         JSValueUnprotect(*m_engine, m_value);
    779     if (value)
    780         JSValueProtect(*m_engine, value);
    781     m_value = value;
     779    Q_ASSERT(u.m_object);
     780    return u.m_object;
    782781}
    783782
     
    807806        m_state = JSPrimitive;
    808807    } else {
     808        // Difference between JSValueRef and JSObjectRef is only in their type, binarywise it is the same.
     809        // As m_value and m_object are stored in the u union, it is enough to change the m_state only.
    809810        m_state = JSObject;
    810         // We are sure that value is an JSObject, so we can const_cast safely without
    811         // calling JSC C API (JSValueToObject(*m_engine, *this, /* exceptions */ 0)).
    812         m_object = const_cast<JSObjectRef>(m_value);
    813811    }
    814812    return m_state;
Note: See TracChangeset for help on using the changeset viewer.