diff options
author | Aaron Kennedy <aaron.kennedy@nokia.com> | 2009-10-08 03:54:28 (GMT) |
---|---|---|
committer | Aaron Kennedy <aaron.kennedy@nokia.com> | 2009-10-08 03:54:28 (GMT) |
commit | 16cf54b2a1f8631c59950989691f6384c0550040 (patch) | |
tree | cc386d35b08889ee7e693489753a4fb076d4996c | |
parent | 41ec742f6713f5b3b4da853f514d685c35c3f31f (diff) | |
download | Qt-16cf54b2a1f8631c59950989691f6384c0550040.zip Qt-16cf54b2a1f8631c59950989691f6384c0550040.tar.gz Qt-16cf54b2a1f8631c59950989691f6384c0550040.tar.bz2 |
Tweak QScriptDeclarativeClass API to not be so silly
-rw-r--r-- | src/script/bridge/qscriptdeclarativeclass.cpp | 42 | ||||
-rw-r--r-- | src/script/bridge/qscriptdeclarativeclass_p.h | 3 | ||||
-rw-r--r-- | src/script/bridge/qscriptdeclarativeobject.cpp | 14 | ||||
-rw-r--r-- | src/script/bridge/qscriptdeclarativeobject_p.h | 14 |
4 files changed, 45 insertions, 28 deletions
diff --git a/src/script/bridge/qscriptdeclarativeclass.cpp b/src/script/bridge/qscriptdeclarativeclass.cpp index a7667cb..d019839 100644 --- a/src/script/bridge/qscriptdeclarativeclass.cpp +++ b/src/script/bridge/qscriptdeclarativeclass.cpp @@ -76,17 +76,8 @@ QScriptDeclarativeClass::PersistentIdentifier::operator=(const PersistentIdentif return *this; } -class QScriptDeclarativeClassPrivate -{ -public: - QScriptDeclarativeClassPrivate() : engine(0), q_ptr(0) {} - - QScriptEngine *engine; - QScriptDeclarativeClass *q_ptr; -}; - QScriptDeclarativeClass::QScriptDeclarativeClass(QScriptEngine *engine) -: context(0), d_ptr(new QScriptDeclarativeClassPrivate) +: d_ptr(new QScriptDeclarativeClassPrivate) { Q_ASSERT(sizeof(void*) == sizeof(JSC::Identifier)); d_ptr->q_ptr = this; @@ -178,8 +169,9 @@ QScriptValue QScriptDeclarativeClass::property(const QScriptValue &v, const Iden } /* -Returns the scope chain entry \a index from the end. This is equivalent to: - context->scopeChain().at(context->scopeChain.length() - 1 - index) +Returns the scope chain entry at \a index. If index is less than 0, returns +entries starting at the end. For example, scopeChainValue(context, -1) will return +the value last in the scope chain. */ QScriptValue QScriptDeclarativeClass::scopeChainValue(QScriptContext *context, int index) { @@ -190,18 +182,21 @@ QScriptValue QScriptDeclarativeClass::scopeChainValue(QScriptContext *context, i JSC::ScopeChainNode *node = frame->scopeChain(); JSC::ScopeChainIterator it(node); - int count = 0; - for (it = node->begin(); it != node->end(); ++it) - ++count; - - if (count < index) - return QScriptValue(); + if (index < 0) { + int count = 0; + for (it = node->begin(); it != node->end(); ++it) + ++count; - count -= index; + index = qAbs(index); + if (index > count) + return QScriptValue(); + else + index = count - index; + } for (it = node->begin(); it != node->end(); ++it) { - if (count == 0) { + if (index == 0) { JSC::JSObject *object = *it; if (!object) return QScriptValue(); @@ -214,7 +209,7 @@ QScriptValue QScriptDeclarativeClass::scopeChainValue(QScriptContext *context, i return engine->scriptValueFromJSCValue(object); } else { - --count; + --index; } } @@ -314,3 +309,8 @@ QVariant QScriptDeclarativeClass::toVariant(Object *, bool *ok) return QVariant(); } +QScriptContext *QScriptDeclarativeClass::context() const +{ + return d_ptr->context; +} + diff --git a/src/script/bridge/qscriptdeclarativeclass_p.h b/src/script/bridge/qscriptdeclarativeclass_p.h index 0d05ec5..b28209a 100644 --- a/src/script/bridge/qscriptdeclarativeclass_p.h +++ b/src/script/bridge/qscriptdeclarativeclass_p.h @@ -116,8 +116,9 @@ public: virtual QObject *toQObject(Object *, bool *ok = 0); virtual QVariant toVariant(Object *, bool *ok = 0); - QScriptContext *context; + QScriptContext *context() const; protected: + friend class QScriptDeclarativeClassPrivate; QScopedPointer<QScriptDeclarativeClassPrivate> d_ptr; }; diff --git a/src/script/bridge/qscriptdeclarativeobject.cpp b/src/script/bridge/qscriptdeclarativeobject.cpp index ffdebb0..76c2eb0 100644 --- a/src/script/bridge/qscriptdeclarativeobject.cpp +++ b/src/script/bridge/qscriptdeclarativeobject.cpp @@ -87,16 +87,17 @@ bool DeclarativeObjectDelegate::getOwnPropertySlot(QScriptObject* object, QScriptEnginePrivate *engine = scriptEngineFromExec(exec); QScriptDeclarativeClass::Identifier identifier = (void *)propertyName.ustring().rep(); - m_class->context = reinterpret_cast<QScriptContext *>(exec); + QScriptDeclarativeClassPrivate *p = QScriptDeclarativeClassPrivate::get(m_class); + p->context = reinterpret_cast<QScriptContext *>(exec); QScriptClass::QueryFlags flags = m_class->queryProperty(m_object, identifier, QScriptClass::HandlesReadAccess); if (flags & QScriptClass::HandlesReadAccess) { QScriptValue value = m_class->property(m_object, identifier); - m_class->context = 0; + p->context = 0; slot.setValue(engine->scriptValueToJSCValue(value)); return true; } - m_class->context = 0; + p->context = 0; return QScriptObjectDelegate::getOwnPropertySlot(object, exec, propertyName, slot); } @@ -108,15 +109,16 @@ void DeclarativeObjectDelegate::put(QScriptObject* object, JSC::ExecState *exec, QScriptEnginePrivate *engine = scriptEngineFromExec(exec); QScriptDeclarativeClass::Identifier identifier = (void *)propertyName.ustring().rep(); - m_class->context = reinterpret_cast<QScriptContext *>(exec); + QScriptDeclarativeClassPrivate *p = QScriptDeclarativeClassPrivate::get(m_class); + p->context = reinterpret_cast<QScriptContext *>(exec); QScriptClass::QueryFlags flags = m_class->queryProperty(m_object, identifier, QScriptClass::HandlesWriteAccess); if (flags & QScriptClass::HandlesWriteAccess) { m_class->setProperty(m_object, identifier, engine->scriptValueFromJSCValue(value)); - m_class->context = 0; + p->context = 0; return; } - m_class->context = 0; + p->context = 0; QScriptObjectDelegate::put(object, exec, propertyName, value, slot); } diff --git a/src/script/bridge/qscriptdeclarativeobject_p.h b/src/script/bridge/qscriptdeclarativeobject_p.h index 9c14774..c6dfb83 100644 --- a/src/script/bridge/qscriptdeclarativeobject_p.h +++ b/src/script/bridge/qscriptdeclarativeobject_p.h @@ -63,6 +63,20 @@ QT_BEGIN_NAMESPACE class QScriptClass; +class QScriptDeclarativeClassPrivate +{ +public: + QScriptDeclarativeClassPrivate() : engine(0), q_ptr(0), context(0) {} + + QScriptEngine *engine; + QScriptDeclarativeClass *q_ptr; + QScriptContext *context; + + static QScriptDeclarativeClassPrivate *get(QScriptDeclarativeClass *c) { + return c->d_ptr.data(); + } +}; + namespace QScript { |