Changeset 769 for trunk/src/script/api


Ignore:
Timestamp:
Aug 2, 2010, 9:27:30 PM (15 years ago)
Author:
Dmitry A. Kuminov
Message:

trunk: Merged in qt 4.6.3 sources from branches/vendor/nokia/qt.

Location:
trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk

  • trunk/src/script/api/qscriptengine.cpp

    r651 r769  
    4242#include <QtCore/qmetaobject.h>
    4343
     44#include "CodeBlock.h"
    4445#include "Error.h"
    4546#include "JSArray.h"
     
    663664            encoding = QCoreApplication::UnicodeUTF8;
    664665        else
    665             return JSC::throwError(exec, JSC::GeneralError, QString::fromLatin1("qsTranslate(): invalid encoding '%s'").arg(encStr));
     666            return JSC::throwError(exec, JSC::GeneralError, QString::fromLatin1("qsTranslate(): invalid encoding '%0'").arg(encStr));
    666667    }
    667668    int n = -1;
     
    697698        return JSC::throwError(exec, JSC::GeneralError, "qsTr(): second argument (comment) must be a string");
    698699    if ((args.size() > 2) && !args.at(2).isNumber())
    699         return JSC::throwError(exec, JSC::GeneralError, "qsTranslate(): third argument (n) must be a number");
     700        return JSC::throwError(exec, JSC::GeneralError, "qsTr(): third argument (n) must be a number");
    700701#ifndef QT_NO_QOBJECT
    701702    QString context;
    702     QScriptContext *ctx = QScriptEnginePrivate::contextForFrame(exec);
    703     if (ctx && ctx->parentContext())
    704         context = QFileInfo(QScriptContextInfo(ctx->parentContext()).fileName()).baseName();
     703    // The first non-empty source URL in the call stack determines the translation context.
     704    {
     705        JSC::ExecState *frame = exec->removeHostCallFrameFlag();
     706        while (frame) {
     707            if (frame->codeBlock() && frame->codeBlock()->source()
     708                && !frame->codeBlock()->source()->url().isEmpty()) {
     709                context = QFileInfo(frame->codeBlock()->source()->url()).baseName();
     710                break;
     711            }
     712            frame = frame->callerFrame()->removeHostCallFrameFlag();
     713        }
     714    }
    705715#endif
    706716    QString text(args.at(0).toString(exec));
     
    769779
    770780QScriptEnginePrivate::QScriptEnginePrivate()
    771     : registeredScriptValues(0), freeScriptValues(0),
     781    : registeredScriptValues(0), freeScriptValues(0), freeScriptValuesCount(0),
    772782      registeredScriptStrings(0), inEval(false)
    773783{
     
    10081018        return;
    10091019    QScript::GlobalObject *glob = static_cast<QScript::GlobalObject*>(originalGlobalObject());
    1010     if (object == originalGlobalObjectProxy)
     1020    if (object == originalGlobalObjectProxy) {
    10111021        glob->customGlobalObject = 0;
    1012     else {
     1022        // Sync the internal prototype, since JSObject::prototype() is not virtual.
     1023        glob->setPrototype(originalGlobalObjectProxy->prototype());
     1024    } else {
    10131025        Q_ASSERT(object != originalGlobalObject());
    10141026        glob->customGlobalObject = object;
     1027        // Sync the internal prototype, since JSObject::prototype() is not virtual.
     1028        glob->setPrototype(object->prototype());
    10151029    }
    10161030}
     
    15901604#ifndef QT_NO_REGEXP
    15911605
    1592 extern QString qt_regexp_toCanonical(const QString &, QRegExp::PatternSyntax);
     1606Q_DECL_IMPORT extern QString qt_regexp_toCanonical(const QString &, QRegExp::PatternSyntax);
    15931607
    15941608/*!
     
    29222936    JSC::JSGlobalObject *glob = d->originalGlobalObject();
    29232937    if (!jscObject || !jscObject.isObject())
    2924         jscObject = glob;
     2938        jscObject = d->globalObject();
    29252939//    unsigned attribs = JSC::DontEnum;
    29262940    JSC::asObject(jscObject)->putDirectFunction(exec, new (exec)JSC::NativeFunctionWrapper(exec, glob->prototypeFunctionStructure(), 5, JSC::Identifier(exec, "qsTranslate"), QScript::functionQsTranslate));
    29272941    JSC::asObject(jscObject)->putDirectFunction(exec, new (exec)JSC::NativeFunctionWrapper(exec, glob->prototypeFunctionStructure(), 2, JSC::Identifier(exec, "QT_TRANSLATE_NOOP"), QScript::functionQsTranslateNoOp));
    2928     JSC::asObject(jscObject)->putDirectFunction(exec, new (exec)JSC::NativeFunctionWrapper(exec, glob->prototypeFunctionStructure(), 3, JSC::Identifier(exec, "qsTr"), QScript::functionQsTr));
     2942    JSC::asObject(jscObject)->putDirectFunction(exec, new (exec)JSC::PrototypeFunction(exec, glob->prototypeFunctionStructure(), 3, JSC::Identifier(exec, "qsTr"), QScript::functionQsTr));
    29292943    JSC::asObject(jscObject)->putDirectFunction(exec, new (exec)JSC::NativeFunctionWrapper(exec, glob->prototypeFunctionStructure(), 1, JSC::Identifier(exec, "QT_TR_NOOP"), QScript::functionQsTrNoOp));
    29302944
  • trunk/src/script/api/qscriptengine_p.h

    r651 r769  
    256256    QScriptValuePrivate *registeredScriptValues;
    257257    QScriptValuePrivate *freeScriptValues;
     258    static const int maxFreeScriptValues = 256;
     259    int freeScriptValuesCount;
    258260    QScriptStringPrivate *registeredScriptStrings;
    259261    QHash<int, QScriptTypeInfo*> m_typeInfos;
     
    378380        QScriptValuePrivate *p = freeScriptValues;
    379381        freeScriptValues = p->next;
     382        --freeScriptValuesCount;
    380383        return p;
    381384    }
     
    385388inline void QScriptEnginePrivate::freeScriptValuePrivate(QScriptValuePrivate *p)
    386389{
    387     p->next = freeScriptValues;
    388     freeScriptValues = p;
     390    if (freeScriptValuesCount < maxFreeScriptValues) {
     391        p->next = freeScriptValues;
     392        freeScriptValues = p;
     393        ++freeScriptValuesCount;
     394    } else {
     395        qFree(p);
     396    }
    389397}
    390398
  • trunk/src/script/api/qscriptvalue.cpp

    r651 r769  
    793793        return;
    794794    }
     795    JSC::JSObject *thisObject = JSC::asObject(d->jscValue);
    795796    JSC::JSValue other = d->engine->scriptValueToJSCValue(prototype);
    796797
     
    799800    while (nextPrototypeValue && nextPrototypeValue.isObject()) {
    800801        JSC::JSObject *nextPrototype = JSC::asObject(nextPrototypeValue);
    801         if (nextPrototype == JSC::asObject(d->jscValue)) {
     802        if (nextPrototype == thisObject) {
    802803            qWarning("QScriptValue::setPrototype() failed: cyclic prototype value");
    803804            return;
     
    805806        nextPrototypeValue = nextPrototype->prototype();
    806807    }
    807     JSC::asObject(d->jscValue)->setPrototype(other);
     808
     809    thisObject->setPrototype(other);
     810
     811    // Sync the internal Global Object prototype if appropriate.
     812    if (((thisObject == d->engine->originalGlobalObjectProxy)
     813         && !d->engine->customGlobalObject())
     814        || (thisObject == d->engine->customGlobalObject())) {
     815        d->engine->originalGlobalObject()->setPrototype(other);
     816    }
    808817}
    809818
     
    11491158
    11501159    if (d->type != other.d_ptr->type) {
    1151         if (d->type == QScriptValuePrivate::JavaScriptCore)
    1152             return JSC::JSValue::strictEqual(d->jscValue, d->engine->scriptValueToJSCValue(other));
    1153         else if (other.d_ptr->type == QScriptValuePrivate::JavaScriptCore)
    1154             return JSC::JSValue::strictEqual(other.d_ptr->engine->scriptValueToJSCValue(*this), other.d_ptr->jscValue);
     1160        if (d->type == QScriptValuePrivate::JavaScriptCore) {
     1161            QScriptEnginePrivate *eng_p = d->engine ? d->engine : other.d_ptr->engine;
     1162            if (eng_p)
     1163                return JSC::JSValue::strictEqual(d->jscValue, eng_p->scriptValueToJSCValue(other));
     1164        } else if (other.d_ptr->type == QScriptValuePrivate::JavaScriptCore) {
     1165            QScriptEnginePrivate *eng_p = other.d_ptr->engine ? other.d_ptr->engine : d->engine;
     1166            if (eng_p)
     1167                return JSC::JSValue::strictEqual(eng_p->scriptValueToJSCValue(*this), other.d_ptr->jscValue);
     1168        }
    11551169
    11561170        return false;
     
    19421956    if (!array.isUndefinedOrNull()) {
    19431957        if (!array.isObject()) {
    1944             return d->engine->scriptValueFromJSCValue(JSC::throwError(exec, JSC::TypeError));
     1958            return d->engine->scriptValueFromJSCValue(JSC::throwError(exec, JSC::TypeError, "Arguments must be an array"));
    19451959        }
    19461960        if (JSC::asObject(array)->classInfo() == &JSC::Arguments::info)
     
    19531967                applyArgs.append(JSC::asArray(array)->get(exec, i));
    19541968        } else {
    1955             Q_ASSERT_X(false, Q_FUNC_INFO, "implement me");
    1956 //            return JSC::throwError(exec, JSC::TypeError);
     1969            return d->engine->scriptValueFromJSCValue(JSC::throwError(exec, JSC::TypeError, "Arguments must be an array"));
    19571970        }
    19581971    }
Note: See TracChangeset for help on using the changeset viewer.