Ignore:
Timestamp:
Feb 11, 2010, 11:19:06 PM (15 years ago)
Author:
Dmitry A. Kuminov
Message:

trunk: Merged in qt 4.6.1 sources.

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk

  • trunk/src/scripttools/debugging/qscriptdebuggercommandexecutor.cpp

    r2 r561  
    22**
    33** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
    4 ** Contact: Qt Software Information (qt-info@nokia.com)
     4** All rights reserved.
     5** Contact: Nokia Corporation (qt-info@nokia.com)
    56**
    67** This file is part of the QtSCriptTools module of the Qt Toolkit.
     
    2122** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
    2223**
    23 ** In addition, as a special exception, Nokia gives you certain
    24 ** additional rights. These rights are described in the Nokia Qt LGPL
    25 ** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
    26 ** package.
     24** In addition, as a special exception, Nokia gives you certain additional
     25** rights.  These rights are described in the Nokia Qt LGPL Exception
     26** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
    2727**
    2828** GNU General Public License Usage
     
    3434** met: http://www.gnu.org/copyleft/gpl.html.
    3535**
    36 ** If you are unsure which license is appropriate for your use, please
    37 ** contact the sales department at qt-sales@nokia.com.
     36** If you have questions regarding the use of this file, please contact
     37** Nokia at qt-info@nokia.com.
    3838** $QT_END_LICENSE$
    3939**
     
    9999QScriptDebuggerCommandExecutor::~QScriptDebuggerCommandExecutor()
    100100{
    101     delete d_ptr;
     101}
     102
     103static bool isPrefixOf(const QString &prefix, const QString &what)
     104{
     105    return ((what.length() > prefix.length())
     106            && what.startsWith(prefix));
    102107}
    103108
     
    106111*/
    107112QScriptDebuggerResponse QScriptDebuggerCommandExecutor::execute(
    108         QScriptDebuggerBackend *backend,
    109         const QScriptDebuggerCommand &command)
     113    QScriptDebuggerBackend *backend,
     114    const QScriptDebuggerCommand &command)
    110115{
    111116    QScriptDebuggerResponse response;
     
    288293        if (ctx) {
    289294            QScriptDebuggerValueList dest;
    290 #if QT_VERSION >= 0x040500
    291295            QScriptValueList src = ctx->scopeChain();
    292296            for (int i = 0; i < src.size(); ++i)
    293297                dest.append(src.at(i));
    294 #else
    295             dest.append(ctx->activationObject());
    296 #endif
    297298            response.setResult(dest);
    298299        } else {
     
    303304    case QScriptDebuggerCommand::ContextsCheckpoint: {
    304305        response.setResult(qVariantFromValue(backend->contextsCheckpoint()));
     306    }   break;
     307
     308    case QScriptDebuggerCommand::GetPropertyExpressionValue: {
     309        QScriptContext *ctx = backend->context(command.contextIndex());
     310        int lineNumber = command.lineNumber();
     311        QVariant attr = command.attribute(QScriptDebuggerCommand::UserAttribute);
     312        QStringList path = attr.toStringList();
     313        if (!ctx || path.isEmpty())
     314            break;
     315        QScriptContextInfo ctxInfo(ctx);
     316        if (ctx->callee().isValid()
     317            && ((lineNumber < ctxInfo.functionStartLineNumber())
     318                || (lineNumber > ctxInfo.functionEndLineNumber()))) {
     319            break;
     320        }
     321        QScriptValueList objects;
     322        int pathIndex = 0;
     323        if (path.at(0) == QLatin1String("this")) {
     324            objects.append(ctx->thisObject());
     325            ++pathIndex;
     326        } else {
     327            objects << ctx->scopeChain();
     328        }
     329        for (int i = 0; i < objects.size(); ++i) {
     330            QScriptValue val = objects.at(i);
     331            for (int j = pathIndex; val.isValid() && (j < path.size()); ++j) {
     332                val = val.property(path.at(j));
     333            }
     334            if (val.isValid()) {
     335                bool hadException = (ctx->state() == QScriptContext::ExceptionState);
     336                QString str = val.toString();
     337                if (!hadException && backend->engine()->hasUncaughtException())
     338                    backend->engine()->clearExceptions();
     339                response.setResult(str);
     340                break;
     341            }
     342        }
     343    }   break;
     344
     345    case QScriptDebuggerCommand::GetCompletions: {
     346        QScriptContext *ctx = backend->context(command.contextIndex());
     347        QVariant attr = command.attribute(QScriptDebuggerCommand::UserAttribute);
     348        QStringList path = attr.toStringList();
     349        if (!ctx || path.isEmpty())
     350            break;
     351        QScriptValueList objects;
     352        QString prefix = path.last();
     353        QSet<QString> matches;
     354        if (path.size() > 1) {
     355            const QString &topLevelIdent = path.at(0);
     356            QScriptValue obj;
     357            if (topLevelIdent == QLatin1String("this")) {
     358                obj = ctx->thisObject();
     359            } else {
     360                QScriptValueList scopeChain;
     361                scopeChain = ctx->scopeChain();
     362                for (int i = 0; i < scopeChain.size(); ++i) {
     363                    QScriptValue oo = scopeChain.at(i).property(topLevelIdent);
     364                    if (oo.isObject()) {
     365                        obj = oo;
     366                        break;
     367                    }
     368                }
     369            }
     370            for (int i = 1; obj.isObject() && (i < path.size()-1); ++i)
     371                obj = obj.property(path.at(i));
     372            if (obj.isValid())
     373                objects.append(obj);
     374        } else {
     375            objects << ctx->scopeChain();
     376            QStringList keywords;
     377            keywords.append(QString::fromLatin1("this"));
     378            keywords.append(QString::fromLatin1("true"));
     379            keywords.append(QString::fromLatin1("false"));
     380            keywords.append(QString::fromLatin1("null"));
     381            for (int i = 0; i < keywords.size(); ++i) {
     382                const QString &kwd = keywords.at(i);
     383                if (isPrefixOf(prefix, kwd))
     384                    matches.insert(kwd);
     385            }
     386        }
     387
     388        for (int i = 0; i < objects.size(); ++i) {
     389            QScriptValue obj = objects.at(i);
     390            while (obj.isObject()) {
     391                QScriptValueIterator it(obj);
     392                while (it.hasNext()) {
     393                    it.next();
     394                    QString propertyName = it.name();
     395                    if (isPrefixOf(prefix, propertyName))
     396                        matches.insert(propertyName);
     397                }
     398                obj = obj.prototype();
     399            }
     400        }
     401        QStringList matchesList = matches.toList();
     402        qStableSort(matchesList);
     403        response.setResult(matchesList);
    305404    }   break;
    306405
Note: See TracChangeset for help on using the changeset viewer.