diff options
author | Kent Hansen <khansen@trolltech.com> | 2009-07-08 16:15:49 (GMT) |
---|---|---|
committer | Kent Hansen <khansen@trolltech.com> | 2009-07-08 16:17:37 (GMT) |
commit | a4e0ae8af7b550117d1e9d9dbb90564d50985fe3 (patch) | |
tree | f74e6ab0ec829bca0ecea607d06a5d90aa445ecc /src/script/api/qscriptcontextinfo.cpp | |
parent | 9fa78177eb5f31e6941b165949957f2b92b8dd0a (diff) | |
download | Qt-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.cpp | 36 |
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(); + } } /*! |