Ignore:
Timestamp:
May 5, 2011, 5:36:53 AM (14 years ago)
Author:
Dmitry A. Kuminov
Message:

trunk: Merged in qt 4.7.2 sources from branches/vendor/nokia/qt.

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk

  • trunk/src/script/bridge/qscriptclassobject.cpp

    r769 r846  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
     
    7979    if (flags & QScriptClass::HandlesReadAccess) {
    8080        QScriptValue value = m_scriptClass->property(scriptObject, scriptName, id);
     81        if (!value.isValid()) {
     82            // The class claims to have the property, but returned an invalid
     83            // value. Silently convert to undefined to avoid the invalid value
     84            // "escaping" into JS.
     85            value = QScriptValue(QScriptValue::UndefinedValue);
     86        }
    8187        slot.setValue(engine->scriptValueToJSCValue(value));
     88        return true;
     89    }
     90    return false;
     91}
     92
     93bool ClassObjectDelegate::getOwnPropertyDescriptor(QScriptObject *object,
     94                                                   JSC::ExecState *exec,
     95                                                   const JSC::Identifier &propertyName,
     96                                                   JSC::PropertyDescriptor &descriptor)
     97{
     98    QScriptEnginePrivate *engine = scriptEngineFromExec(exec);
     99    QScript::SaveFrameHelper saveFrame(engine, exec);
     100    // for compatibility with the old back-end, normal JS properties
     101    // are queried first.
     102    if (QScriptObjectDelegate::getOwnPropertyDescriptor(object, exec, propertyName, descriptor))
     103        return true;
     104
     105    QScriptValue scriptObject = engine->scriptValueFromJSCValue(object);
     106    QScriptString scriptName;
     107    QScriptStringPrivate scriptName_d(engine, propertyName, QScriptStringPrivate::StackAllocated);
     108    QScriptStringPrivate::init(scriptName, &scriptName_d);
     109    uint id = 0;
     110    QScriptClass::QueryFlags qflags = m_scriptClass->queryProperty(
     111        scriptObject, scriptName, QScriptClass::HandlesReadAccess, &id);
     112    if (qflags & QScriptClass::HandlesReadAccess) {
     113        QScriptValue::PropertyFlags pflags = m_scriptClass->propertyFlags(scriptObject, scriptName, id);
     114        unsigned attribs = 0;
     115        if (pflags & QScriptValue::ReadOnly)
     116            attribs |= JSC::ReadOnly;
     117        if (pflags & QScriptValue::SkipInEnumeration)
     118            attribs |= JSC::DontEnum;
     119        if (pflags & QScriptValue::Undeletable)
     120            attribs |= JSC::DontDelete;
     121        if (pflags & QScriptValue::PropertyGetter)
     122            attribs |= JSC::Getter;
     123        if (pflags & QScriptValue::PropertySetter)
     124            attribs |= JSC::Setter;
     125        attribs |= pflags & QScriptValue::UserRange;
     126        // Rather than calling the getter, we could return an access descriptor here.
     127        QScriptValue value = m_scriptClass->property(scriptObject, scriptName, id);
     128        if (!value.isValid()) {
     129            // The class claims to have the property, but returned an invalid
     130            // value. Silently convert to undefined to avoid the invalid value
     131            // "escaping" into JS.
     132            value = QScriptValue(QScriptValue::UndefinedValue);
     133        }
     134        descriptor.setDescriptor(engine->scriptValueToJSCValue(value), attribs);
    82135        return true;
    83136    }
     
    106159
    107160bool ClassObjectDelegate::deleteProperty(QScriptObject* object, JSC::ExecState *exec,
    108                                          const JSC::Identifier &propertyName,
    109                                          bool checkDontDelete)
     161                                         const JSC::Identifier &propertyName)
    110162{
    111163    // ### avoid duplication of put()
     
    125177        return true;
    126178    }
    127     return QScriptObjectDelegate::deleteProperty(object, exec, propertyName, checkDontDelete);
    128 }
    129 
    130 bool ClassObjectDelegate::getPropertyAttributes(const QScriptObject* object, JSC::ExecState *exec,
    131                                                 const JSC::Identifier &propertyName,
    132                                                 unsigned &attribs) const
    133 {
    134     QScriptEnginePrivate *engine = scriptEngineFromExec(exec);
    135     QScript::SaveFrameHelper saveFrame(engine, exec);
    136     QScriptValue scriptObject = engine->scriptValueFromJSCValue(object);
    137     QScriptString scriptName;
    138     QScriptStringPrivate scriptName_d(engine, propertyName, QScriptStringPrivate::StackAllocated);
    139     QScriptStringPrivate::init(scriptName, &scriptName_d);
    140     uint id = 0;
    141     QScriptClass::QueryFlags flags = m_scriptClass->queryProperty(
    142         scriptObject, scriptName, QScriptClass::HandlesReadAccess, &id);
    143     if (flags & QScriptClass::HandlesReadAccess) {
    144         QScriptValue::PropertyFlags flags = m_scriptClass->propertyFlags(scriptObject, scriptName, id);
    145         attribs = 0;
    146         if (flags & QScriptValue::ReadOnly)
    147             attribs |= JSC::ReadOnly;
    148         if (flags & QScriptValue::SkipInEnumeration)
    149             attribs |= JSC::DontEnum;
    150         if (flags & QScriptValue::Undeletable)
    151             attribs |= JSC::DontDelete;
    152         if (flags & QScriptValue::PropertyGetter)
    153             attribs |= JSC::Getter;
    154         if (flags & QScriptValue::PropertySetter)
    155             attribs |= JSC::Setter;
    156         attribs |= flags & QScriptValue::UserRange;
    157         return true;
    158     }
    159     return QScriptObjectDelegate::getPropertyAttributes(object, exec, propertyName, attribs);
     179    return QScriptObjectDelegate::deleteProperty(object, exec, propertyName);
    160180}
    161181
    162182void ClassObjectDelegate::getOwnPropertyNames(QScriptObject* object, JSC::ExecState *exec,
    163183                                              JSC::PropertyNameArray &propertyNames,
    164                                               bool includeNonEnumerable)
     184                                              JSC::EnumerationMode mode)
    165185{
    166186    QScriptEnginePrivate *engine = scriptEngineFromExec(exec);
     
    176196        delete it;
    177197    }
    178     QScriptObjectDelegate::getOwnPropertyNames(object, exec, propertyNames, includeNonEnumerable);
     198    QScriptObjectDelegate::getOwnPropertyNames(object, exec, propertyNames, mode);
    179199}
    180200
     
    207227    eng_p->popContext();
    208228    eng_p->currentFrame = oldFrame;
    209     return eng_p->jscValueFromVariant(result);
     229    return QScriptEnginePrivate::jscValueFromVariant(exec, result);
    210230}
    211231
Note: See TracChangeset for help on using the changeset viewer.