summaryrefslogtreecommitdiffstats
path: root/src/script/api/qscriptcontextinfo.cpp
diff options
context:
space:
mode:
authorKent Hansen <khansen@trolltech.com>2009-07-08 16:15:49 (GMT)
committerKent Hansen <khansen@trolltech.com>2009-07-08 16:17:37 (GMT)
commita4e0ae8af7b550117d1e9d9dbb90564d50985fe3 (patch)
treef74e6ab0ec829bca0ecea607d06a5d90aa445ecc /src/script/api/qscriptcontextinfo.cpp
parent9fa78177eb5f31e6941b165949957f2b92b8dd0a (diff)
downloadQt-a4e0ae8af7b550117d1e9d9dbb90564d50985fe3.zip
Qt-a4e0ae8af7b550117d1e9d9dbb90564d50985fe3.tar.gz
Qt-a4e0ae8af7b550117d1e9d9dbb90564d50985fe3.tar.bz2
rewrite most of QScriptContext handling
Do it The right way(TM), by lazily wrapping JSC::ExecState objects.
Diffstat (limited to 'src/script/api/qscriptcontextinfo.cpp')
-rw-r--r--src/script/api/qscriptcontextinfo.cpp36
1 files changed, 35 insertions, 1 deletions
diff --git a/src/script/api/qscriptcontextinfo.cpp b/src/script/api/qscriptcontextinfo.cpp
index e06abd9..7f928ef 100644
--- a/src/script/api/qscriptcontextinfo.cpp
+++ b/src/script/api/qscriptcontextinfo.cpp
@@ -13,7 +13,11 @@
#ifndef QT_NO_SCRIPT
+#include "qscriptcontext_p.h"
+#include "../bridge/qscriptqobject_p.h"
#include <QtCore/qdatastream.h>
+#include "CodeBlock.h"
+#include "JSFunction.h"
QT_BEGIN_NAMESPACE
@@ -61,6 +65,11 @@ QT_BEGIN_NAMESPACE
\value NativeFunction The function is a built-in Qt Script function, or it was defined through a call to QScriptEngine::newFunction().
*/
+namespace QScript
+{
+QString qtStringFromJSCUString(const JSC::UString &str);
+}
+
class QScriptContextInfoPrivate
{
Q_DECLARE_PUBLIC(QScriptContextInfo)
@@ -109,7 +118,6 @@ QScriptContextInfoPrivate::QScriptContextInfoPrivate()
QScriptContextInfoPrivate::QScriptContextInfoPrivate(const QScriptContext *context)
{
Q_ASSERT(context);
- qWarning("QScriptContextInfo is not implemented");
ref = 0;
functionType = QScriptContextInfo::NativeFunction;
functionMetaIndex = -1;
@@ -118,6 +126,32 @@ QScriptContextInfoPrivate::QScriptContextInfoPrivate(const QScriptContext *conte
scriptId = -1;
lineNumber = -1;
columnNumber = -1;
+
+ const QScriptContextPrivate *ctx_p = QScriptContextPrivate::get(context);
+ JSC::ExecState *frame = ctx_p->frame;
+ JSC::InternalFunction *callee = frame->callee();
+ if (callee && callee->isObject(&JSC::JSFunction::info)) {
+ functionType = QScriptContextInfo::ScriptFunction;
+ JSC::SourceProvider *source = frame->codeBlock()->source();
+ scriptId = source->asID();
+ fileName = QScript::qtStringFromJSCUString(source->url());
+ JSC::FunctionBodyNode *body = JSC::asFunction(callee)->body();
+ functionStartLineNumber = body->firstLine();
+ functionEndLineNumber = body->lastLine();
+ const JSC::Identifier* params = body->parameters();
+ for (size_t i = 0; i < body->parameterCount(); ++i)
+ parameterNames.append(QScript::qtStringFromJSCUString(params[i].ustring()));
+ // ### get the function name from the AST
+ // ### don't know the PC, since it's not stored in the frame
+ // lineNumber = codeBlock->expressionRangeForBytecodeOffset(...);
+ } else if (callee && callee->isObject(&QScript::QtFunction::info)) {
+ functionType = QScriptContextInfo::QtFunction;
+ functionMetaIndex = static_cast<QScript::QtFunction*>(callee)->initialIndex();
+ }
+ else if (callee && callee->isObject(&QScript::QtPropertyFunction::info)) {
+ functionType = QScriptContextInfo::QtPropertyFunction;
+ functionMetaIndex = static_cast<QScript::QtPropertyFunction*>(callee)->propertyIndex();
+ }
}
/*!