summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAaron Kennedy <aaron.kennedy@nokia.com>2009-10-08 03:54:28 (GMT)
committerAaron Kennedy <aaron.kennedy@nokia.com>2009-10-08 03:54:28 (GMT)
commit16cf54b2a1f8631c59950989691f6384c0550040 (patch)
treecc386d35b08889ee7e693489753a4fb076d4996c
parent41ec742f6713f5b3b4da853f514d685c35c3f31f (diff)
downloadQt-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.cpp42
-rw-r--r--src/script/bridge/qscriptdeclarativeclass_p.h3
-rw-r--r--src/script/bridge/qscriptdeclarativeobject.cpp14
-rw-r--r--src/script/bridge/qscriptdeclarativeobject_p.h14
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
{