Russian Qt Forum

Qt => Qt Script, QtWebKit => Тема начата: lesav от Октябрь 18, 2012, 10:00



Название: [РЕШЕНО] QScriptEngine::evaluate(). Эквивалент __LINE__ в контексте скрипта
Отправлено: lesav от Октябрь 18, 2012, 10:00
Существуют ли аналоги  макросов __LINE__   __FUNC__  доступные в контексте скрипта?


[РЕШЕНО]  решение здесь (http://www.prog.org.ru/index.php?topic=23305.msg169386#msg169386)


Название: Re: QScriptEngine::evaluate(). Эквивалент __LINE__ в контексте скрипта
Отправлено: lesav от Октябрь 18, 2012, 13:03
Странно, никому не нужно было отлавливать эксепшены в скриптах ?

Может и мне оно не надо ?


Название: Re: QScriptEngine::evaluate(). Эквивалент __LINE__ в контексте скрипта
Отправлено: Igors от Октябрь 18, 2012, 13:27
Странно, никому не нужно было отлавливать эксепшены в скриптах ?

Может и мне оно не надо ?
Это может интересно, но непонятно - о каком "скрипте" идет речь? Я знаю что __LINE__ печатает текущую строку, но мне это никогда не было нужно. Также хз что за эксепшн и чего это он в скрипте ???. В общем, адаптируйте пост "для широкого круга", а то сейчас как с MSDN - неясно это С++ или Васька или что-то еще  :)


Название: Re: QScriptEngine::evaluate(). Эквивалент __LINE__ в контексте скрипта
Отправлено: lesav от Октябрь 18, 2012, 18:50
Стандартный подход:
  создать QScriptEngine
  отобразить некие объекты в скрипт (они доступны в теле скрипта)
  выполнить

Код
C++ (Qt)
QScriptEngine scriptEngine;
QFile file("./js_script.js");
if(file.open(QIODevice::ReadOnly)) {
  QScriptValue val = scriptEngine.newQObject(qtMyObject);
  scriptEngine.globalObject().setProperty("jsMyObject", val);
 
  QString strScript = file.readAll();
 
  QString strRes = scriptEngine.evaluate(strScript).toString();
  if(scriptEngine.hasUncaughtException()) {
     qDebug() << "Exception: file " << file.fileName()
              << " Line " << scriptEngine.uncaughtExceptionLineNumber()
              << " result " strRes;
  }
}

В скрипте происходит следующее:
Код
Java
var __LINE__ = 3;
function test(){
 jsMyObject.appendLog("Ok", __LINE__);
}
test();


Из js выполняется метод Q_INVOKABLE  void qtMyObject::appendLog(Qstring, int)


Вот я и спрашиваю, существует ли "Эквивалент Си-шного макроса __LINE__  в контексте скрипта"?


Название: Re: QScriptEngine::evaluate(). Эквивалент __LINE__ в контексте скрипта
Отправлено: Igors от Октябрь 19, 2012, 07:14
Ну вот, теперь ясно. Правда поддержать разговор я не могу (с этими скриптами никогда не работал), ну ничего, с интересом послушаю


Название: Re: QScriptEngine::evaluate(). Эквивалент __LINE__ в контексте скрипта
Отправлено: lesav от Декабрь 31, 2012, 12:22
__LINE__ эквивалента в  JS нет.
Но исполнитель скрипта всегда знает какую он сейчас выполняет функцию скрипта и на каком номере строки он сейчас находиться.

При вызове функции логирования в JS вызывается Q_INVOKABLE функция в C++, в которой уже можно посмотреть в какой функции и номере строки сейчас был вызов.


Код:
QScriptEngine *m_pScriptEngine;
......
void myClass::appendLog(const QString &msg)
{
    // Посмотреть где произошел вызов  appendLog
    QStringList debugJs = m_pScriptEngine->currentContext()->backtrace();
    // Взятьфункцию и номер строки
    ........
    addLog(fnc, line, msg);
}