summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/script/api/qscriptcontext.cpp7
-rw-r--r--src/script/api/qscriptcontextinfo.cpp20
2 files changed, 20 insertions, 7 deletions
diff --git a/src/script/api/qscriptcontext.cpp b/src/script/api/qscriptcontext.cpp
index 669002d..f4b8af6 100644
--- a/src/script/api/qscriptcontext.cpp
+++ b/src/script/api/qscriptcontext.cpp
@@ -273,8 +273,7 @@ QScriptValue QScriptContext::argument(int index) const
if (index >= argumentCount())
return QScriptValue(QScriptValue::UndefinedValue);
JSC::Register* thisRegister = frame->registers() - JSC::RegisterFile::CallFrameHeaderSize - frame->argumentCount();
- if (frame->codeBlock() == 0)
- ++index; // ### off-by-one issue with native functions
+ ++index; //skip the 'this' object
return QScript::scriptEngineFromExec(frame)->scriptValueFromJSCValue(thisRegister[index].jsValue());
}
@@ -370,9 +369,7 @@ bool QScriptContext::isCalledAsConstructor() const
QScriptContext *QScriptContext::parentContext() const
{
const JSC::CallFrame *frame = QScriptEnginePrivate::frameForContext(this);
- JSC::CallFrame *callerFrame = frame->callerFrame();
- if (callerFrame == (JSC::CallFrame*)(1)) // ### CallFrame::noCaller() is private
- return 0;
+ JSC::CallFrame *callerFrame = frame->callerFrame()->removeHostCallFrameFlag();
return reinterpret_cast<QScriptContext *>(callerFrame);
}
diff --git a/src/script/api/qscriptcontextinfo.cpp b/src/script/api/qscriptcontextinfo.cpp
index 52776e2..20b77f0 100644
--- a/src/script/api/qscriptcontextinfo.cpp
+++ b/src/script/api/qscriptcontextinfo.cpp
@@ -174,8 +174,6 @@ QScriptContextInfoPrivate::QScriptContextInfoPrivate(const QScriptContext *conte
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;
// ### the slot can be overloaded -- need to get the particular overload from the context
@@ -192,6 +190,24 @@ QScriptContextInfoPrivate::QScriptContextInfoPrivate(const QScriptContext *conte
functionType = QScriptContextInfo::QtPropertyFunction;
functionMetaIndex = static_cast<QScript::QtPropertyFunction*>(callee)->propertyIndex();
}
+
+ // get the lineNumber:
+ QScriptContext *rewindContext = context->engine()->currentContext();
+ if (rewindContext == context) {
+ //ignore native function
+ } else {
+ // rewind the stack from the top in order to find the frame from the caller where the returnPC is stored
+ while (rewindContext && rewindContext->parentContext() != context)
+ rewindContext = rewindContext->parentContext();
+ if (rewindContext) {
+ JSC::Instruction *returnPC = QScriptEnginePrivate::frameForContext(rewindContext)->returnPC();
+ JSC::CodeBlock *codeBlock = frame->codeBlock();
+ if (returnPC && codeBlock) {
+ lineNumber = codeBlock->lineNumberForBytecodeOffset(const_cast<JSC::ExecState *>(frame),
+ returnPC - codeBlock->instructions().begin());
+ }
+ }
+ }
}
/*!