bool QSEngine::checkSyntax(const QString &code, int checkMode, bool deleteNodes) { return rep->evaluate(code, 0, true, checkMode); #if 0 Q_UNUSED(checkMode); Q_ASSERT(QSLexer::lexer()); #if defined (QT_THREAD_SUPPORT) && QT_VERSION >= 0x030300 QMutexLocker locker(qt_global_mutexpool ? qt_global_mutexpool->get(QSLexer::lexer()) : 0); #endif rep->errType = 0; rep->errLines.clear(); rep->errMsgs.clear(); QSLexer::lexer()->setCode(code, #ifdef QSDEBUGGER rep->sourceId() #else 0 #endif ); int parseError = qsyyparse(); QSNode *lastNode = QSProgramNode::last(); bool success = true; if (parseError) { rep->errType = QSErrParseError; int l = QSLexer::lexer()->lineNo(); rep->errLines.append(l); rep->errMsgs.append(QString::fromLatin1("Parse Error: ") + qs_format_error(QSLexer::lexer()->errorMessage())); success = false; } if (deleteNodes && lastNode && lastNode->deref()) delete lastNode; return success; #endif }
bool QSEngineImp::evaluate( const QString &code, const QSObject *thisV, bool onlyCheckSyntax, int checkMode, int lineZero ) { #if defined (QT_THREAD_SUPPORT) && QT_VERSION >= 0x030300 QMutex *mutex = qt_global_mutexpool ? qt_global_mutexpool->get(qApp) : 0; #endif QS_MUTEX_LOCK; QSProgramNode *progNode = 0; init(); #ifdef QSDEBUGGER incrSourceId(); if (debugger()) debugger()->setSourceId(sid); #endif if (recursion > 7) { qWarning( "QtScript: breaking out of recursion" ); QS_MUTEX_UNLOCK; return true; } assert(QSLexer::lexer()); { QSLexer::lexer()->setCode( code, #ifdef QSDEBUGGER sourceId(), #else 0, #endif lineZero ); int parseError = qsyyparse(); progNode = QSProgramNode::last(); if( parseError || QSLexer::lexer()->lexerState() == QSLexer::Bad ) { errType = QSErrParseError; int l = QSLexer::lexer()->lineNo(); errLines.append( l ); errMsgs.append( QString::fromLatin1("Parse Error: ") + qs_format_error( QSLexer::lexer()->errorMessage() ) ); /* TODO: either clear everything or keep previously parsed function definitions */ // QSNode::deleteAllNodes(); if (progNode && progNode->deref()) { delete progNode; } QS_MUTEX_UNLOCK; return false; } } QSCheckData sem( env(), env()->globalClass() ); if ( thisV ) { Q_ASSERT( thisV->isValid() ); // qDebug( "QSEngineImp::evaluate: entering %s", // thisV->typeName().latin1()); sem.enterClass( (QSClass*)thisV->objectType() ); env()->pushScope( *thisV ); } sem.setGlobalStatementsForbidden( checkMode & QSEngine::DisallowGlobal ); progNode->check( &sem ); if ( sem.hasError() ) { errType = sem.errorCode(); errLines = sem.errorLines(); errMsgs = sem.errorMessages(); if (progNode->deref()) delete progNode; QS_MUTEX_UNLOCK; return FALSE; } if (onlyCheckSyntax) { if (progNode->deref()) { delete progNode; } QS_MUTEX_UNLOCK; return true; } env()->clearException(); recursion++; assert(progNode); QS_MUTEX_UNLOCK; QSObject res = progNode->execute( env() ); QS_MUTEX_LOCK; recursion--; if ( env()->isExceptionMode( )) { QSObject err = env()->exception(); errType = 99; /* TODO */ errLines.append(QSErrorClass::errorLine(&err)); errMsgs.append(QSErrorClass::errorName(&err) + QString::fromLatin1(". ") + QSErrorClass::errorMessage(&err)); #ifdef QSDEBUGGER if (dbg) dbg->setSourceId(QSErrorClass::errorSourceId(&err)); #endif env()->clearException(); } else { errType = 0; errLines.clear(); errMsgs.clear(); // catch return value retVal = res; } if ( thisV ) { env()->popScope(); } if (progNode->deref()) { delete progNode; } QS_MUTEX_UNLOCK; return !errType; }