diff options
author | Jedrzej Nowacki <jedrzej.nowacki@nokia.com> | 2009-08-11 07:41:37 (GMT) |
---|---|---|
committer | Jedrzej Nowacki <jedrzej.nowacki@nokia.com> | 2009-08-11 07:41:37 (GMT) |
commit | 10ae0cc37f667953167ff25d5eb74e2d4224bd79 (patch) | |
tree | 7bafc26eb5d72bfd6f15a1cef6e68f5336d2226b /src | |
parent | 2fdff951927ac4f2aab47c423e73d002b3bed628 (diff) | |
parent | 81d8292e486bce768d9af27e3510520a769c4fa8 (diff) | |
download | Qt-10ae0cc37f667953167ff25d5eb74e2d4224bd79.zip Qt-10ae0cc37f667953167ff25d5eb74e2d4224bd79.tar.gz Qt-10ae0cc37f667953167ff25d5eb74e2d4224bd79.tar.bz2 |
Merge branch 'qtscript-jsc-backend' of git@scm.dev.nokia.troll.no:qt/qt-webkit into qtscript-jsc-backend
Diffstat (limited to 'src')
-rw-r--r-- | src/script/api/qscriptcontext.cpp | 7 | ||||
-rw-r--r-- | src/script/api/qscriptcontextinfo.cpp | 20 |
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()); + } + } + } } /*! |