Ignore:
Timestamp:
May 5, 2011, 5:36:53 AM (14 years ago)
Author:
Dmitry A. Kuminov
Message:

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

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk

  • trunk/src/script/api/qscriptengine_p.h

    r769 r846  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
     
    3838#include "private/qobject_p.h"
    3939
     40#include <QtCore/qdatetime.h>
    4041#include <QtCore/qhash.h>
     42#include <QtCore/qnumeric.h>
     43#include <QtCore/qregexp.h>
    4144#include <QtCore/qset.h>
    4245#include "qscriptvalue_p.h"
    4346#include "qscriptstring_p.h"
    44 
     47#include "bridge/qscriptclassobject_p.h"
     48#include "bridge/qscriptdeclarativeclass_p.h"
     49#include "bridge/qscriptdeclarativeobject_p.h"
     50#include "bridge/qscriptobject_p.h"
     51#include "bridge/qscriptqobject_p.h"
     52#include "bridge/qscriptvariant_p.h"
     53
     54#include "DateConstructor.h"
     55#include "DateInstance.h"
    4556#include "Debugger.h"
     57#include "ErrorInstance.h"
     58#include "JSArray.h"
     59#include "Executable.h"
    4660#include "Lexer.h"
    4761#include "RefPtr.h"
     62#include "RegExpConstructor.h"
     63#include "RegExpObject.h"
    4864#include "SourceProvider.h"
    4965#include "Structure.h"
     66#include "UString.h"
    5067#include "JSGlobalObject.h"
    5168#include "JSValue.h"
     
    5875    class JSCell;
    5976    class JSGlobalObject;
    60     class UString;
    6177}
    6278
     
    7389class QScriptSyntaxCheckResult;
    7490class QScriptEngine;
     91class QScriptProgramPrivate;
    7592
    7693namespace QScript
     
    84101    class TimeoutCheckerProxy;
    85102
     103    qint32 ToInt32(qsreal);
     104    quint32 ToUInt32(qsreal);
     105    quint16 ToUInt16(qsreal);
     106    qsreal ToInteger(qsreal);
     107
     108    inline bool ToBool(qsreal);
     109    inline bool ToBool(const QString &);
     110    inline qint32 ToInt32(const QString &);
     111    inline quint32 ToUInt32(const QString &);
     112    inline quint16 ToUInt16(const QString &);
     113    inline qsreal ToInteger(const QString &);
     114#ifdef Q_CC_MSVC
     115    // MSVC2008 crashes if these are inlined.
     116    qsreal ToNumber(const QString &);
     117    QString ToString(qsreal);
     118#else
     119    inline qsreal ToNumber(const QString &);
     120    inline QString ToString(qsreal);
     121#endif
     122
     123    QDateTime MsToDateTime(JSC::ExecState *, qsreal);
     124    qsreal DateTimeToMs(JSC::ExecState *, const QDateTime &);
     125
    86126    //some conversion helper functions
    87127    inline QScriptEnginePrivate *scriptEngineFromExec(const JSC::ExecState *exec);
    88128    bool isFunction(JSC::JSValue value);
     129
     130    inline void convertToLatin1_helper(const UChar *i, int length, char *s);
     131    inline QByteArray convertToLatin1(const JSC::UString &str);
    89132
    90133    class UStringSourceProviderWithFeedback;
     
    115158    static QScriptEngine *get(QScriptEnginePrivate *d) { return d ? d->q_func() : 0; }
    116159
    117     static bool convert(const QScriptValue &value,
    118                         int type, void *ptr,
    119                         QScriptEnginePrivate *eng);
    120     QScriptValue create(int type, const void *ptr);
     160    static inline bool isArray(JSC::JSValue);
     161    static inline bool isDate(JSC::JSValue);
     162    static inline bool isError(JSC::JSValue);
     163    static inline bool isObject(JSC::JSValue);
     164    static inline bool isRegExp(JSC::JSValue);
     165    static inline bool isVariant(JSC::JSValue);
     166    static inline bool isQObject(JSC::JSValue);
     167    static inline bool isQMetaObject(JSC::JSValue);
     168
     169    static inline bool toBool(JSC::ExecState *, JSC::JSValue);
     170    static inline qsreal toInteger(JSC::ExecState *, JSC::JSValue);
     171    static inline qsreal toNumber(JSC::ExecState *, JSC::JSValue);
     172    static inline qint32 toInt32(JSC::ExecState *, JSC::JSValue);
     173    static inline quint32 toUInt32(JSC::ExecState *, JSC::JSValue);
     174    static inline quint16 toUInt16(JSC::ExecState *, JSC::JSValue);
     175    static inline JSC::UString toString(JSC::ExecState *, JSC::JSValue);
     176
     177    static inline QDateTime toDateTime(JSC::ExecState *, JSC::JSValue);
     178#ifndef QT_NO_REGEXP
     179    static QRegExp toRegExp(JSC::ExecState*, JSC::JSValue);
     180#endif
     181    static QVariant toVariant(JSC::ExecState *, JSC::JSValue);
     182    static inline QObject *toQObject(JSC::ExecState *, JSC::JSValue);
     183    static inline const QMetaObject *toQMetaObject(JSC::ExecState *, JSC::JSValue);
     184
     185    static inline JSC::JSValue property(JSC::ExecState*, JSC::JSValue, const JSC::Identifier &id,
     186                                 int resolveMode = QScriptValue::ResolvePrototype);
     187    static JSC::JSValue propertyHelper(JSC::ExecState*, JSC::JSValue, const JSC::Identifier &id, int resolveMode);
     188    static inline JSC::JSValue property(JSC::ExecState*, JSC::JSValue, quint32 index,
     189                                 int resolveMode = QScriptValue::ResolvePrototype);
     190    static JSC::JSValue propertyHelper(JSC::ExecState*, JSC::JSValue, quint32, int resolveMode);
     191    static inline JSC::JSValue property(JSC::ExecState*, JSC::JSValue, const JSC::UString &, int resolveMode);
     192    static inline void setProperty(JSC::ExecState*, JSC::JSValue object, const JSC::UString &name, JSC::JSValue,
     193                     const QScriptValue::PropertyFlags &flags = QScriptValue::KeepExistingFlags);
     194    static void setProperty(JSC::ExecState*, JSC::JSValue object, const JSC::Identifier &id, JSC::JSValue,
     195                     const QScriptValue::PropertyFlags &flags = QScriptValue::KeepExistingFlags);
     196    static void setProperty(JSC::ExecState*, JSC::JSValue object, quint32 index, JSC::JSValue,
     197                     const QScriptValue::PropertyFlags &flags = QScriptValue::KeepExistingFlags);
     198    static QScriptValue::PropertyFlags propertyFlags(JSC::ExecState*, JSC::JSValue value,
     199                                              const JSC::Identifier &id, const QScriptValue::ResolveFlags &mode);
     200    static inline QScriptValue::PropertyFlags propertyFlags(JSC::ExecState*, JSC::JSValue value,
     201                                              const JSC::UString &name, const QScriptValue::ResolveFlags &mode);
     202
     203    static bool convertValue(JSC::ExecState*, JSC::JSValue value,
     204                             int type, void *ptr);
     205    static bool convertNumber(qsreal, int type, void *ptr);
     206    static bool convertString(const QString &, int type, void *ptr);
     207    static JSC::JSValue create(JSC::ExecState*, int type, const void *ptr);
    121208    bool hasDemarshalFunction(int type) const;
    122209
    123210    inline QScriptValue scriptValueFromJSCValue(JSC::JSValue value);
    124211    inline JSC::JSValue scriptValueToJSCValue(const QScriptValue &value);
    125 
    126     QScriptValue scriptValueFromVariant(const QVariant &value);
    127     QVariant scriptValueToVariant(const QScriptValue &value, int targetType);
    128 
    129     JSC::JSValue jscValueFromVariant(const QVariant &value);
    130     QVariant jscValueToVariant(JSC::JSValue value, int targetType);
    131 
    132     QScriptValue arrayFromStringList(const QStringList &lst);
    133     static QStringList stringListFromArray(const QScriptValue &arr);
    134 
    135     QScriptValue arrayFromVariantList(const QVariantList &lst);
    136     static QVariantList variantListFromArray(const QScriptValue &arr);
    137 
    138     QScriptValue objectFromVariantMap(const QVariantMap &vmap);
    139     static QVariantMap variantMapFromObject(const QScriptValue &obj);
     212    static inline unsigned propertyFlagsToJSCAttributes(const QScriptValue::PropertyFlags &flags);
     213
     214    static inline JSC::JSValue jscValueFromVariant(JSC::ExecState*, const QVariant &value);
     215    static QVariant jscValueToVariant(JSC::ExecState*, JSC::JSValue value, int targetType);
     216    static inline QVariant &variantValue(JSC::JSValue value);
     217    static inline void setVariantValue(JSC::JSValue objectValue, const QVariant &value);
     218
     219    static JSC::JSValue arrayFromStringList(JSC::ExecState*, const QStringList &lst);
     220    static QStringList stringListFromArray(JSC::ExecState*, JSC::JSValue arr);
     221
     222    static JSC::JSValue arrayFromVariantList(JSC::ExecState*, const QVariantList &lst);
     223    static QVariantList variantListFromArray(JSC::ExecState*, JSC::JSArray *arr);
     224
     225    static JSC::JSValue objectFromVariantMap(JSC::ExecState*, const QVariantMap &vmap);
     226    static QVariantMap variantMapFromObject(JSC::ExecState*, JSC::JSObject *obj);
    140227
    141228    JSC::JSValue defaultPrototype(int metaTypeId) const;
     
    145232    static inline JSC::ExecState *frameForContext(QScriptContext *context);
    146233    static inline const JSC::ExecState *frameForContext(const QScriptContext *context);
     234
     235    static inline bool hasValidCodeBlockRegister(JSC::ExecState *frame);
    147236
    148237    JSC::JSGlobalObject *originalGlobalObject() const;
     
    163252    bool isCollecting() const;
    164253    void collectGarbage();
     254    void reportAdditionalMemoryCost(int size);
    165255
    166256    //flags that we set on the return value register for native function. (ie when codeBlock is 0)
     
    178268    void agentDeleted(QScriptEngineAgent *agent);
    179269
     270    static inline void saveException(JSC::ExecState *, JSC::JSValue *);
     271    static inline void restoreException(JSC::ExecState *, JSC::JSValue);
     272
    180273    void setCurrentException(QScriptValue exception) { m_currentException = exception; }
    181274    QScriptValue currentException() const { return m_currentException; }
    182275    void clearCurrentException() { m_currentException.d_ptr.reset(); }
     276
     277    static QScriptSyntaxCheckResult checkSyntax(const QString &program);
     278    static bool canEvaluate(const QString &program);
     279
     280    inline void registerScriptProgram(QScriptProgramPrivate *program);
     281    inline void unregisterScriptProgram(QScriptProgramPrivate *program);
     282    void detachAllRegisteredScriptPrograms();
     283
     284    inline QScriptValuePrivate *allocateScriptValuePrivate(size_t);
     285    inline void freeScriptValuePrivate(QScriptValuePrivate *p);
     286
     287    inline void registerScriptValue(QScriptValuePrivate *value);
     288    inline void unregisterScriptValue(QScriptValuePrivate *value);
     289    void detachAllRegisteredScriptValues();
     290
     291    inline void registerScriptString(QScriptStringPrivate *value);
     292    inline void unregisterScriptString(QScriptStringPrivate *value);
     293    void detachAllRegisteredScriptStrings();
     294    QScriptString toStringHandle(const JSC::Identifier &name);
     295
     296    static inline JSC::JSValue newArray(JSC::ExecState *, uint length);
     297    static inline JSC::JSValue newDate(JSC::ExecState *, qsreal value);
     298    static inline JSC::JSValue newDate(JSC::ExecState *, const QDateTime &);
     299    inline JSC::JSValue newObject();
     300
     301#ifndef QT_NO_REGEXP
     302    static JSC::JSValue newRegExp(JSC::ExecState *, const QRegExp &);
     303#endif
     304
     305    static JSC::JSValue newRegExp(JSC::ExecState *, const QString &pattern, const QString &flags);
     306    JSC::JSValue newVariant(const QVariant &);
     307    JSC::JSValue newVariant(JSC::JSValue objectValue, const QVariant &);
     308
     309    static inline QScriptDeclarativeClass *declarativeClass(JSC::JSValue);
     310    static inline QScriptDeclarativeClass::Object *declarativeObject(JSC::JSValue);
     311
     312    JSC::UString translationContextFromUrl(const JSC::UString &);
    183313
    184314#ifndef QT_NO_QOBJECT
     
    189319                                JSC::JSValue ctor);
    190320
    191     static QScriptSyntaxCheckResult checkSyntax(const QString &program);
    192     static bool canEvaluate(const QString &program);
    193     static bool convertToNativeQObject(const QScriptValue &value,
     321    static bool convertToNativeQObject(JSC::ExecState*, JSC::JSValue,
    194322                                       const QByteArray &targetType,
    195323                                       void **result);
     
    221349                          JSC::JSValue function);
    222350
    223     inline QScriptValuePrivate *allocateScriptValuePrivate(size_t);
    224     inline void freeScriptValuePrivate(QScriptValuePrivate *p);
    225 
    226     inline void registerScriptValue(QScriptValuePrivate *value);
    227     inline void unregisterScriptValue(QScriptValuePrivate *value);
    228     void detachAllRegisteredScriptValues();
    229 
    230     inline void registerScriptString(QScriptStringPrivate *value);
    231     inline void unregisterScriptString(QScriptStringPrivate *value);
    232     void detachAllRegisteredScriptStrings();
    233 
    234351    // private slots
    235352    void _q_objectDestroyed(QObject *);
     
    241358
    242359    WTF::RefPtr<JSC::Structure> scriptObjectStructure;
     360    WTF::RefPtr<JSC::Structure> staticScopeObjectStructure;
    243361
    244362    QScript::QObjectPrototype *qobjectPrototype;
     
    259377    int freeScriptValuesCount;
    260378    QScriptStringPrivate *registeredScriptStrings;
     379    QSet<QScriptProgramPrivate*> registeredScriptPrograms;
    261380    QHash<int, QScriptTypeInfo*> m_typeInfos;
    262381    int processEventsInterval;
    263382    QScriptValue abortResult;
    264383    bool inEval;
     384
     385    JSC::UString cachedTranslationUrl;
     386    JSC::UString cachedTranslationContext;
    265387
    266388    QSet<QString> importedExtensions;
     
    270392    QScriptValue m_currentException;
    271393
     394    QSet<JSC::JSObject*> visitedConversionObjects;
     395
    272396#ifndef QT_NO_QOBJECT
    273397    QHash<QObject*, QScript::QObjectData*> m_qobjectData;
     
    281405namespace QScript
    282406{
     407
     408class APIShim
     409{
     410public:
     411    APIShim(QScriptEnginePrivate *engine)
     412        : m_engine(engine), m_oldTable(JSC::setCurrentIdentifierTable(engine->globalData->identifierTable))
     413    {
     414    }
     415    ~APIShim()
     416    {
     417        JSC::setCurrentIdentifierTable(m_oldTable);
     418    }
     419
     420private:
     421    QScriptEnginePrivate *m_engine;
     422    JSC::IdentifierTable *m_oldTable;
     423};
    283424
    284425/*Helper class. Main purpose is to give debugger feedback about unloading and loading scripts.
     
    373514}
    374515
     516#ifndef Q_CC_MSVC
     517// MSVC2008 crashes if these are inlined.
     518
     519inline QString ToString(qsreal value)
     520{
     521    return JSC::UString::from(value);
     522}
     523
     524inline qsreal ToNumber(const QString &value)
     525{
     526    return ((JSC::UString)value).toDouble();
     527}
     528
     529#endif
     530
     531inline qint32 ToInt32(const QString &value)
     532{
     533    return ToInt32(ToNumber(value));
     534}
     535
     536inline quint32 ToUInt32(const QString &value)
     537{
     538    return ToUInt32(ToNumber(value));
     539}
     540
     541inline quint16 ToUInt16(const QString &value)
     542{
     543    return ToUInt16(ToNumber(value));
     544}
     545
     546inline qsreal ToInteger(const QString &value)
     547{
     548    return ToInteger(ToNumber(value));
     549}
     550
     551inline bool ToBool(qsreal value)
     552{
     553    return (value != 0) && !qIsNaN(value);
     554}
     555
     556inline bool ToBool(const QString &value)
     557{
     558     return !value.isEmpty();
     559}
     560
     561inline void convertToLatin1_helper(const UChar *i, int length, char *s)
     562{
     563    const UChar *e = i + length;
     564    while (i != e)
     565        *(s++) = (uchar) *(i++);
     566    *s = '\0';
     567}
     568
     569inline QByteArray convertToLatin1(const JSC::UString &str)
     570{
     571    QByteArray ba(str.size(), Qt::Uninitialized);
     572    convertToLatin1_helper(str.data(), str.size(), ba.data());
     573    return ba;
     574}
     575
    375576} // namespace QScript
     577
     578inline void QScriptEnginePrivate::registerScriptProgram(QScriptProgramPrivate *program)
     579{
     580    Q_ASSERT(!registeredScriptPrograms.contains(program));
     581    registeredScriptPrograms.insert(program);
     582}
     583
     584inline void QScriptEnginePrivate::unregisterScriptProgram(QScriptProgramPrivate *program)
     585{
     586    Q_ASSERT(registeredScriptPrograms.contains(program));
     587    registeredScriptPrograms.remove(program);
     588}
    376589
    377590inline QScriptValuePrivate *QScriptEnginePrivate::allocateScriptValuePrivate(size_t size)
     
    416629    value->prev = 0;
    417630    value->next = 0;
     631}
     632
     633inline JSC::JSValue QScriptEnginePrivate::jscValueFromVariant(JSC::ExecState *exec, const QVariant &v)
     634{
     635    JSC::JSValue result = create(exec, v.userType(), v.data());
     636    Q_ASSERT(result);
     637    return result;
    418638}
    419639
     
    445665}
    446666
     667inline unsigned QScriptEnginePrivate::propertyFlagsToJSCAttributes(const QScriptValue::PropertyFlags &flags)
     668{
     669    unsigned attribs = 0;
     670    if (flags & QScriptValue::ReadOnly)
     671        attribs |= JSC::ReadOnly;
     672    if (flags & QScriptValue::SkipInEnumeration)
     673        attribs |= JSC::DontEnum;
     674    if (flags & QScriptValue::Undeletable)
     675        attribs |= JSC::DontDelete;
     676    attribs |= flags & QScriptValue::UserRange;
     677    return attribs;
     678}
     679
    447680inline QScriptValuePrivate::~QScriptValuePrivate()
    448681{
     
    479712}
    480713
    481 inline QScriptValue QScriptValuePrivate::property(const QString &name, int resolveMode) const
    482 {
    483     JSC::ExecState *exec = engine->currentFrame;
    484     return property(JSC::Identifier(exec, name), resolveMode);
    485 }
    486 
    487 inline QScriptValue QScriptValuePrivate::property(const JSC::Identifier &id, int resolveMode) const
    488 {
    489     Q_ASSERT(isObject());
    490     JSC::ExecState *exec = engine->currentFrame;
    491     JSC::JSObject *object = JSC::asObject(jscValue);
     714inline JSC::JSValue QScriptEnginePrivate::property(JSC::ExecState *exec, JSC::JSValue value, const JSC::UString &name, int resolveMode)
     715{
     716    return property(exec, value, JSC::Identifier(exec, name), resolveMode);
     717}
     718
     719inline JSC::JSValue QScriptEnginePrivate::property(JSC::ExecState *exec, JSC::JSValue value, const JSC::Identifier &id, int resolveMode)
     720{
     721    Q_ASSERT(isObject(value));
     722    JSC::JSObject *object = JSC::asObject(value);
    492723    JSC::PropertySlot slot(object);
    493724    if ((resolveMode & QScriptValue::ResolvePrototype) && object->getPropertySlot(exec, id, slot))
    494         return engine->scriptValueFromJSCValue(slot.getValue(exec, id));
    495     return propertyHelper(id, resolveMode);
    496 }
    497 
    498 inline QScriptValue QScriptValuePrivate::property(quint32 index, int resolveMode) const
    499 {
    500     Q_ASSERT(isObject());
    501     JSC::ExecState *exec = engine->currentFrame;
    502     JSC::JSObject *object = JSC::asObject(jscValue);
     725        return slot.getValue(exec, id);
     726    return propertyHelper(exec, value, id, resolveMode);
     727}
     728
     729inline JSC::JSValue QScriptEnginePrivate::property(JSC::ExecState *exec, JSC::JSValue value, quint32 index, int resolveMode)
     730{
     731    Q_ASSERT(isObject(value));
     732    JSC::JSObject *object = JSC::asObject(value);
    503733    JSC::PropertySlot slot(object);
    504734    if ((resolveMode & QScriptValue::ResolvePrototype) && object->getPropertySlot(exec, index, slot))
    505         return engine->scriptValueFromJSCValue(slot.getValue(exec, index));
    506     return propertyHelper(index, resolveMode);
     735        return slot.getValue(exec, index);
     736    return propertyHelper(exec, value, index, resolveMode);
     737}
     738
     739inline QScriptValue::PropertyFlags QScriptEnginePrivate::propertyFlags(JSC::ExecState *exec, JSC::JSValue value,
     740                                                                       const JSC::UString &name,
     741                                                                       const QScriptValue::ResolveFlags &mode)
     742{
     743    return propertyFlags(exec, value, JSC::Identifier(exec, name), mode);
     744}
     745
     746inline void QScriptEnginePrivate::setProperty(JSC::ExecState *exec, JSC::JSValue objectValue, const JSC::UString &name,
     747                                              JSC::JSValue value, const QScriptValue::PropertyFlags &flags)
     748{
     749    setProperty(exec, objectValue, JSC::Identifier(exec, name), value, flags);
     750}
     751
     752inline JSC::JSValue QScriptValuePrivate::property(const JSC::Identifier &id, const QScriptValue::ResolveFlags &resolveMode) const
     753{
     754    return QScriptEnginePrivate::property(engine->currentFrame, jscValue, id, resolveMode);
     755}
     756
     757inline JSC::JSValue QScriptValuePrivate::property(quint32 index, const QScriptValue::ResolveFlags &resolveMode) const
     758{
     759    return QScriptEnginePrivate::property(engine->currentFrame, jscValue, index, resolveMode);
     760}
     761
     762inline JSC::JSValue QScriptValuePrivate::property(const JSC::UString &name, const QScriptValue::ResolveFlags &resolveMode) const
     763{
     764    JSC::ExecState *exec = engine->currentFrame;
     765    return QScriptEnginePrivate::property(exec, jscValue, JSC::Identifier(exec, name), resolveMode);
     766}
     767
     768inline QScriptValue::PropertyFlags QScriptValuePrivate::propertyFlags(
     769        const JSC::Identifier &id, const QScriptValue::ResolveFlags &mode) const
     770{
     771    return QScriptEnginePrivate::propertyFlags(engine->currentFrame, jscValue, id, mode);
     772}
     773
     774inline void QScriptValuePrivate::setProperty(const JSC::Identifier &id, const JSC::JSValue &value,
     775                                             const QScriptValue::PropertyFlags &flags)
     776{
     777    QScriptEnginePrivate::setProperty(engine->currentFrame, jscValue, id, value, flags);
     778}
     779
     780inline void QScriptValuePrivate::setProperty(quint32 index, const JSC::JSValue &value,
     781                                             const QScriptValue::PropertyFlags &flags)
     782{
     783    QScriptEnginePrivate::setProperty(engine->currentFrame, jscValue, index, value, flags);
     784}
     785
     786inline void QScriptValuePrivate::setProperty(const JSC::UString &name, const JSC::JSValue &value,
     787                                             const QScriptValue::PropertyFlags &flags)
     788{
     789    JSC::ExecState *exec = engine->currentFrame;
     790    QScriptEnginePrivate::setProperty(exec, jscValue, JSC::Identifier(exec, name), value, flags);
    507791}
    508792
     
    523807}
    524808
    525 inline void QScriptValuePrivate::saveException(JSC::ExecState *exec, JSC::JSValue *val)
     809inline void QScriptEnginePrivate::saveException(JSC::ExecState *exec, JSC::JSValue *val)
    526810{
    527811    if (exec) {
     
    533817}
    534818
    535 inline void QScriptValuePrivate::restoreException(JSC::ExecState *exec, JSC::JSValue val)
     819inline void QScriptEnginePrivate::restoreException(JSC::ExecState *exec, JSC::JSValue val)
    536820{
    537821    if (exec && val)
     
    582866}
    583867
     868inline bool QScriptEnginePrivate::hasValidCodeBlockRegister(JSC::ExecState *frame)
     869{
     870#if ENABLE(JIT)
     871    // Frames created by the VM don't have their CodeBlock register
     872    // initialized. We can detect such frames by checking if the
     873    // callee is a host JSFunction.
     874    JSC::JSObject *callee = frame->callee();
     875    return !(callee && callee->inherits(&JSC::JSFunction::info)
     876             && JSC::asFunction(callee)->isHostFunction());
     877#else
     878    Q_UNUSED(frame);
     879    return true;
     880#endif
     881}
     882
    584883inline JSC::ExecState *QScriptEnginePrivate::globalExec() const
    585884{
     
    587886}
    588887
     888inline JSC::JSValue QScriptEnginePrivate::newArray(JSC::ExecState *exec, uint length)
     889{
     890    return JSC::constructEmptyArray(exec, length);
     891}
     892
     893inline JSC::JSValue QScriptEnginePrivate::newDate(JSC::ExecState *exec, qsreal value)
     894{
     895    JSC::JSValue val = JSC::jsNumber(exec, value);
     896    JSC::ArgList args(&val, 1);
     897    return JSC::constructDate(exec, args);
     898}
     899
     900inline JSC::JSValue QScriptEnginePrivate::newDate(JSC::ExecState *exec, const QDateTime &value)
     901{
     902    return newDate(exec, QScript::DateTimeToMs(exec, value));
     903}
     904
     905inline JSC::JSValue QScriptEnginePrivate::newObject()
     906{
     907    return new (currentFrame)QScriptObject(scriptObjectStructure);
     908}
     909
     910inline bool QScriptEnginePrivate::isObject(JSC::JSValue value)
     911{
     912    return value && value.isObject();
     913}
     914
     915inline bool QScriptEnginePrivate::isArray(JSC::JSValue value)
     916{
     917    return isObject(value) && value.inherits(&JSC::JSArray::info);
     918}
     919
     920inline bool QScriptEnginePrivate::isDate(JSC::JSValue value)
     921{
     922    return isObject(value) && value.inherits(&JSC::DateInstance::info);
     923}
     924
     925inline bool QScriptEnginePrivate::isError(JSC::JSValue value)
     926{
     927    return isObject(value) && value.inherits(&JSC::ErrorInstance::info);
     928}
     929
     930inline bool QScriptEnginePrivate::isRegExp(JSC::JSValue value)
     931{
     932    return isObject(value) && value.inherits(&JSC::RegExpObject::info);
     933}
     934
     935inline bool QScriptEnginePrivate::isVariant(JSC::JSValue value)
     936{
     937    if (!isObject(value) || !value.inherits(&QScriptObject::info))
     938        return false;
     939    QScriptObject *object = static_cast<QScriptObject*>(JSC::asObject(value));
     940    QScriptObjectDelegate *delegate = object->delegate();
     941    return (delegate && (delegate->type() == QScriptObjectDelegate::Variant));
     942}
     943
     944inline bool QScriptEnginePrivate::isQObject(JSC::JSValue value)
     945{
     946#ifndef QT_NO_QOBJECT
     947    if (!isObject(value) || !value.inherits(&QScriptObject::info))
     948        return false;
     949    QScriptObject *object = static_cast<QScriptObject*>(JSC::asObject(value));
     950    QScriptObjectDelegate *delegate = object->delegate();
     951    return (delegate && (delegate->type() == QScriptObjectDelegate::QtObject ||
     952                         (delegate->type() == QScriptObjectDelegate::DeclarativeClassObject &&
     953                          static_cast<QScript::DeclarativeObjectDelegate*>(delegate)->scriptClass()->isQObject())));
     954#else
     955    return false;
     956#endif
     957}
     958
     959inline bool QScriptEnginePrivate::isQMetaObject(JSC::JSValue value)
     960{
     961#ifndef QT_NO_QOBJECT
     962    return isObject(value) && JSC::asObject(value)->inherits(&QScript::QMetaObjectWrapperObject::info);
     963#else
     964    return false;
     965#endif
     966}
     967
     968inline bool QScriptEnginePrivate::toBool(JSC::ExecState *exec, JSC::JSValue value)
     969{
     970    JSC::JSValue savedException;
     971    saveException(exec, &savedException);
     972    bool result = value.toBoolean(exec);
     973    restoreException(exec, savedException);
     974    return result;
     975}
     976
     977inline qsreal QScriptEnginePrivate::toInteger(JSC::ExecState *exec, JSC::JSValue value)
     978{
     979    JSC::JSValue savedException;
     980    saveException(exec, &savedException);
     981    qsreal result = value.toInteger(exec);
     982    restoreException(exec, savedException);
     983    return result;
     984}
     985
     986inline qsreal QScriptEnginePrivate::toNumber(JSC::ExecState *exec, JSC::JSValue value)
     987{
     988    JSC::JSValue savedException;
     989    saveException(exec, &savedException);
     990    qsreal result = value.toNumber(exec);
     991    restoreException(exec, savedException);
     992    return result;
     993}
     994
     995inline qint32 QScriptEnginePrivate::toInt32(JSC::ExecState *exec, JSC::JSValue value)
     996{
     997    JSC::JSValue savedException;
     998    saveException(exec, &savedException);
     999    qint32 result = value.toInt32(exec);
     1000    restoreException(exec, savedException);
     1001    return result;
     1002}
     1003
     1004inline quint32 QScriptEnginePrivate::toUInt32(JSC::ExecState *exec, JSC::JSValue value)
     1005{
     1006    JSC::JSValue savedException;
     1007    saveException(exec, &savedException);
     1008    quint32 result = value.toUInt32(exec);
     1009    restoreException(exec, savedException);
     1010    return result;
     1011}
     1012
     1013inline quint16 QScriptEnginePrivate::toUInt16(JSC::ExecState *exec, JSC::JSValue value)
     1014{
     1015    // ### no equivalent function in JSC
     1016    return QScript::ToUInt16(toNumber(exec, value));
     1017}
     1018
     1019inline JSC::UString QScriptEnginePrivate::toString(JSC::ExecState *exec, JSC::JSValue value)
     1020{
     1021    JSC::JSValue savedException;
     1022    saveException(exec, &savedException);
     1023    JSC::UString str = value.toString(exec);
     1024    if (exec && exec->hadException() && !str.size()) {
     1025        JSC::JSValue savedException2;
     1026        saveException(exec, &savedException2);
     1027        str = savedException2.toString(exec);
     1028        restoreException(exec, savedException2);
     1029    }
     1030    if (savedException)
     1031        restoreException(exec, savedException);
     1032    return str;
     1033}
     1034
     1035inline QDateTime QScriptEnginePrivate::toDateTime(JSC::ExecState *exec, JSC::JSValue value)
     1036{
     1037    if (!isDate(value))
     1038        return QDateTime();
     1039    qsreal t = static_cast<JSC::DateInstance*>(JSC::asObject(value))->internalNumber();
     1040    return QScript::MsToDateTime(exec, t);
     1041}
     1042
     1043inline QObject *QScriptEnginePrivate::toQObject(JSC::ExecState *exec, JSC::JSValue value)
     1044{
     1045#ifndef QT_NO_QOBJECT
     1046    if (isObject(value) && value.inherits(&QScriptObject::info)) {
     1047        QScriptObject *object = static_cast<QScriptObject*>(JSC::asObject(value));
     1048        QScriptObjectDelegate *delegate = object->delegate();
     1049        if (!delegate)
     1050            return 0;
     1051        if (delegate->type() == QScriptObjectDelegate::QtObject)
     1052            return static_cast<QScript::QObjectDelegate*>(delegate)->value();
     1053        if (delegate->type() == QScriptObjectDelegate::DeclarativeClassObject)
     1054            return static_cast<QScript::DeclarativeObjectDelegate*>(delegate)->scriptClass()->toQObject(declarativeObject(value));
     1055        if (delegate->type() == QScriptObjectDelegate::Variant) {
     1056            QVariant var = variantValue(value);
     1057            int type = var.userType();
     1058            if ((type == QMetaType::QObjectStar) || (type == QMetaType::QWidgetStar))
     1059                return *reinterpret_cast<QObject* const *>(var.constData());
     1060        }
     1061    }
     1062#endif
     1063    return 0;
     1064}
     1065
     1066inline const QMetaObject *QScriptEnginePrivate::toQMetaObject(JSC::ExecState*, JSC::JSValue value)
     1067{
     1068#ifndef QT_NO_QOBJECT
     1069    if (isQMetaObject(value))
     1070        return static_cast<QScript::QMetaObjectWrapperObject*>(JSC::asObject(value))->value();
     1071#endif
     1072    return 0;
     1073}
     1074
     1075inline QVariant &QScriptEnginePrivate::variantValue(JSC::JSValue value)
     1076{
     1077    Q_ASSERT(value.inherits(&QScriptObject::info));
     1078    QScriptObjectDelegate *delegate = static_cast<QScriptObject*>(JSC::asObject(value))->delegate();
     1079    Q_ASSERT(delegate && (delegate->type() == QScriptObjectDelegate::Variant));
     1080    return static_cast<QScript::QVariantDelegate*>(delegate)->value();
     1081}
     1082
     1083inline void QScriptEnginePrivate::setVariantValue(JSC::JSValue objectValue, const QVariant &value)
     1084{
     1085    Q_ASSERT(objectValue.inherits(&QScriptObject::info));
     1086    QScriptObjectDelegate *delegate = static_cast<QScriptObject*>(JSC::asObject(objectValue))->delegate();
     1087    Q_ASSERT(delegate && (delegate->type() == QScriptObjectDelegate::Variant));
     1088    static_cast<QScript::QVariantDelegate*>(delegate)->setValue(value);
     1089}
     1090
     1091inline QScriptDeclarativeClass *QScriptEnginePrivate::declarativeClass(JSC::JSValue v)
     1092{
     1093    if (!QScriptEnginePrivate::isObject(v) || !v.inherits(&QScriptObject::info))
     1094        return 0;
     1095    QScriptObject *scriptObject = static_cast<QScriptObject*>(JSC::asObject(v));
     1096    QScriptObjectDelegate *delegate = scriptObject->delegate();
     1097    if (!delegate || (delegate->type() != QScriptObjectDelegate::DeclarativeClassObject))
     1098        return 0;
     1099    return static_cast<QScript::DeclarativeObjectDelegate*>(delegate)->scriptClass();
     1100}
     1101
     1102inline QScriptDeclarativeClass::Object *QScriptEnginePrivate::declarativeObject(JSC::JSValue v)
     1103{
     1104    if (!QScriptEnginePrivate::isObject(v) || !v.inherits(&QScriptObject::info))
     1105        return 0;
     1106    QScriptObject *scriptObject = static_cast<QScriptObject*>(JSC::asObject(v));
     1107    QScriptObjectDelegate *delegate = scriptObject->delegate();
     1108    if (!delegate || (delegate->type() != QScriptObjectDelegate::DeclarativeClassObject))
     1109        return 0;
     1110    return static_cast<QScript::DeclarativeObjectDelegate*>(delegate)->object();
     1111}
     1112
    5891113QT_END_NAMESPACE
    5901114
Note: See TracChangeset for help on using the changeset viewer.