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/qscriptdeclarativeobject.cpp

    r651 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)
     
    6767                                                   JSC::PropertySlot &slot)
    6868{
    69     QScriptEnginePrivate *engine = scriptEngineFromExec(exec);
    7069    QScriptDeclarativeClass::Identifier identifier = (void *)propertyName.ustring().rep();
    7170
     
    7574        m_class->queryProperty(m_object, identifier, QScriptClass::HandlesReadAccess);
    7675    if (flags & QScriptClass::HandlesReadAccess) {
    77         QScriptValue value = m_class->property(m_object, identifier);
     76        QScriptDeclarativeClass::Value val = m_class->property(m_object, identifier);
    7877        p->context = 0;
    79         slot.setValue(engine->scriptValueToJSCValue(value));
     78        slot.setValue((const JSC::JSValue &)val);
    8079        return true;
    8180    }
     
    9089{
    9190    QScriptEnginePrivate *engine = scriptEngineFromExec(exec);
     91    QScript::SaveFrameHelper saveFrame(engine, exec);
    9292    QScriptDeclarativeClass::Identifier identifier = (void *)propertyName.ustring().rep();
    9393
     
    107107
    108108bool DeclarativeObjectDelegate::deleteProperty(QScriptObject* object, JSC::ExecState *exec,
    109                                                const JSC::Identifier &propertyName,
    110                                                bool checkDontDelete)
     109                                               const JSC::Identifier &propertyName)
    111110{
    112     return QScriptObjectDelegate::deleteProperty(object, exec, propertyName, checkDontDelete);
    113 }
    114 
    115 bool DeclarativeObjectDelegate::getPropertyAttributes(const QScriptObject* object,
    116                                                       JSC::ExecState *exec,
    117                                                       const JSC::Identifier &propertyName,
    118                                                       unsigned &attribs) const
    119 {
    120     QScriptDeclarativeClass::Identifier identifier = (void *)propertyName.ustring().rep();
    121 
    122     QScriptClass::QueryFlags flags =
    123         m_class->queryProperty(m_object, identifier, QScriptClass::HandlesReadAccess);
    124     if (flags & QScriptClass::HandlesReadAccess) {
    125         QScriptValue::PropertyFlags flags = m_class->propertyFlags(m_object, identifier);
    126         attribs = 0;
    127         if (flags & QScriptValue::ReadOnly)
    128             attribs |= JSC::ReadOnly;
    129         if (flags & QScriptValue::SkipInEnumeration)
    130             attribs |= JSC::DontEnum;
    131         if (flags & QScriptValue::Undeletable)
    132             attribs |= JSC::DontDelete;
    133         if (flags & QScriptValue::PropertyGetter)
    134             attribs |= JSC::Getter;
    135         if (flags & QScriptValue::PropertySetter)
    136             attribs |= JSC::Setter;
    137         attribs |= flags & QScriptValue::UserRange;
    138         return true;
    139     }
    140     return QScriptObjectDelegate::getPropertyAttributes(object, exec, propertyName, attribs);
     111    return QScriptObjectDelegate::deleteProperty(object, exec, propertyName);
    141112}
    142113
    143114void DeclarativeObjectDelegate::getOwnPropertyNames(QScriptObject* object, JSC::ExecState *exec,
    144115                                                    JSC::PropertyNameArray &propertyNames,
    145                                                     bool includeNonEnumerable)
     116                                                    JSC::EnumerationMode mode)
    146117{
    147118    QStringList properties = m_class->propertyNames(m_object);
     
    151122    }
    152123
    153     QScriptObjectDelegate::getOwnPropertyNames(object, exec, propertyNames, includeNonEnumerable);
     124    QScriptObjectDelegate::getOwnPropertyNames(object, exec, propertyNames, mode);
    154125}
    155126
    156127JSC::CallType DeclarativeObjectDelegate::getCallData(QScriptObject *object, JSC::CallData &callData)
    157128{
    158     return QScriptObjectDelegate::getCallData(object, callData);
     129    if (!QScriptDeclarativeClassPrivate::get(m_class)->supportsCall)
     130        return JSC::CallTypeNone;
     131    callData.native.function = call;
     132    return JSC::CallTypeHost;
     133}
     134
     135JSC::JSValue DeclarativeObjectDelegate::call(JSC::ExecState *exec, JSC::JSObject *callee,
     136                                             JSC::JSValue thisValue, const JSC::ArgList &args)
     137{
     138    if (!callee->inherits(&QScriptObject::info))
     139        return JSC::throwError(exec, JSC::TypeError, "callee is not a DeclarativeObject object");
     140    QScriptObject *obj = static_cast<QScriptObject*>(callee);
     141    QScriptObjectDelegate *delegate = obj->delegate();
     142    if (!delegate || (delegate->type() != QScriptObjectDelegate::DeclarativeClassObject))
     143        return JSC::throwError(exec, JSC::TypeError, "callee is not a DeclarativeObject object");
     144
     145    QScriptDeclarativeClass *scriptClass = static_cast<DeclarativeObjectDelegate*>(delegate)->m_class;
     146    QScriptEnginePrivate *eng_p = scriptEngineFromExec(exec);
     147
     148    QScript::SaveFrameHelper saveFrame(eng_p, exec);
     149    eng_p->pushContext(exec, thisValue, args, callee);
     150    QScriptContext *ctxt = eng_p->contextForFrame(eng_p->currentFrame);
     151
     152    QScriptValue scriptObject = eng_p->scriptValueFromJSCValue(obj);
     153    QScriptDeclarativeClass::Value result =
     154        scriptClass->call(static_cast<DeclarativeObjectDelegate*>(delegate)->m_object, ctxt);
     155
     156    eng_p->popContext();
     157    return (JSC::JSValue &)(result);
    159158}
    160159
     
    170169}
    171170
     171bool DeclarativeObjectDelegate::compareToObject(QScriptObject *o, JSC::ExecState *exec, JSC::JSObject *o2)
     172{
     173    if (!o2->inherits(&QScriptObject::info))
     174        return false;
     175   
     176    QScriptObject *scriptObject = static_cast<QScriptObject*>(o2);
     177    QScriptObjectDelegate *delegate = scriptObject->delegate();
     178    if (!delegate || (delegate->type() != QScriptObjectDelegate::DeclarativeClassObject))
     179        return false;
     180
     181    DeclarativeObjectDelegate *other = static_cast<DeclarativeObjectDelegate*>(delegate);
     182    if (m_class != other->m_class)
     183        return false;
     184    else
     185        return m_class->compare(m_object, other->m_object);
     186}
     187
    172188} // namespace QScript
    173189
Note: See TracChangeset for help on using the changeset viewer.