summaryrefslogtreecommitdiff
path: root/src/script/api/qscriptcontextinfo.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/script/api/qscriptcontextinfo.cpp')
-rw-r--r--src/script/api/qscriptcontextinfo.cpp248
1 files changed, 69 insertions, 179 deletions
diff --git a/src/script/api/qscriptcontextinfo.cpp b/src/script/api/qscriptcontextinfo.cpp
index 182bc4a..ca96ecb 100644
--- a/src/script/api/qscriptcontextinfo.cpp
+++ b/src/script/api/qscriptcontextinfo.cpp
@@ -21,20 +21,20 @@
**
****************************************************************************/
-#include "config.h"
#include "qscriptcontextinfo.h"
-#include "qscriptcontext_p.h"
#include "qscriptengine.h"
-#include "qscriptengine_p.h"
-#include "../bridge/qscriptqobject_p.h"
#include <QtCore/qdatastream.h>
#include <QtCore/qmetaobject.h>
-#include "CodeBlock.h"
-#include "JSFunction.h"
-#if ENABLE(JIT)
-#include "MacroAssemblerCodeRef.h"
-#endif
+#include "qscriptcontext_p.h"
+#include "qscriptconverter_p.h"
+
+#include <qdebug.h>
+#include "qscriptisolate_p.h"
+#include "qscriptengine_p.h"
+#include "qscriptcontext_p.h"
+#include "qscriptstring_p.h"
+#include "qscript_impl_p.h"
QT_BEGIN_NAMESPACE
@@ -82,11 +82,10 @@ QT_BEGIN_NAMESPACE
*/
class QScriptContextInfoPrivate
+ : public QScriptSharedData
{
- Q_DECLARE_PUBLIC(QScriptContextInfo)
public:
- QScriptContextInfoPrivate();
- QScriptContextInfoPrivate(const QScriptContext *context);
+ QScriptContextInfoPrivate(const QScriptContext *context = 0);
~QScriptContextInfoPrivate();
qint64 scriptId;
@@ -103,116 +102,39 @@ public:
QStringList parameterNames;
- QBasicAtomicInt ref;
-
- QScriptContextInfo *q_ptr;
+ bool operator==(const QScriptContextInfoPrivate &other) const;
+ bool isNull() const { return m_null; }
+private:
+ bool m_null;
};
/*!
\internal
*/
-QScriptContextInfoPrivate::QScriptContextInfoPrivate()
-{
- ref = 0;
- functionType = QScriptContextInfo::NativeFunction;
- functionMetaIndex = -1;
- functionStartLineNumber = -1;
- functionEndLineNumber = -1;
- scriptId = -1;
- lineNumber = -1;
- columnNumber = -1;
-}
-
-/*!
- \internal
-*/
QScriptContextInfoPrivate::QScriptContextInfoPrivate(const QScriptContext *context)
+ : scriptId(-1)
+ , lineNumber(-1)
+ , columnNumber(-1)
+ , functionType(QScriptContextInfo::NativeFunction)
+ , functionStartLineNumber(-1)
+ , functionEndLineNumber(-1)
+ , functionMetaIndex(-1)
+ , m_null(!context)
{
- Q_ASSERT(context);
- ref = 0;
- functionType = QScriptContextInfo::NativeFunction;
- functionMetaIndex = -1;
- functionStartLineNumber = -1;
- functionEndLineNumber = -1;
- scriptId = -1;
- lineNumber = -1;
- columnNumber = -1;
-
- JSC::CallFrame *frame = const_cast<JSC::CallFrame *>(QScriptEnginePrivate::frameForContext(context));
-
- // Get the line number:
-
- //We need to know the context directly up in the backtrace, in order to get the line number, and adjust the global context
- JSC::CallFrame *rewindContext = QScriptEnginePrivate::get(context->engine())->currentFrame;
- if (QScriptEnginePrivate::contextForFrame(rewindContext) == context) { //top context
- frame = rewindContext; //for retreiving the global context's "fake" frame
- // An agent might have provided the line number.
- lineNumber = QScript::scriptEngineFromExec(frame)->agentLineNumber;
- } else {
- // rewind the stack from the top in order to find the frame from the caller where the returnPC is stored
- while (rewindContext && QScriptEnginePrivate::contextForFrame(rewindContext->callerFrame()->removeHostCallFrameFlag()) != context)
- rewindContext = rewindContext->callerFrame()->removeHostCallFrameFlag();
- if (rewindContext) {
- frame = rewindContext->callerFrame()->removeHostCallFrameFlag(); //for retreiving the global context's "fake" frame
-
- JSC::Instruction *returnPC = rewindContext->returnPC();
- JSC::CodeBlock *codeBlock = frame->codeBlock();
- if (returnPC && codeBlock && QScriptEnginePrivate::hasValidCodeBlockRegister(frame)) {
-#if ENABLE(JIT)
- JSC::JITCode code = codeBlock->getJITCode();
- unsigned jitOffset = code.offsetOf(JSC::ReturnAddressPtr(returnPC).value());
- // We can only use the JIT code offset if it's smaller than the JIT size;
- // otherwise calling getBytecodeIndex() is meaningless.
- if (jitOffset < code.size()) {
- unsigned bytecodeOffset = codeBlock->getBytecodeIndex(frame, JSC::ReturnAddressPtr(returnPC));
-#else
- unsigned bytecodeOffset = returnPC - codeBlock->instructions().begin();
-#endif
- bytecodeOffset--; //because returnPC is on the next instruction. We want the current one
- lineNumber = codeBlock->lineNumberForBytecodeOffset(const_cast<JSC::ExecState *>(frame), bytecodeOffset);
-#if ENABLE(JIT)
- }
-#endif
- }
- }
- }
-
- // Get the filename and the scriptId:
- JSC::CodeBlock *codeBlock = frame->codeBlock();
- if (codeBlock && QScriptEnginePrivate::hasValidCodeBlockRegister(frame)) {
- JSC::SourceProvider *source = codeBlock->source();
- scriptId = source->asID();
- fileName = source->url();
- }
-
- // Get the others information:
- JSC::JSObject *callee = frame->callee();
- if (callee && callee->inherits(&JSC::InternalFunction::info))
- functionName = JSC::asInternalFunction(callee)->name(frame);
- if (callee && callee->inherits(&JSC::JSFunction::info)
- && !JSC::asFunction(callee)->isHostFunction()) {
+ if (!context)
+ return;
+
+ QScriptContextPrivate *context_p = QScriptContextPrivate::get(context);
+ QScriptIsolate api(context_p->engine, QScriptIsolate::NotNullEngine);
+ v8::HandleScope handleScope;
+ if (context_p->isJSFrame()) {
+ v8::Handle<v8::StackFrame> frame = context_p->frame;
+ scriptId = frame->GetScriptId()->NumberValue();
+ columnNumber = frame->GetColumn();
+ lineNumber = frame->GetLineNumber();
functionType = QScriptContextInfo::ScriptFunction;
- JSC::FunctionExecutable *body = JSC::asFunction(callee)->jsExecutable();
- functionStartLineNumber = body->lineNo();
- functionEndLineNumber = body->lastLine();
- for (size_t i = 0; i < body->parameterCount(); ++i)
- parameterNames.append(body->parameterName(i));
- // ### get the function name from the AST
- } else if (callee && callee->inherits(&QScript::QtFunction::info)) {
- functionType = QScriptContextInfo::QtFunction;
- // ### the slot can be overloaded -- need to get the particular overload from the context
- functionMetaIndex = static_cast<QScript::QtFunction*>(callee)->initialIndex();
- const QMetaObject *meta = static_cast<QScript::QtFunction*>(callee)->metaObject();
- if (meta != 0) {
- QMetaMethod method = meta->method(functionMetaIndex);
- QList<QByteArray> formals = method.parameterNames();
- for (int i = 0; i < formals.count(); ++i)
- parameterNames.append(QLatin1String(formals.at(i)));
- }
- }
- else if (callee && callee->inherits(&QScript::QtPropertyFunction::info)) {
- functionType = QScriptContextInfo::QtPropertyFunction;
- functionMetaIndex = static_cast<QScript::QtPropertyFunction*>(callee)->propertyIndex();
+ functionName = QScriptConverter::toString(frame->GetFunctionName());
+ fileName = QScriptConverter::toString(frame->GetScriptName());
}
}
@@ -223,6 +145,21 @@ QScriptContextInfoPrivate::~QScriptContextInfoPrivate()
{
}
+bool QScriptContextInfoPrivate::operator==(const QScriptContextInfoPrivate &other) const
+{
+ return (scriptId == other.scriptId)
+ && (lineNumber == other.lineNumber)
+ && (columnNumber == other.columnNumber)
+ && (fileName == other.fileName)
+ && (functionName == other.functionName)
+ && (functionType == other.functionType)
+ && (functionStartLineNumber == other.functionStartLineNumber)
+ && (functionEndLineNumber == other.functionEndLineNumber)
+ && (functionMetaIndex == other.functionMetaIndex)
+ && (parameterNames == other.parameterNames)
+ && (m_null == m_null);
+}
+
/*!
Constructs a new QScriptContextInfo from the given \a context.
@@ -232,13 +169,9 @@ QScriptContextInfoPrivate::~QScriptContextInfoPrivate()
previously created QScriptContextInfo.
*/
QScriptContextInfo::QScriptContextInfo(const QScriptContext *context)
- : d_ptr(0)
-{
- if (context) {
- d_ptr = new QScriptContextInfoPrivate(context);
- d_ptr->q_ptr = this;
- }
-}
+ : d_ptr(new QScriptContextInfoPrivate(context))
+
+{}
/*!
Constructs a new QScriptContextInfo from the \a other info.
@@ -253,8 +186,7 @@ QScriptContextInfo::QScriptContextInfo(const QScriptContextInfo &other)
\sa isNull()
*/
-QScriptContextInfo::QScriptContextInfo()
- : d_ptr(0)
+QScriptContextInfo::QScriptContextInfo() : d_ptr(new QScriptContextInfoPrivate)
{
}
@@ -284,10 +216,7 @@ QScriptContextInfo &QScriptContextInfo::operator=(const QScriptContextInfo &othe
*/
qint64 QScriptContextInfo::scriptId() const
{
- Q_D(const QScriptContextInfo);
- if (!d)
- return -1;
- return d->scriptId;
+ return d_ptr->scriptId;
}
/*!
@@ -301,10 +230,7 @@ qint64 QScriptContextInfo::scriptId() const
*/
QString QScriptContextInfo::fileName() const
{
- Q_D(const QScriptContextInfo);
- if (!d)
- return QString();
- return d->fileName;
+ return d_ptr->fileName;
}
/*!
@@ -318,10 +244,7 @@ QString QScriptContextInfo::fileName() const
*/
int QScriptContextInfo::lineNumber() const
{
- Q_D(const QScriptContextInfo);
- if (!d)
- return -1;
- return d->lineNumber;
+ return d_ptr->lineNumber;
}
/*!
@@ -329,10 +252,7 @@ int QScriptContextInfo::lineNumber() const
*/
int QScriptContextInfo::columnNumber() const
{
- Q_D(const QScriptContextInfo);
- if (!d)
- return -1;
- return d->columnNumber;
+ return d_ptr->columnNumber;
}
/*!
@@ -348,10 +268,7 @@ int QScriptContextInfo::columnNumber() const
*/
QString QScriptContextInfo::functionName() const
{
- Q_D(const QScriptContextInfo);
- if (!d)
- return QString();
- return d->functionName;
+ return d_ptr->functionName;
}
/*!
@@ -361,10 +278,7 @@ QString QScriptContextInfo::functionName() const
*/
QScriptContextInfo::FunctionType QScriptContextInfo::functionType() const
{
- Q_D(const QScriptContextInfo);
- if (!d)
- return NativeFunction;
- return d->functionType;
+ return d_ptr->functionType;
}
/*!
@@ -378,10 +292,7 @@ QScriptContextInfo::FunctionType QScriptContextInfo::functionType() const
*/
int QScriptContextInfo::functionStartLineNumber() const
{
- Q_D(const QScriptContextInfo);
- if (!d)
- return -1;
- return d->functionStartLineNumber;
+ return d_ptr->functionStartLineNumber;
}
/*!
@@ -395,10 +306,7 @@ int QScriptContextInfo::functionStartLineNumber() const
*/
int QScriptContextInfo::functionEndLineNumber() const
{
- Q_D(const QScriptContextInfo);
- if (!d)
- return -1;
- return d->functionEndLineNumber;
+ return d_ptr->functionEndLineNumber;
}
/*!
@@ -409,10 +317,8 @@ int QScriptContextInfo::functionEndLineNumber() const
*/
QStringList QScriptContextInfo::functionParameterNames() const
{
- Q_D(const QScriptContextInfo);
- if (!d)
- return QStringList();
- return d->parameterNames;
+ Q_UNIMPLEMENTED();
+ return QStringList();
}
/*!
@@ -430,10 +336,8 @@ QStringList QScriptContextInfo::functionParameterNames() const
*/
int QScriptContextInfo::functionMetaIndex() const
{
- Q_D(const QScriptContextInfo);
- if (!d)
- return -1;
- return d->functionMetaIndex;
+ Q_UNIMPLEMENTED();
+ return -1;
}
/*!
@@ -442,8 +346,7 @@ int QScriptContextInfo::functionMetaIndex() const
*/
bool QScriptContextInfo::isNull() const
{
- Q_D(const QScriptContextInfo);
- return (d == 0);
+ return d_ptr->isNull();
}
/*!
@@ -458,16 +361,7 @@ bool QScriptContextInfo::operator==(const QScriptContextInfo &other) const
return true;
if (!d || !od)
return false;
- return ((d->scriptId == od->scriptId)
- && (d->lineNumber == od->lineNumber)
- && (d->columnNumber == od->columnNumber)
- && (d->fileName == od->fileName)
- && (d->functionName == od->functionName)
- && (d->functionType == od->functionType)
- && (d->functionStartLineNumber == od->functionStartLineNumber)
- && (d->functionEndLineNumber == od->functionEndLineNumber)
- && (d->functionMetaIndex == od->functionMetaIndex)
- && (d->parameterNames == od->parameterNames));
+ return *d == *od;
}
/*!
@@ -515,10 +409,6 @@ QDataStream &operator<<(QDataStream &out, const QScriptContextInfo &info)
*/
Q_SCRIPT_EXPORT QDataStream &operator>>(QDataStream &in, QScriptContextInfo &info)
{
- if (!info.d_ptr) {
- info.d_ptr = new QScriptContextInfoPrivate();
- }
-
in >> info.d_ptr->scriptId;
qint32 line;