我试图通过捕获函数条目并退出,通过QScriptEngineAgent
实现简单的QtScript性能分析器。我成功订阅了QScriptEngineAgent::functionEntry()
回调。现在,是否有可能获得被调用的函数的名称(字符串),在这个回调中?QScriptEngineAgent - 获取被调用者名称
即使我知道并非所有的脚本函数都需要有一个名字,即使在最简单的情况下它似乎也不起作用。 QScriptContextInfo
为此提供了便利,但它似乎失败了。然后我试图获得arguments.callee.name
财产的价值,但它也失败了。
下面是我试图在qt-5.3.2/linux上运行的尝试的粗略概述。
tmp.pro
:
TEMPLATE = app
TARGET = tmp
INCLUDEPATH += .
QT += core script
SOURCES += main.cpp
main.cpp
:
#include <QCoreApplication>
#include <QScriptEngine>
#include <QScriptEngineAgent>
#include <QScriptContextInfo>
#include <QDebug>
class MyAgent: public QScriptEngineAgent {
private:
void functionEntry(qint64 scriptId) {
qDebug() << "functionEntry" << scriptId;
QScriptContext *context = engine()->currentContext();
// QScriptContextInfo should have function name, by design, afaik
QScriptContextInfo contextInfo(context);
qDebug() << contextInfo.functionName();
// probably my typical js-side arguments.callee.name would work?
QScriptValue callee = context->callee();
qDebug() << callee.property("name").toString();
// function.toString() should have at least something (?)
qDebug() << callee.toString();
// hmm. what's our context, anyway?
qDebug() << context->toString();
}
public:
MyAgent(QScriptEngine *eng) : QScriptEngineAgent(eng) {
qDebug() << "engine" << eng;
}
};
int main(int argc, char **argv) {
QCoreApplication app(argc, argv);
QScriptEngine eng;
MyAgent agent(&eng);
eng.setAgent(&agent);
qDebug() << "agent " << eng.agent();
eng.evaluate("function foo() { return 6 * 7; }"
"function bar() { return foo(); }");
QScriptValue bar = eng.globalObject().property("bar");
// See? Here the callee is printed as expected.
qDebug() << "call " << bar.property("name").toString() << bar.toString();
QScriptValue ret = bar.call();
qDebug() << "answer" << ret.toNumber();
return 0;
}
输出样本,这是我很不满意,因为我期待看到 “富” 与 “酒吧”,而不是一些空字符串:
engine QScriptEngine(0x7fffc55c4560)
agent 0x7fffc55c4570
functionEntry 140300485581200
""
""
""
"<global>() at -1"
functionEntry -1
""
""
""
"<global>() at -1"
call "bar" "function bar() { return foo(); }"
functionEntry 140300485581200
""
""
""
"<global>() at -1"
functionEntry 140300485581200
""
""
""
"<global>() at -1"
answer 42
嗯。 http://qt-project.org/wiki/Qt_Modules_Maturity_Level “QScriptEngineAgent和相关类 状态:已弃用 推理:有缺陷的设计,被更好的设计取代。” – NoQ 2014-11-23 11:36:46