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:
20 edited
2 copied

Legend:

Unmodified
Added
Removed
  • trunk

  • trunk/src/script/bridge/bridge.pri

    r561 r846  
    77    $$PWD/qscriptglobalobject.cpp \
    88    $$PWD/qscriptactivationobject.cpp \
     9    $$PWD/qscriptstaticscopeobject.cpp \
    910    $$PWD/qscriptdeclarativeobject.cpp \
    1011    $$PWD/qscriptdeclarativeclass.cpp
     
    1819    $$PWD/qscriptglobalobject_p.h \
    1920    $$PWD/qscriptactivationobject_p.h \
     21    $$PWD/qscriptstaticscopeobject_p.h \
    2022    $$PWD/qscriptdeclarativeobject_p.h \
    2123    $$PWD/qscriptdeclarativeclass_p.h
  • trunk/src/script/bridge/qscriptactivationobject.cpp

    r651 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)
     
    5454QScriptActivationObject::~QScriptActivationObject()
    5555{
    56     delete d;
     56    delete d_ptr();
    5757}
    5858
     
    6464}
    6565
    66 bool QScriptActivationObject::getPropertyAttributes(JSC::ExecState* exec, const JSC::Identifier& propertyName, unsigned& attributes) const
     66bool QScriptActivationObject::getOwnPropertyDescriptor(JSC::ExecState* exec, const JSC::Identifier& propertyName, JSC::PropertyDescriptor& descriptor)
    6767{
    6868    if (d_ptr()->delegate != 0)
    69         return d_ptr()->delegate->getPropertyAttributes(exec, propertyName, attributes);
    70     return JSC::JSVariableObject::getPropertyAttributes(exec, propertyName, attributes);
     69        return d_ptr()->delegate->getOwnPropertyDescriptor(exec, propertyName, descriptor);
     70    return JSC::JSVariableObject::getOwnPropertyDescriptor(exec, propertyName, descriptor);
    7171}
    7272
    73 void QScriptActivationObject::getOwnPropertyNames(JSC::ExecState* exec, JSC::PropertyNameArray& propertyNames, bool includeNonEnumerable)
     73void QScriptActivationObject::getOwnPropertyNames(JSC::ExecState* exec, JSC::PropertyNameArray& propertyNames, JSC::EnumerationMode mode)
    7474{
    7575    if (d_ptr()->delegate != 0) {
    76         d_ptr()->delegate->getOwnPropertyNames(exec, propertyNames, includeNonEnumerable);
     76        d_ptr()->delegate->getOwnPropertyNames(exec, propertyNames, mode);
    7777        return;
    7878    }
    79     return JSC::JSVariableObject::getOwnPropertyNames(exec, propertyNames, includeNonEnumerable);
     79    return JSC::JSVariableObject::getOwnPropertyNames(exec, propertyNames, mode);
    8080}
    8181
     
    112112}
    113113
    114 bool QScriptActivationObject::deleteProperty(JSC::ExecState* exec, const JSC::Identifier& propertyName, bool checkDontDelete)
     114bool QScriptActivationObject::deleteProperty(JSC::ExecState* exec, const JSC::Identifier& propertyName)
    115115{
    116116    if (d_ptr()->delegate != 0)
    117         return d_ptr()->delegate->deleteProperty(exec, propertyName, checkDontDelete);
    118     return JSC::JSVariableObject::deleteProperty(exec, propertyName, checkDontDelete);
     117        return d_ptr()->delegate->deleteProperty(exec, propertyName);
     118    return JSC::JSVariableObject::deleteProperty(exec, propertyName);
    119119}
    120120
  • trunk/src/script/bridge/qscriptactivationobject_p.h

    r651 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)
     
    5252
    5353    virtual bool getOwnPropertySlot(JSC::ExecState*, const JSC::Identifier& propertyName, JSC::PropertySlot&);
    54     virtual bool getPropertyAttributes(JSC::ExecState*, const JSC::Identifier&, unsigned&) const;
    55     virtual void getOwnPropertyNames(JSC::ExecState*, JSC::PropertyNameArray&, bool includeNonEnumerable = false);
     54    virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier& propertyName, JSC::PropertyDescriptor&);
     55    virtual void getOwnPropertyNames(JSC::ExecState*, JSC::PropertyNameArray&, JSC::EnumerationMode mode = JSC::ExcludeDontEnumProperties);
    5656
    5757    virtual void putWithAttributes(JSC::ExecState *exec, const JSC::Identifier &propertyName, JSC::JSValue value, unsigned attributes);
     
    5959    virtual void put(JSC::ExecState*, unsigned propertyName, JSC::JSValue value);
    6060
    61     virtual bool deleteProperty(JSC::ExecState*, const JSC::Identifier& propertyName, bool checkDontDelete = true);
     61    virtual bool deleteProperty(JSC::ExecState*, const JSC::Identifier& propertyName);
    6262
    6363    virtual void defineGetter(JSC::ExecState*, const JSC::Identifier& propertyName, JSC::JSObject* getterFunction);
  • trunk/src/script/bridge/qscriptclassobject.cpp

    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)
     
    7979    if (flags & QScriptClass::HandlesReadAccess) {
    8080        QScriptValue value = m_scriptClass->property(scriptObject, scriptName, id);
     81        if (!value.isValid()) {
     82            // The class claims to have the property, but returned an invalid
     83            // value. Silently convert to undefined to avoid the invalid value
     84            // "escaping" into JS.
     85            value = QScriptValue(QScriptValue::UndefinedValue);
     86        }
    8187        slot.setValue(engine->scriptValueToJSCValue(value));
     88        return true;
     89    }
     90    return false;
     91}
     92
     93bool ClassObjectDelegate::getOwnPropertyDescriptor(QScriptObject *object,
     94                                                   JSC::ExecState *exec,
     95                                                   const JSC::Identifier &propertyName,
     96                                                   JSC::PropertyDescriptor &descriptor)
     97{
     98    QScriptEnginePrivate *engine = scriptEngineFromExec(exec);
     99    QScript::SaveFrameHelper saveFrame(engine, exec);
     100    // for compatibility with the old back-end, normal JS properties
     101    // are queried first.
     102    if (QScriptObjectDelegate::getOwnPropertyDescriptor(object, exec, propertyName, descriptor))
     103        return true;
     104
     105    QScriptValue scriptObject = engine->scriptValueFromJSCValue(object);
     106    QScriptString scriptName;
     107    QScriptStringPrivate scriptName_d(engine, propertyName, QScriptStringPrivate::StackAllocated);
     108    QScriptStringPrivate::init(scriptName, &scriptName_d);
     109    uint id = 0;
     110    QScriptClass::QueryFlags qflags = m_scriptClass->queryProperty(
     111        scriptObject, scriptName, QScriptClass::HandlesReadAccess, &id);
     112    if (qflags & QScriptClass::HandlesReadAccess) {
     113        QScriptValue::PropertyFlags pflags = m_scriptClass->propertyFlags(scriptObject, scriptName, id);
     114        unsigned attribs = 0;
     115        if (pflags & QScriptValue::ReadOnly)
     116            attribs |= JSC::ReadOnly;
     117        if (pflags & QScriptValue::SkipInEnumeration)
     118            attribs |= JSC::DontEnum;
     119        if (pflags & QScriptValue::Undeletable)
     120            attribs |= JSC::DontDelete;
     121        if (pflags & QScriptValue::PropertyGetter)
     122            attribs |= JSC::Getter;
     123        if (pflags & QScriptValue::PropertySetter)
     124            attribs |= JSC::Setter;
     125        attribs |= pflags & QScriptValue::UserRange;
     126        // Rather than calling the getter, we could return an access descriptor here.
     127        QScriptValue value = m_scriptClass->property(scriptObject, scriptName, id);
     128        if (!value.isValid()) {
     129            // The class claims to have the property, but returned an invalid
     130            // value. Silently convert to undefined to avoid the invalid value
     131            // "escaping" into JS.
     132            value = QScriptValue(QScriptValue::UndefinedValue);
     133        }
     134        descriptor.setDescriptor(engine->scriptValueToJSCValue(value), attribs);
    82135        return true;
    83136    }
     
    106159
    107160bool ClassObjectDelegate::deleteProperty(QScriptObject* object, JSC::ExecState *exec,
    108                                          const JSC::Identifier &propertyName,
    109                                          bool checkDontDelete)
     161                                         const JSC::Identifier &propertyName)
    110162{
    111163    // ### avoid duplication of put()
     
    125177        return true;
    126178    }
    127     return QScriptObjectDelegate::deleteProperty(object, exec, propertyName, checkDontDelete);
    128 }
    129 
    130 bool ClassObjectDelegate::getPropertyAttributes(const QScriptObject* object, JSC::ExecState *exec,
    131                                                 const JSC::Identifier &propertyName,
    132                                                 unsigned &attribs) const
    133 {
    134     QScriptEnginePrivate *engine = scriptEngineFromExec(exec);
    135     QScript::SaveFrameHelper saveFrame(engine, exec);
    136     QScriptValue scriptObject = engine->scriptValueFromJSCValue(object);
    137     QScriptString scriptName;
    138     QScriptStringPrivate scriptName_d(engine, propertyName, QScriptStringPrivate::StackAllocated);
    139     QScriptStringPrivate::init(scriptName, &scriptName_d);
    140     uint id = 0;
    141     QScriptClass::QueryFlags flags = m_scriptClass->queryProperty(
    142         scriptObject, scriptName, QScriptClass::HandlesReadAccess, &id);
    143     if (flags & QScriptClass::HandlesReadAccess) {
    144         QScriptValue::PropertyFlags flags = m_scriptClass->propertyFlags(scriptObject, scriptName, id);
    145         attribs = 0;
    146         if (flags & QScriptValue::ReadOnly)
    147             attribs |= JSC::ReadOnly;
    148         if (flags & QScriptValue::SkipInEnumeration)
    149             attribs |= JSC::DontEnum;
    150         if (flags & QScriptValue::Undeletable)
    151             attribs |= JSC::DontDelete;
    152         if (flags & QScriptValue::PropertyGetter)
    153             attribs |= JSC::Getter;
    154         if (flags & QScriptValue::PropertySetter)
    155             attribs |= JSC::Setter;
    156         attribs |= flags & QScriptValue::UserRange;
    157         return true;
    158     }
    159     return QScriptObjectDelegate::getPropertyAttributes(object, exec, propertyName, attribs);
     179    return QScriptObjectDelegate::deleteProperty(object, exec, propertyName);
    160180}
    161181
    162182void ClassObjectDelegate::getOwnPropertyNames(QScriptObject* object, JSC::ExecState *exec,
    163183                                              JSC::PropertyNameArray &propertyNames,
    164                                               bool includeNonEnumerable)
     184                                              JSC::EnumerationMode mode)
    165185{
    166186    QScriptEnginePrivate *engine = scriptEngineFromExec(exec);
     
    176196        delete it;
    177197    }
    178     QScriptObjectDelegate::getOwnPropertyNames(object, exec, propertyNames, includeNonEnumerable);
     198    QScriptObjectDelegate::getOwnPropertyNames(object, exec, propertyNames, mode);
    179199}
    180200
     
    207227    eng_p->popContext();
    208228    eng_p->currentFrame = oldFrame;
    209     return eng_p->jscValueFromVariant(result);
     229    return QScriptEnginePrivate::jscValueFromVariant(exec, result);
    210230}
    211231
  • trunk/src/script/bridge/qscriptclassobject_p.h

    r651 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)
     
    6161                                    const JSC::Identifier& propertyName,
    6262                                    JSC::PropertySlot&);
     63    virtual bool getOwnPropertyDescriptor(QScriptObject*, JSC::ExecState*,
     64                                          const JSC::Identifier& propertyName,
     65                                          JSC::PropertyDescriptor&);
    6366    virtual void put(QScriptObject*, JSC::ExecState* exec,
    6467                     const JSC::Identifier& propertyName,
    6568                     JSC::JSValue, JSC::PutPropertySlot&);
    6669    virtual bool deleteProperty(QScriptObject*, JSC::ExecState*,
    67                                 const JSC::Identifier& propertyName,
    68                                 bool checkDontDelete = true);
    69     virtual bool getPropertyAttributes(const QScriptObject*, JSC::ExecState*,
    70                                        const JSC::Identifier&,
    71                                        unsigned&) const;
     70                                const JSC::Identifier& propertyName);
    7271    virtual void getOwnPropertyNames(QScriptObject*, JSC::ExecState*,
    7372                                     JSC::PropertyNameArray&,
    74                                      bool includeNonEnumerable = false);
     73                                     JSC::EnumerationMode mode = JSC::ExcludeDontEnumProperties);
    7574
    7675    virtual JSC::CallType getCallData(QScriptObject*, JSC::CallData&);
  • trunk/src/script/bridge/qscriptdeclarativeclass.cpp

    r651 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)
     
    2525#include "qscriptdeclarativeobject_p.h"
    2626#include "qscriptobject_p.h"
     27#include "qscriptstaticscopeobject_p.h"
    2728#include <QtScript/qscriptstring.h>
    2829#include <QtScript/qscriptengine.h>
     
    3637QT_BEGIN_NAMESPACE
    3738
     39/*!
     40\class QScriptDeclarativeClass::Value
     41\internal
     42\brief The QScriptDeclarativeClass::Value class acts as a container for JavaScript data types.
     43
     44QScriptDeclarativeClass::Value class is similar to QScriptValue, but it is slightly faster. 
     45Unlike QScriptValue, however, Value instances cannot be stored as they may not survive garbage
     46collection.  If you need to store a Value, convert it to a QScriptValue and store that.
     47*/
     48
     49QScriptDeclarativeClass::Value::Value()
     50{
     51    new (this) JSC::JSValue(JSC::jsUndefined());
     52}
     53
     54QScriptDeclarativeClass::Value::Value(const Value &other)
     55{
     56    new (this) JSC::JSValue((JSC::JSValue &)other);
     57}
     58
     59static QScriptDeclarativeClass::Value jscToValue(const JSC::JSValue &val)
     60{
     61    return QScriptDeclarativeClass::Value((QScriptDeclarativeClass::Value &)val);
     62}
     63
     64QScriptDeclarativeClass::Value::Value(QScriptContext *ctxt, int value)
     65{
     66    new (this) JSC::JSValue(QScriptEnginePrivate::frameForContext(ctxt), value);
     67}
     68
     69QScriptDeclarativeClass::Value::Value(QScriptContext *ctxt, uint value)
     70{
     71    new (this) JSC::JSValue(QScriptEnginePrivate::frameForContext(ctxt), value);
     72}
     73
     74QScriptDeclarativeClass::Value::Value(QScriptContext *, bool value)
     75{
     76    if (value)
     77        new (this) JSC::JSValue(JSC::JSValue::JSTrue);
     78    else
     79        new (this) JSC::JSValue(JSC::JSValue::JSFalse);
     80}
     81
     82QScriptDeclarativeClass::Value::Value(QScriptContext *ctxt, double value)
     83{
     84    new (this) JSC::JSValue(QScriptEnginePrivate::frameForContext(ctxt), value);
     85}
     86
     87QScriptDeclarativeClass::Value::Value(QScriptContext *ctxt, float value)
     88{
     89    new (this) JSC::JSValue(QScriptEnginePrivate::frameForContext(ctxt), value);
     90}
     91
     92QScriptDeclarativeClass::Value::Value(QScriptContext *ctxt, const QString &value)
     93{
     94    new (this) JSC::JSValue(JSC::jsString(QScriptEnginePrivate::frameForContext(ctxt), value));
     95}
     96
     97QScriptDeclarativeClass::Value::Value(QScriptContext *ctxt, const QScriptValue &value)
     98{
     99    new (this) JSC::JSValue(QScriptEnginePrivate::get(ctxt->engine())->scriptValueToJSCValue(value));
     100}
     101
     102QScriptDeclarativeClass::Value::Value(QScriptEngine *eng, int value)
     103{
     104    new (this) JSC::JSValue(QScriptEnginePrivate::get(eng)->currentFrame, value);
     105}
     106
     107QScriptDeclarativeClass::Value::Value(QScriptEngine *eng, uint value)
     108{
     109    new (this) JSC::JSValue(QScriptEnginePrivate::get(eng)->currentFrame, value);
     110}
     111
     112QScriptDeclarativeClass::Value::Value(QScriptEngine *eng, bool value)
     113{
     114    if (value)
     115        new (this) JSC::JSValue(JSC::JSValue::JSTrue);
     116    else
     117        new (this) JSC::JSValue(JSC::JSValue::JSFalse);
     118}
     119
     120QScriptDeclarativeClass::Value::Value(QScriptEngine *eng, double value)
     121{
     122    new (this) JSC::JSValue(QScriptEnginePrivate::get(eng)->currentFrame, value);
     123}
     124
     125QScriptDeclarativeClass::Value::Value(QScriptEngine *eng, float value)
     126{
     127    new (this) JSC::JSValue(QScriptEnginePrivate::get(eng)->currentFrame, value);
     128}
     129
     130QScriptDeclarativeClass::Value::Value(QScriptEngine *eng, const QString &value)
     131{
     132    new (this) JSC::JSValue(JSC::jsString(QScriptEnginePrivate::get(eng)->currentFrame, value));
     133}
     134
     135QScriptDeclarativeClass::Value::Value(QScriptEngine *eng, const QScriptValue &value)
     136{
     137        new (this) JSC::JSValue(QScriptEnginePrivate::get(eng)->scriptValueToJSCValue(value));
     138}
     139
     140QScriptDeclarativeClass::Value::~Value()
     141{
     142    ((JSC::JSValue *)(this))->~JSValue();
     143}
     144
     145QScriptValue QScriptDeclarativeClass::Value::toScriptValue(QScriptEngine *engine) const
     146{
     147    return QScriptEnginePrivate::get(engine)->scriptValueFromJSCValue((JSC::JSValue &)*this);
     148}
     149
    38150QScriptDeclarativeClass::PersistentIdentifier::PersistentIdentifier()
     151    : identifier(0), engine(0)
    39152{
    40153    new (&d) JSC::Identifier();
     
    43156QScriptDeclarativeClass::PersistentIdentifier::~PersistentIdentifier()
    44157{
    45     ((JSC::Identifier &)d).JSC::Identifier::~Identifier();
     158    if (engine) {
     159        QScript::APIShim shim(engine);
     160        ((JSC::Identifier &)d).JSC::Identifier::~Identifier();
     161    } else {
     162        ((JSC::Identifier &)d).JSC::Identifier::~Identifier();
     163    }
    46164}
    47165
     
    49167{
    50168    identifier = other.identifier;
     169    engine = other.engine;
    51170    new (&d) JSC::Identifier((JSC::Identifier &)(other.d));
    52171}
     
    56175{
    57176    identifier = other.identifier;
     177    engine = other.engine;
    58178    ((JSC::Identifier &)d) = (JSC::Identifier &)(other.d);
    59179    return *this;
     
    75195    Q_ASSERT(scriptClass);
    76196
    77     QScriptEnginePrivate *p = static_cast<QScriptEnginePrivate *>(QObjectPrivate::get(engine));
     197    QScriptEnginePrivate *p = static_cast<QScriptEnginePrivate *>(QObjectPrivate::get(engine));
     198    QScript::APIShim shim(p);
    78199
    79200    JSC::ExecState* exec = p->currentFrame;
     
    83204}
    84205
     206QScriptDeclarativeClass::Value
     207QScriptDeclarativeClass::newObjectValue(QScriptEngine *engine,
     208                                        QScriptDeclarativeClass *scriptClass,
     209                                        Object *object)
     210{
     211    Q_ASSERT(engine);
     212    Q_ASSERT(scriptClass);
     213
     214    QScriptEnginePrivate *p = static_cast<QScriptEnginePrivate *>(QObjectPrivate::get(engine));
     215    QScript::APIShim shim(p);
     216
     217    JSC::ExecState* exec = p->currentFrame;
     218    QScriptObject *result = new (exec) QScriptObject(p->scriptObjectStructure);
     219    result->setDelegate(new QScript::DeclarativeObjectDelegate(scriptClass, object));
     220    return jscToValue(JSC::JSValue(result));
     221}
     222
    85223QScriptDeclarativeClass *QScriptDeclarativeClass::scriptClass(const QScriptValue &v)
    86224{
    87225    QScriptValuePrivate *d = QScriptValuePrivate::get(v);
    88     if (!d || !d->isJSC() || !d->jscValue.inherits(&QScriptObject::info))
     226    if (!d || !d->isJSC())
    89227        return 0;
    90     QScriptObject *scriptObject = static_cast<QScriptObject*>(JSC::asObject(d->jscValue));
    91     QScriptObjectDelegate *delegate = scriptObject->delegate();
    92     if (!delegate || (delegate->type() != QScriptObjectDelegate::DeclarativeClassObject))
     228    return QScriptEnginePrivate::declarativeClass(d->jscValue);
     229}
     230
     231QScriptDeclarativeClass::Object *QScriptDeclarativeClass::object(const QScriptValue &v)
     232{
     233    QScriptValuePrivate *d = QScriptValuePrivate::get(v);
     234    if (!d || !d->isJSC())
    93235        return 0;
    94     return static_cast<QScript::DeclarativeObjectDelegate*>(delegate)->scriptClass();
    95 }
    96 
    97 QScriptDeclarativeClass::Object *QScriptDeclarativeClass::object(const QScriptValue &v)
    98 {
    99     QScriptValuePrivate *d = QScriptValuePrivate::get(v);
    100     if (!d || !d->isJSC() || !d->jscValue.inherits(&QScriptObject::info))
    101         return 0;
    102     QScriptObject *scriptObject = static_cast<QScriptObject*>(JSC::asObject(d->jscValue));
    103     QScriptObjectDelegate *delegate = scriptObject->delegate();
    104     if (!delegate || (delegate->type() != QScriptObjectDelegate::DeclarativeClassObject))
    105         return 0;
    106     return static_cast<QScript::DeclarativeObjectDelegate*>(delegate)->object();
     236    return QScriptEnginePrivate::declarativeObject(d->jscValue);
    107237}
    108238
     
    114244        return QScriptValue();
    115245
     246    QScript::APIShim shim(d->engine);
    116247    JSC::ExecState *exec = d->engine->currentFrame;
    117248    JSC::JSObject *object = d->jscValue.getObject();
     
    137268        return QScriptValue();
    138269
     270    QScript::APIShim shim(d->engine);
    139271    JSC::ExecState *exec = d->engine->currentFrame;
    140272    JSC::JSObject *object = d->jscValue.getObject();
     
    150282
    151283    return QScriptValue();
     284}
     285
     286QScriptDeclarativeClass::Value
     287QScriptDeclarativeClass::functionValue(const QScriptValue &v, const Identifier &name)
     288{
     289    QScriptValuePrivate *d = QScriptValuePrivate::get(v);
     290
     291    if (!d->isObject())
     292        return Value();
     293
     294    QScript::APIShim shim(d->engine);
     295    JSC::ExecState *exec = d->engine->currentFrame;
     296    JSC::JSObject *object = d->jscValue.getObject();
     297    JSC::PropertySlot slot(const_cast<JSC::JSObject*>(object));
     298    JSC::JSValue result;
     299
     300    JSC::Identifier id(exec, (JSC::UString::Rep *)name);
     301
     302    if (const_cast<JSC::JSObject*>(object)->getOwnPropertySlot(exec, id, slot)) {
     303        result = slot.getValue(exec, id);
     304        if (QScript::isFunction(result))
     305            return jscToValue(result);
     306    }
     307
     308    return Value();
     309}
     310
     311QScriptDeclarativeClass::Value
     312QScriptDeclarativeClass::propertyValue(const QScriptValue &v, const Identifier &name)
     313{
     314    QScriptValuePrivate *d = QScriptValuePrivate::get(v);
     315
     316    if (!d->isObject())
     317        return Value();
     318
     319    QScript::APIShim shim(d->engine);
     320    JSC::ExecState *exec = d->engine->currentFrame;
     321    JSC::JSObject *object = d->jscValue.getObject();
     322    JSC::PropertySlot slot(const_cast<JSC::JSObject*>(object));
     323    JSC::JSValue result;
     324
     325    JSC::Identifier id(exec, (JSC::UString::Rep *)name);
     326
     327    if (const_cast<JSC::JSObject*>(object)->getOwnPropertySlot(exec, id, slot)) {
     328        result = slot.getValue(exec, id);
     329        return jscToValue(result);
     330    }
     331
     332    return Value();
    152333}
    153334
     
    162343    const JSC::CallFrame *frame = QScriptEnginePrivate::frameForContext(context);
    163344    QScriptEnginePrivate *engine = QScript::scriptEngineFromExec(frame);
     345    QScript::APIShim shim(engine);
    164346
    165347    JSC::ScopeChainNode *node = frame->scopeChain();
     
    222404
    223405    QScriptEnginePrivate *d = QScriptEnginePrivate::get(engine);
     406    QScript::APIShim shim(d);
    224407
    225408    JSC::CallFrame* newFrame = d->pushContext(d->currentFrame,
     
    242425}
    243426
     427bool QScriptDeclarativeClass::supportsCall() const
     428{
     429    return d_ptr->supportsCall;
     430}
     431
     432void QScriptDeclarativeClass::setSupportsCall(bool c)
     433{
     434    d_ptr->supportsCall = c;
     435}
     436
    244437QScriptDeclarativeClass::PersistentIdentifier
    245438QScriptDeclarativeClass::createPersistentIdentifier(const QString &str)
     
    247440    QScriptEnginePrivate *p =
    248441        static_cast<QScriptEnginePrivate *>(QObjectPrivate::get(d_ptr->engine));
     442    QScript::APIShim shim(p);
    249443    JSC::ExecState* exec = p->currentFrame;
    250444
    251     PersistentIdentifier rv(true);
     445    PersistentIdentifier rv(p);
    252446    new (&rv.d) JSC::Identifier(exec, (UChar *)str.constData(), str.size());
    253447    rv.identifier = (void *)((JSC::Identifier &)rv.d).ustring().rep();
     
    260454    QScriptEnginePrivate *p =
    261455        static_cast<QScriptEnginePrivate *>(QObjectPrivate::get(d_ptr->engine));
     456    QScript::APIShim shim(p);
    262457    JSC::ExecState* exec = p->currentFrame;
    263458
    264     PersistentIdentifier rv(true);
     459    PersistentIdentifier rv(p);
    265460    new (&rv.d) JSC::Identifier(exec, (JSC::UString::Rep *)id);
    266461    rv.identifier = (void *)((JSC::Identifier &)rv.d).ustring().rep();
     
    291486}
    292487
    293 QScriptValue QScriptDeclarativeClass::property(Object *object, const Identifier &name)
     488QScriptDeclarativeClass::Value
     489QScriptDeclarativeClass::property(Object *object, const Identifier &name)
    294490{
    295491    Q_UNUSED(object);
    296492    Q_UNUSED(name);
    297     return QScriptValue();
     493    return Value();
    298494}
    299495
     
    314510}
    315511
     512QScriptDeclarativeClass::Value QScriptDeclarativeClass::call(Object *object,
     513                                                             QScriptContext *ctxt)
     514{
     515    Q_UNUSED(object);
     516    Q_UNUSED(ctxt);
     517    return Value();
     518}
     519
     520bool QScriptDeclarativeClass::compare(Object *o, Object *o2)
     521{
     522    return o == o2;
     523}
     524
    316525QStringList QScriptDeclarativeClass::propertyNames(Object *object)
    317526{
     
    342551}
    343552
     553/*!
     554  Creates a scope object with a fixed set of undeletable properties.
     555*/
     556QScriptValue QScriptDeclarativeClass::newStaticScopeObject(
     557    QScriptEngine *engine, int propertyCount, const QString *names,
     558    const QScriptValue *values, const QScriptValue::PropertyFlags *flags)
     559{
     560    QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(engine);
     561    QScript::APIShim shim(eng_p);
     562    JSC::ExecState *exec = eng_p->currentFrame;
     563    QScriptStaticScopeObject::PropertyInfo *props = new QScriptStaticScopeObject::PropertyInfo[propertyCount];
     564    for (int i = 0; i < propertyCount; ++i) {
     565        unsigned attribs = QScriptEnginePrivate::propertyFlagsToJSCAttributes(flags[i]);
     566        Q_ASSERT_X(attribs & JSC::DontDelete, Q_FUNC_INFO, "All properties must be undeletable");
     567        JSC::Identifier id = JSC::Identifier(exec, names[i]);
     568        JSC::JSValue jsval = eng_p->scriptValueToJSCValue(values[i]);
     569        props[i] = QScriptStaticScopeObject::PropertyInfo(id, jsval, attribs);
     570    }
     571    QScriptValue result = eng_p->scriptValueFromJSCValue(new (exec)QScriptStaticScopeObject(eng_p->staticScopeObjectStructure,
     572                                                                                            propertyCount, props));
     573    delete[] props;
     574    return result;
     575}
     576
     577/*!
     578  Creates a static scope object that's initially empty, but to which new
     579  properties can be added.
     580*/
     581QScriptValue QScriptDeclarativeClass::newStaticScopeObject(QScriptEngine *engine)
     582{
     583    QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(engine);
     584    QScript::APIShim shim(eng_p);
     585    return eng_p->scriptValueFromJSCValue(new (eng_p->currentFrame)QScriptStaticScopeObject(eng_p->staticScopeObjectStructure));
     586}
     587
    344588QT_END_NAMESPACE
  • trunk/src/script/bridge/qscriptdeclarativeclass_p.h

    r651 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)
     
    4848{
    4949public:
     50#define QT_HAVE_QSCRIPTDECLARATIVECLASS_VALUE
     51    class Q_SCRIPT_EXPORT Value
     52    {
     53    public:
     54        Value();
     55        Value(const Value &);
     56
     57        Value(QScriptContext *, int);
     58        Value(QScriptContext *, uint);
     59        Value(QScriptContext *, bool);
     60        Value(QScriptContext *, double);
     61        Value(QScriptContext *, float);
     62        Value(QScriptContext *, const QString &);
     63        Value(QScriptContext *, const QScriptValue &);
     64        Value(QScriptEngine *, int);
     65        Value(QScriptEngine *, uint);
     66        Value(QScriptEngine *, bool);
     67        Value(QScriptEngine *, double);
     68        Value(QScriptEngine *, float);
     69        Value(QScriptEngine *, const QString &);
     70        Value(QScriptEngine *, const QScriptValue &);
     71        ~Value();
     72
     73        QScriptValue toScriptValue(QScriptEngine *) const;
     74    private:
     75        char dummy[8];
     76    };
     77
    5078    typedef void* Identifier;
    5179
     
    5381
    5482    static QScriptValue newObject(QScriptEngine *, QScriptDeclarativeClass *, Object *);
     83    static Value newObjectValue(QScriptEngine *, QScriptDeclarativeClass *, Object *);
    5584    static QScriptDeclarativeClass *scriptClass(const QScriptValue &);
    5685    static Object *object(const QScriptValue &);
     
    5887    static QScriptValue function(const QScriptValue &, const Identifier &);
    5988    static QScriptValue property(const QScriptValue &, const Identifier &);
     89    static Value functionValue(const QScriptValue &, const Identifier &);
     90    static Value propertyValue(const QScriptValue &, const Identifier &);
    6091
    6192    static QScriptValue scopeChainValue(QScriptContext *, int index);
    6293    static QScriptContext *pushCleanContext(QScriptEngine *);
     94
     95    static QScriptValue newStaticScopeObject(
     96        QScriptEngine *, int propertyCount, const QString *names,
     97       const QScriptValue *values, const QScriptValue::PropertyFlags *flags);
     98    static QScriptValue newStaticScopeObject(QScriptEngine *);
    6399
    64100    class Q_SCRIPT_EXPORT PersistentIdentifier
     
    74110    private:
    75111        friend class QScriptDeclarativeClass;
    76         PersistentIdentifier(bool) : identifier(0), d(0) {}
     112        PersistentIdentifier(QScriptEnginePrivate *e) : identifier(0), engine(e), d(0) {}
     113        QScriptEnginePrivate *engine;
    77114        void *d;
    78115    };
     
    82119
    83120    QScriptEngine *engine() const;
     121
     122    bool supportsCall() const;
     123    void setSupportsCall(bool);
    84124
    85125    PersistentIdentifier createPersistentIdentifier(const QString &);
     
    92132                                                   QScriptClass::QueryFlags flags);
    93133
    94     virtual QScriptValue property(Object *, const Identifier &);
     134    virtual Value property(Object *, const Identifier &);
    95135    virtual void setProperty(Object *, const Identifier &name, const QScriptValue &);
    96136    virtual QScriptValue::PropertyFlags propertyFlags(Object *, const Identifier &);
     137    virtual Value call(Object *, QScriptContext *);
     138    virtual bool compare(Object *, Object *);
    97139
    98140    virtual QStringList propertyNames(Object *);
  • trunk/src/script/bridge/qscriptdeclarativeobject.cpp

    r651 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)
     
    6767                                                   JSC::PropertySlot &slot)
    6868{
    69     QScriptEnginePrivate *engine = scriptEngineFromExec(exec);
    7069    QScriptDeclarativeClass::Identifier identifier = (void *)propertyName.ustring().rep();
    7170
     
    7574        m_class->queryProperty(m_object, identifier, QScriptClass::HandlesReadAccess);
    7675    if (flags & QScriptClass::HandlesReadAccess) {
    77         QScriptValue value = m_class->property(m_object, identifier);
     76        QScriptDeclarativeClass::Value val = m_class->property(m_object, identifier);
    7877        p->context = 0;
    79         slot.setValue(engine->scriptValueToJSCValue(value));
     78        slot.setValue((const JSC::JSValue &)val);
    8079        return true;
    8180    }
     
    9089{
    9190    QScriptEnginePrivate *engine = scriptEngineFromExec(exec);
     91    QScript::SaveFrameHelper saveFrame(engine, exec);
    9292    QScriptDeclarativeClass::Identifier identifier = (void *)propertyName.ustring().rep();
    9393
     
    107107
    108108bool DeclarativeObjectDelegate::deleteProperty(QScriptObject* object, JSC::ExecState *exec,
    109                                                const JSC::Identifier &propertyName,
    110                                                bool checkDontDelete)
     109                                               const JSC::Identifier &propertyName)
    111110{
    112     return QScriptObjectDelegate::deleteProperty(object, exec, propertyName, checkDontDelete);
    113 }
    114 
    115 bool DeclarativeObjectDelegate::getPropertyAttributes(const QScriptObject* object,
    116                                                       JSC::ExecState *exec,
    117                                                       const JSC::Identifier &propertyName,
    118                                                       unsigned &attribs) const
    119 {
    120     QScriptDeclarativeClass::Identifier identifier = (void *)propertyName.ustring().rep();
    121 
    122     QScriptClass::QueryFlags flags =
    123         m_class->queryProperty(m_object, identifier, QScriptClass::HandlesReadAccess);
    124     if (flags & QScriptClass::HandlesReadAccess) {
    125         QScriptValue::PropertyFlags flags = m_class->propertyFlags(m_object, identifier);
    126         attribs = 0;
    127         if (flags & QScriptValue::ReadOnly)
    128             attribs |= JSC::ReadOnly;
    129         if (flags & QScriptValue::SkipInEnumeration)
    130             attribs |= JSC::DontEnum;
    131         if (flags & QScriptValue::Undeletable)
    132             attribs |= JSC::DontDelete;
    133         if (flags & QScriptValue::PropertyGetter)
    134             attribs |= JSC::Getter;
    135         if (flags & QScriptValue::PropertySetter)
    136             attribs |= JSC::Setter;
    137         attribs |= flags & QScriptValue::UserRange;
    138         return true;
    139     }
    140     return QScriptObjectDelegate::getPropertyAttributes(object, exec, propertyName, attribs);
     111    return QScriptObjectDelegate::deleteProperty(object, exec, propertyName);
    141112}
    142113
    143114void DeclarativeObjectDelegate::getOwnPropertyNames(QScriptObject* object, JSC::ExecState *exec,
    144115                                                    JSC::PropertyNameArray &propertyNames,
    145                                                     bool includeNonEnumerable)
     116                                                    JSC::EnumerationMode mode)
    146117{
    147118    QStringList properties = m_class->propertyNames(m_object);
     
    151122    }
    152123
    153     QScriptObjectDelegate::getOwnPropertyNames(object, exec, propertyNames, includeNonEnumerable);
     124    QScriptObjectDelegate::getOwnPropertyNames(object, exec, propertyNames, mode);
    154125}
    155126
    156127JSC::CallType DeclarativeObjectDelegate::getCallData(QScriptObject *object, JSC::CallData &callData)
    157128{
    158     return QScriptObjectDelegate::getCallData(object, callData);
     129    if (!QScriptDeclarativeClassPrivate::get(m_class)->supportsCall)
     130        return JSC::CallTypeNone;
     131    callData.native.function = call;
     132    return JSC::CallTypeHost;
     133}
     134
     135JSC::JSValue DeclarativeObjectDelegate::call(JSC::ExecState *exec, JSC::JSObject *callee,
     136                                             JSC::JSValue thisValue, const JSC::ArgList &args)
     137{
     138    if (!callee->inherits(&QScriptObject::info))
     139        return JSC::throwError(exec, JSC::TypeError, "callee is not a DeclarativeObject object");
     140    QScriptObject *obj = static_cast<QScriptObject*>(callee);
     141    QScriptObjectDelegate *delegate = obj->delegate();
     142    if (!delegate || (delegate->type() != QScriptObjectDelegate::DeclarativeClassObject))
     143        return JSC::throwError(exec, JSC::TypeError, "callee is not a DeclarativeObject object");
     144
     145    QScriptDeclarativeClass *scriptClass = static_cast<DeclarativeObjectDelegate*>(delegate)->m_class;
     146    QScriptEnginePrivate *eng_p = scriptEngineFromExec(exec);
     147
     148    QScript::SaveFrameHelper saveFrame(eng_p, exec);
     149    eng_p->pushContext(exec, thisValue, args, callee);
     150    QScriptContext *ctxt = eng_p->contextForFrame(eng_p->currentFrame);
     151
     152    QScriptValue scriptObject = eng_p->scriptValueFromJSCValue(obj);
     153    QScriptDeclarativeClass::Value result =
     154        scriptClass->call(static_cast<DeclarativeObjectDelegate*>(delegate)->m_object, ctxt);
     155
     156    eng_p->popContext();
     157    return (JSC::JSValue &)(result);
    159158}
    160159
     
    170169}
    171170
     171bool DeclarativeObjectDelegate::compareToObject(QScriptObject *o, JSC::ExecState *exec, JSC::JSObject *o2)
     172{
     173    if (!o2->inherits(&QScriptObject::info))
     174        return false;
     175   
     176    QScriptObject *scriptObject = static_cast<QScriptObject*>(o2);
     177    QScriptObjectDelegate *delegate = scriptObject->delegate();
     178    if (!delegate || (delegate->type() != QScriptObjectDelegate::DeclarativeClassObject))
     179        return false;
     180
     181    DeclarativeObjectDelegate *other = static_cast<DeclarativeObjectDelegate*>(delegate);
     182    if (m_class != other->m_class)
     183        return false;
     184    else
     185        return m_class->compare(m_object, other->m_object);
     186}
     187
    172188} // namespace QScript
    173189
  • trunk/src/script/bridge/qscriptdeclarativeobject_p.h

    r651 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)
     
    4949{
    5050public:
    51     QScriptDeclarativeClassPrivate() : engine(0), q_ptr(0), context(0) {}
     51    QScriptDeclarativeClassPrivate() : engine(0), q_ptr(0), context(0), supportsCall(false) {}
    5252
    5353    QScriptEngine *engine;
    5454    QScriptDeclarativeClass *q_ptr;
    5555    QScriptContext *context;
     56    bool supportsCall:1;
    5657
    5758    static QScriptDeclarativeClassPrivate *get(QScriptDeclarativeClass *c) {
     
    8182                     JSC::JSValue, JSC::PutPropertySlot&);
    8283    virtual bool deleteProperty(QScriptObject*, JSC::ExecState*,
    83                                 const JSC::Identifier& propertyName,
    84                                 bool checkDontDelete = true);
    85     virtual bool getPropertyAttributes(const QScriptObject*, JSC::ExecState*,
    86                                        const JSC::Identifier&,
    87                                        unsigned&) const;
     84                                const JSC::Identifier& propertyName);
    8885    virtual void getOwnPropertyNames(QScriptObject*, JSC::ExecState*,
    8986                                     JSC::PropertyNameArray&,
    90                                      bool includeNonEnumerable = false);
     87                                     JSC::EnumerationMode mode = JSC::ExcludeDontEnumProperties);
    9188
    9289    virtual JSC::CallType getCallData(QScriptObject*, JSC::CallData&);
     90    static JSC::JSValue JSC_HOST_CALL call(JSC::ExecState*, JSC::JSObject*,
     91                                           JSC::JSValue, const JSC::ArgList&);
     92
    9393    virtual JSC::ConstructType getConstructData(QScriptObject*, JSC::ConstructData&);
    9494
    9595    virtual bool hasInstance(QScriptObject*, JSC::ExecState*,
    9696                             JSC::JSValue value, JSC::JSValue proto);
     97
     98    bool compareToObject(QScriptObject *, JSC::ExecState *, JSC::JSObject *);
    9799
    98100private:
  • trunk/src/script/bridge/qscriptfunction.cpp

    r651 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)
  • trunk/src/script/bridge/qscriptfunction_p.h

    r651 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)
  • trunk/src/script/bridge/qscriptglobalobject.cpp

    r651 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)
     
    7373}
    7474
     75bool GlobalObject::getOwnPropertyDescriptor(JSC::ExecState* exec,
     76                                            const JSC::Identifier& propertyName,
     77                                            JSC::PropertyDescriptor& descriptor)
     78{
     79    // Must match the logic of getOwnPropertySlot().
     80    QScriptEnginePrivate *engine = scriptEngineFromExec(exec);
     81    if (propertyName == exec->propertyNames().arguments && engine->currentFrame->argumentCount() > 0) {
     82        // ### Can we get rid of this special handling of the arguments property?
     83        JSC::JSValue args = engine->scriptValueToJSCValue(engine->contextForFrame(engine->currentFrame)->argumentsObject());
     84        descriptor.setValue(args);
     85        return true;
     86    }
     87    if (customGlobalObject)
     88        return customGlobalObject->getOwnPropertyDescriptor(exec, propertyName, descriptor);
     89    return JSC::JSGlobalObject::getOwnPropertyDescriptor(exec, propertyName, descriptor);
     90}
     91
    7592void GlobalObject::put(JSC::ExecState* exec, const JSC::Identifier& propertyName,
    7693                       JSC::JSValue value, JSC::PutPropertySlot& slot)
     
    91108}
    92109
    93 bool GlobalObject::deleteProperty(JSC::ExecState* exec,
    94                                   const JSC::Identifier& propertyName, bool checkDontDelete)
     110bool GlobalObject::deleteProperty(JSC::ExecState* exec, const JSC::Identifier& propertyName)
    95111{
    96112    if (customGlobalObject)
    97         return customGlobalObject->deleteProperty(exec, propertyName, checkDontDelete);
    98     return JSC::JSGlobalObject::deleteProperty(exec, propertyName, checkDontDelete);
    99 }
    100 
    101 bool GlobalObject::getPropertyAttributes(JSC::ExecState* exec, const JSC::Identifier& propertyName,
    102                                          unsigned& attributes) const
    103 {
    104     if (customGlobalObject)
    105         return customGlobalObject->getPropertyAttributes(exec, propertyName, attributes);
    106     return JSC::JSGlobalObject::getPropertyAttributes(exec, propertyName, attributes);
     113        return customGlobalObject->deleteProperty(exec, propertyName);
     114    return JSC::JSGlobalObject::deleteProperty(exec, propertyName);
    107115}
    108116
    109117void GlobalObject::getOwnPropertyNames(JSC::ExecState* exec, JSC::PropertyNameArray& propertyNames,
    110                                        bool includeNonEnumerable)
     118                                       JSC::EnumerationMode mode)
    111119{
    112120    if (customGlobalObject)
    113         customGlobalObject->getOwnPropertyNames(exec, propertyNames, includeNonEnumerable);
     121        customGlobalObject->getOwnPropertyNames(exec, propertyNames, mode);
    114122    else
    115         JSC::JSGlobalObject::getOwnPropertyNames(exec, propertyNames, includeNonEnumerable);
     123        JSC::JSGlobalObject::getOwnPropertyNames(exec, propertyNames, mode);
    116124}
    117125
  • trunk/src/script/bridge/qscriptglobalobject_p.h

    r651 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)
     
    5555                                    const JSC::Identifier& propertyName,
    5656                                    JSC::PropertySlot&);
     57    virtual bool getOwnPropertyDescriptor(JSC::ExecState*,
     58                                          const JSC::Identifier& propertyName,
     59                                          JSC::PropertyDescriptor&);
    5760    virtual void put(JSC::ExecState* exec, const JSC::Identifier& propertyName,
    5861                     JSC::JSValue, JSC::PutPropertySlot&);
     
    6063                                   JSC::JSValue value, unsigned attributes);
    6164    virtual bool deleteProperty(JSC::ExecState*,
    62                                 const JSC::Identifier& propertyName,
    63                                 bool checkDontDelete = true);
    64     virtual bool getPropertyAttributes(JSC::ExecState*, const JSC::Identifier&,
    65                                        unsigned&) const;
     65                                const JSC::Identifier& propertyName);
    6666    virtual void getOwnPropertyNames(JSC::ExecState*, JSC::PropertyNameArray&,
    67                                      bool includeNonEnumerable = false);
     67                                     JSC::EnumerationMode mode = JSC::ExcludeDontEnumProperties);
    6868    virtual void defineGetter(JSC::ExecState*, const JSC::Identifier& propertyName, JSC::JSObject* getterFunction, unsigned attributes = 0);
    6969    virtual void defineSetter(JSC::ExecState*, const JSC::Identifier& propertyName, JSC::JSObject* setterFunction, unsigned attributes = 0);
     
    9595                                    JSC::PropertySlot& slot)
    9696    { return originalGlobalObject->JSC::JSGlobalObject::getOwnPropertySlot(exec, propertyName, slot); }
     97    virtual bool getOwnPropertyDescriptor(JSC::ExecState* exec,
     98                                          const JSC::Identifier& propertyName,
     99                                          JSC::PropertyDescriptor& descriptor)
     100    { return originalGlobalObject->JSC::JSGlobalObject::getOwnPropertyDescriptor(exec, propertyName, descriptor); }
    97101    virtual void put(JSC::ExecState* exec, const JSC::Identifier& propertyName,
    98102                     JSC::JSValue value, JSC::PutPropertySlot& slot)
     
    101105    { originalGlobalObject->JSC::JSGlobalObject::putWithAttributes(exec, propertyName, value, attributes); }
    102106    virtual bool deleteProperty(JSC::ExecState* exec,
    103                                 const JSC::Identifier& propertyName, bool checkDontDelete = true)
    104     { return originalGlobalObject->JSC::JSGlobalObject::deleteProperty(exec, propertyName, checkDontDelete); }
    105     virtual bool getPropertyAttributes(JSC::ExecState* exec, const JSC::Identifier& propertyName,
    106                                        unsigned& attributes) const
    107     { return originalGlobalObject->JSC::JSGlobalObject::getPropertyAttributes(exec, propertyName, attributes); }
    108     virtual void getOwnPropertyNames(JSC::ExecState* exec, JSC::PropertyNameArray& propertyNames, bool includeNonEnumerable = false)
    109     { originalGlobalObject->JSC::JSGlobalObject::getOwnPropertyNames(exec, propertyNames, includeNonEnumerable); }
     107                                const JSC::Identifier& propertyName)
     108    { return originalGlobalObject->JSC::JSGlobalObject::deleteProperty(exec, propertyName); }
     109    virtual void getOwnPropertyNames(JSC::ExecState* exec, JSC::PropertyNameArray& propertyNames, JSC::EnumerationMode mode = JSC::ExcludeDontEnumProperties)
     110    { originalGlobalObject->JSC::JSGlobalObject::getOwnPropertyNames(exec, propertyNames, mode); }
    110111    virtual void defineGetter(JSC::ExecState* exec, const JSC::Identifier& propertyName, JSC::JSObject* getterFunction, unsigned attributes)
    111112    { originalGlobalObject->JSC::JSGlobalObject::defineGetter(exec, propertyName, getterFunction, attributes); }
  • trunk/src/script/bridge/qscriptobject.cpp

    r651 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)
     
    8282
    8383bool QScriptObject::deleteProperty(JSC::ExecState* exec,
    84                                    const JSC::Identifier& propertyName,
    85                                    bool checkDontDelete)
    86 {
    87     if (!d || !d->delegate)
    88         return JSC::JSObject::deleteProperty(exec, propertyName, checkDontDelete);
    89     return d->delegate->deleteProperty(this, exec, propertyName, checkDontDelete);
    90 }
    91 
    92 bool QScriptObject::getPropertyAttributes(JSC::ExecState* exec, const JSC::Identifier& propertyName,
    93                                           unsigned& attributes) const
    94 {
    95     if (!d || !d->delegate)
    96         return JSC::JSObject::getPropertyAttributes(exec, propertyName, attributes);
    97     return d->delegate->getPropertyAttributes(this, exec, propertyName, attributes);
     84                                   const JSC::Identifier& propertyName)
     85{
     86    if (!d || !d->delegate)
     87        return JSC::JSObject::deleteProperty(exec, propertyName);
     88    return d->delegate->deleteProperty(this, exec, propertyName);
    9889}
    9990
    10091void QScriptObject::getOwnPropertyNames(JSC::ExecState* exec, JSC::PropertyNameArray& propertyNames,
    101                                         bool includeNonEnumerable)
    102 {
    103     if (!d || !d->delegate) {
    104         JSC::JSObject::getOwnPropertyNames(exec, propertyNames, includeNonEnumerable);
    105         return;
    106     }
    107     d->delegate->getOwnPropertyNames(this, exec, propertyNames, includeNonEnumerable);
     92                                        JSC::EnumerationMode mode)
     93{
     94    if (!d || !d->delegate) {
     95        JSC::JSObject::getOwnPropertyNames(exec, propertyNames, mode);
     96        return;
     97    }
     98    d->delegate->getOwnPropertyNames(this, exec, propertyNames, mode);
    10899}
    109100
     
    190181
    191182bool QScriptObjectDelegate::deleteProperty(QScriptObject* object, JSC::ExecState* exec,
    192                                            const JSC::Identifier& propertyName,
    193                                            bool checkDontDelete)
    194 {
    195     return object->JSC::JSObject::deleteProperty(exec, propertyName, checkDontDelete);
    196 }
    197 
    198 bool QScriptObjectDelegate::getPropertyAttributes(const QScriptObject* object,
    199                                                   JSC::ExecState* exec,
    200                                                   const JSC::Identifier& propertyName,
    201                                                   unsigned& attributes) const
    202 {
    203     return object->JSC::JSObject::getPropertyAttributes(exec, propertyName, attributes);
     183                                           const JSC::Identifier& propertyName)
     184{
     185    return object->JSC::JSObject::deleteProperty(exec, propertyName);
    204186}
    205187
    206188void QScriptObjectDelegate::getOwnPropertyNames(QScriptObject* object, JSC::ExecState* exec,
    207189                                                JSC::PropertyNameArray& propertyNames,
    208                                                 bool includeNonEnumerable)
    209 {
    210     object->JSC::JSObject::getOwnPropertyNames(exec, propertyNames, includeNonEnumerable);
     190                                                JSC::EnumerationMode mode)
     191{
     192    object->JSC::JSObject::getOwnPropertyNames(exec, propertyNames, mode);
    211193}
    212194
  • trunk/src/script/bridge/qscriptobject_p.h

    r651 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)
     
    6868                     JSC::JSValue, JSC::PutPropertySlot&);
    6969    virtual bool deleteProperty(JSC::ExecState*,
    70                                 const JSC::Identifier& propertyName,
    71                                 bool checkDontDelete = true);
    72     virtual bool getPropertyAttributes(JSC::ExecState*, const JSC::Identifier&,
    73                                        unsigned&) const;
     70                                const JSC::Identifier& propertyName);
    7471    virtual void getOwnPropertyNames(JSC::ExecState*, JSC::PropertyNameArray&,
    75                                      bool includeNonEnumerable = false);
     72                                     JSC::EnumerationMode mode = JSC::ExcludeDontEnumProperties);
    7673    virtual void markChildren(JSC::MarkStack& markStack);
    7774    virtual JSC::CallType getCallData(JSC::CallData&);
     
    8582    static WTF::PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
    8683    {
    87         return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::ImplementsHasInstance | JSC::OverridesHasInstance));
     84        return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
    8885    }
    8986
     
    9592
    9693protected:
     94    static const unsigned StructureFlags = JSC::ImplementsHasInstance | JSC::OverridesHasInstance | JSC::OverridesGetOwnPropertySlot | JSC::OverridesMarkChildren | JSC::OverridesGetPropertyNames | JSObject::StructureFlags;
     95
    9796    Data *d;
    9897};
     
    129128                     JSC::JSValue, JSC::PutPropertySlot&);
    130129    virtual bool deleteProperty(QScriptObject*, JSC::ExecState*,
    131                                 const JSC::Identifier& propertyName,
    132                                 bool checkDontDelete = true);
    133     virtual bool getPropertyAttributes(const QScriptObject*, JSC::ExecState*,
    134                                        const JSC::Identifier&, unsigned&) const;
     130                                const JSC::Identifier& propertyName);
    135131    virtual void getOwnPropertyNames(QScriptObject*, JSC::ExecState*, JSC::PropertyNameArray&,
    136                                      bool includeNonEnumerable = false);
     132                                     JSC::EnumerationMode mode = JSC::ExcludeDontEnumProperties);
    137133    virtual void markChildren(QScriptObject*, JSC::MarkStack& markStack);
    138134    virtual JSC::CallType getCallData(QScriptObject*, JSC::CallData&);
  • trunk/src/script/bridge/qscriptqobject.cpp

    r651 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)
     
    3636#include "Error.h"
    3737#include "PrototypeFunction.h"
     38#include "NativeFunctionWrapper.h"
    3839#include "PropertyNameArray.h"
    3940#include "JSFunction.h"
     
    152153{
    153154    return (method.access() != QMetaMethod::Private)
    154         && ((index != 2) || !(opt & QScriptEngine::ExcludeDeleteLater));
     155        && ((index != 2) || !(opt & QScriptEngine::ExcludeDeleteLater))
     156        && (!(opt & QScriptEngine::ExcludeSlots) || (method.methodType() != QMetaMethod::Slot));
    155157}
    156158
     
    164166}
    165167
    166 static inline QByteArray methodName(const QMetaMethod &method)
    167 {
    168     QByteArray signature = method.signature();
    169     return signature.left(signature.indexOf('('));
    170 }
    171 
    172 static QVariant variantFromValue(QScriptEnginePrivate *eng,
    173                                  int targetType, const QScriptValue &value)
     168/*! \internal
     169  Calculates the length of the name of the given \a method by looking
     170  for the first '(' character.
     171*/
     172static inline int methodNameLength(const QMetaMethod &method)
     173{
     174    const char *signature = method.signature();
     175    const char *s = signature;
     176    while (*s && (*s != '('))
     177        ++s;
     178    return s - signature;
     179}
     180
     181/*! \internal
     182  Makes a deep copy of the first \a nameLength characters of the given
     183  method \a signature and returns the copy.
     184*/
     185static inline QByteArray methodName(const char *signature, int nameLength)
     186{
     187    return QByteArray(signature, nameLength);
     188}
     189
     190/*! \internal
     191
     192  Returns true if the name of the given \a method is the same as that
     193  specified by the (signature, nameLength) pair, otherwise returns
     194  false.
     195*/
     196static inline bool methodNameEquals(const QMetaMethod &method,
     197                                    const char *signature, int nameLength)
     198{
     199    const char *otherSignature = method.signature();
     200    return !qstrncmp(otherSignature, signature, nameLength)
     201        && (otherSignature[nameLength] == '(');
     202}
     203
     204static QVariant variantFromValue(JSC::ExecState *exec, int targetType, JSC::JSValue value)
    174205{
    175206    QVariant v(targetType, (void *)0);
    176     Q_ASSERT(eng);
    177     if (QScriptEnginePrivate::convert(value, targetType, v.data(), eng))
     207    if (QScriptEnginePrivate::convertValue(exec, value, targetType, v.data()))
    178208        return v;
    179209    if (uint(targetType) == QVariant::LastType)
    180         return value.toVariant();
    181     if (value.isVariant()) {
    182         v = value.toVariant();
     210        return QScriptEnginePrivate::toVariant(exec, value);
     211    if (QScriptEnginePrivate::isVariant(value)) {
     212        v = QScriptEnginePrivate::variantValue(value);
    183213        if (v.canConvert(QVariant::Type(targetType))) {
    184214            v.convert(QVariant::Type(targetType));
     
    313343        return QList<int>();
    314344    QList<int> result;
    315     QString name = functionName();
    316345    const QMetaObject *meta = metaObject();
     346    QMetaMethod method = meta->method(initialIndex());
     347    int nameLength = methodNameLength(method);
    317348    for (int index = mostGeneralMethod() - 1; index >= 0; --index) {
    318         QString otherName = QString::fromLatin1(methodName(meta->method(index)));
    319         if (otherName == name)
     349        if (methodNameEquals(meta->method(index), method.signature(), nameLength))
    320350            result.append(index);
    321351    }
    322352    return result;
    323 }
    324 
    325 QString QtFunction::functionName() const
    326 {
    327     const QMetaObject *meta = metaObject();
    328     if (!meta)
    329         return QString();
    330     QMetaMethod method = meta->method(initialIndex());
    331     return QLatin1String(methodName(method));
    332353}
    333354
     
    418439    inline QScriptMetaMethod()
    419440        { }
    420     inline QScriptMetaMethod(const QByteArray &name, const QVector<QScriptMetaType> &types)
    421         : m_name(name), m_types(types), m_firstUnresolvedIndex(-1)
     441    inline QScriptMetaMethod(const QVector<QScriptMetaType> &types)
     442        : m_types(types), m_firstUnresolvedIndex(-1)
    422443    {
    423444        QVector<QScriptMetaType>::const_iterator it;
     
    432453    { return !m_types.isEmpty(); }
    433454
    434     QByteArray name() const
    435     { return m_name; }
    436 
    437455    inline QScriptMetaType returnType() const
    438456    { return m_types.at(0); }
     
    463481
    464482private:
    465     QByteArray m_name;
    466483    QVector<QScriptMetaType> m_types;
    467484    int m_firstUnresolvedIndex;
     
    500517                                 bool maybeOverloaded)
    501518{
    502     QByteArray funName;
    503519    QScriptMetaMethod chosenMethod;
    504520    int chosenIndex = -1;
     
    509525    QVector<int> conversionFailed;
    510526    int index;
     527    int nameLength = 0;
     528    const char *initialMethodSignature = 0;
    511529    exec->clearException();
    512530    QScriptEnginePrivate *engine = QScript::scriptEngineFromExec(exec);
     
    514532        QMetaMethod method = metaMethod(meta, callType, index);
    515533
    516         if (index == initialIndex)
    517             funName = methodName(method);
    518         else {
    519             if (methodName(method) != funName)
     534        if (index == initialIndex) {
     535            initialMethodSignature = method.signature();
     536            nameLength = methodNameLength(method);
     537        } else {
     538            if (!methodNameEquals(method, initialMethodSignature, nameLength))
    520539                continue;
    521540        }
    522541
     542        QList<QByteArray> parameterTypeNames = method.parameterTypes();
     543
    523544        QVector<QScriptMetaType> types;
     545        types.resize(1 + parameterTypeNames.size());
     546        QScriptMetaType *typesData = types.data();
    524547        // resolve return type
    525548        QByteArray returnTypeName = method.typeName();
    526549        int rtype = QMetaType::type(returnTypeName);
    527550        if ((rtype == 0) && !returnTypeName.isEmpty()) {
    528             if (returnTypeName == "QVariant") {
    529                 types.append(QScriptMetaType::variant());
    530             } else {
    531                 int enumIndex = indexOfMetaEnum(meta, returnTypeName);
    532                 if (enumIndex != -1)
    533                     types.append(QScriptMetaType::metaEnum(enumIndex, returnTypeName));
    534                 else
    535                     types.append(QScriptMetaType::unresolved(returnTypeName));
    536             }
     551            int enumIndex = indexOfMetaEnum(meta, returnTypeName);
     552            if (enumIndex != -1)
     553                typesData[0] = QScriptMetaType::metaEnum(enumIndex, returnTypeName);
     554            else
     555                typesData[0] = QScriptMetaType::unresolved(returnTypeName);
    537556        } else {
    538557            if (callType == QMetaMethod::Constructor)
    539                 types.append(QScriptMetaType::metaType(QMetaType::QObjectStar, "QObject*"));
    540             else if (returnTypeName == "QVariant")
    541                 types.append(QScriptMetaType::variant());
     558                typesData[0] = QScriptMetaType::metaType(QMetaType::QObjectStar, "QObject*");
     559            else if (rtype == QMetaType::QVariant)
     560                typesData[0] = QScriptMetaType::variant();
    542561            else
    543                 types.append(QScriptMetaType::metaType(rtype, returnTypeName));
     562                typesData[0] = QScriptMetaType::metaType(rtype, returnTypeName);
    544563        }
    545564
    546565        // resolve argument types
    547         QList<QByteArray> parameterTypeNames = method.parameterTypes();
    548566        for (int i = 0; i < parameterTypeNames.count(); ++i) {
    549567            QByteArray argTypeName = parameterTypeNames.at(i);
    550568            int atype = QMetaType::type(argTypeName);
    551569            if (atype == 0) {
    552                 if (argTypeName == "QVariant") {
    553                     types.append(QScriptMetaType::variant());
    554                 } else {
    555                     int enumIndex = indexOfMetaEnum(meta, argTypeName);
    556                     if (enumIndex != -1)
    557                         types.append(QScriptMetaType::metaEnum(enumIndex, argTypeName));
    558                     else
    559                         types.append(QScriptMetaType::unresolved(argTypeName));
    560                 }
     570                int enumIndex = indexOfMetaEnum(meta, argTypeName);
     571                if (enumIndex != -1)
     572                    typesData[1 + i] = QScriptMetaType::metaEnum(enumIndex, argTypeName);
     573                else
     574                    typesData[1 + i] = QScriptMetaType::unresolved(argTypeName);
     575            } else if (atype == QMetaType::QVariant) {
     576                typesData[1 + i] = QScriptMetaType::variant();
    561577            } else {
    562                 if (argTypeName == "QVariant")
    563                     types.append(QScriptMetaType::variant());
    564                 else
    565                     types.append(QScriptMetaType::metaType(atype, argTypeName));
    566             }
    567         }
    568 
    569         QScriptMetaMethod mtd = QScriptMetaMethod(methodName(method), types);
     578                typesData[1 + i] = QScriptMetaType::metaType(atype, argTypeName);
     579            }
     580        }
     581
     582        QScriptMetaMethod mtd = QScriptMetaMethod(types);
    570583
    571584        if (int(scriptArgs.size()) < mtd.argumentCount()) {
     
    592605        int matchDistance = 0;
    593606        for (int i = 0; converted && i < mtd.argumentCount(); ++i) {
    594             QScriptValue actual;
     607            JSC::JSValue actual;
    595608            if (i < (int)scriptArgs.size())
    596                 actual = engine->scriptValueFromJSCValue(scriptArgs.at(i));
     609                actual = scriptArgs.at(i);
    597610            else
    598                 actual = QScriptValue(QScriptValue::UndefinedValue);
     611                actual = JSC::jsUndefined();
    599612            QScriptMetaType argType = mtd.argumentType(i);
    600613            int tid = -1;
     
    602615            if (argType.isUnresolved()) {
    603616                v = QVariant(QMetaType::QObjectStar, (void *)0);
    604                 converted = engine->convertToNativeQObject(
    605                     actual, argType.name(), reinterpret_cast<void* *>(v.data()));
     617                converted = QScriptEnginePrivate::convertToNativeQObject(
     618                    exec, actual, argType.name(), reinterpret_cast<void* *>(v.data()));
    606619            } else if (argType.isVariant()) {
    607                 if (actual.isVariant()) {
    608                     v = actual.toVariant();
     620                if (QScriptEnginePrivate::isVariant(actual)) {
     621                    v = QScriptEnginePrivate::variantValue(actual);
    609622                } else {
    610                     v = actual.toVariant();
     623                    v = QScriptEnginePrivate::toVariant(exec, actual);
    611624                    converted = v.isValid() || actual.isUndefined() || actual.isNull();
    612625                }
     
    614627                tid = argType.typeId();
    615628                v = QVariant(tid, (void *)0);
    616                 converted = QScriptEnginePrivate::convert(actual, tid, v.data(), engine);
     629                converted = QScriptEnginePrivate::convertValue(exec, actual, tid, v.data());
    617630                if (exec->hadException())
    618631                    return exec->exception();
     
    620633
    621634            if (!converted) {
    622                 if (actual.isVariant()) {
     635                if (QScriptEnginePrivate::isVariant(actual)) {
    623636                    if (tid == -1)
    624637                        tid = argType.typeId();
    625                     QVariant vv = actual.toVariant();
     638                    QVariant vv = QScriptEnginePrivate::variantValue(actual);
    626639                    if (vv.canConvert(QVariant::Type(tid))) {
    627640                        v = vv;
     
    650663                    if (m.isValid()) {
    651664                        if (actual.isNumber()) {
    652                             int ival = actual.toInt32();
     665                            int ival = QScriptEnginePrivate::toInt32(exec, actual);
    653666                            if (m.valueToKey(ival) != 0) {
    654667                                qVariantSetValue(v, ival);
     
    657670                            }
    658671                        } else {
    659                             QString sval = actual.toString();
    660                             int ival = m.keyToValue(sval.toLatin1());
     672                            JSC::UString sval = QScriptEnginePrivate::toString(exec, actual);
     673                            int ival = m.keyToValue(convertToLatin1(sval));
    661674                            if (ival != -1) {
    662675                                qVariantSetValue(v, ival);
     
    719732                        break;
    720733                    }
    721                 } else if (actual.isDate()) {
     734                } else if (QScriptEnginePrivate::isDate(actual)) {
    722735                    switch (tid) {
    723736                    case QMetaType::QDateTime:
     
    734747                        break;
    735748                    }
    736                 } else if (actual.isRegExp()) {
     749                } else if (QScriptEnginePrivate::isRegExp(actual)) {
    737750                    switch (tid) {
    738751                    case QMetaType::QRegExp:
     
    743756                        break;
    744757                    }
    745                 } else if (actual.isVariant()) {
     758                } else if (QScriptEnginePrivate::isVariant(actual)) {
    746759                    if (argType.isVariant()
    747                         || (actual.toVariant().userType() == tid)) {
     760                        || (QScriptEnginePrivate::toVariant(exec, actual).userType() == tid)) {
    748761                        // perfect
    749762                    } else {
    750763                        matchDistance += 10;
    751764                    }
    752                 } else if (actual.isArray()) {
     765                } else if (QScriptEnginePrivate::isArray(actual)) {
    753766                    switch (tid) {
    754767                    case QMetaType::QStringList:
     
    760773                        break;
    761774                    }
    762                 } else if (actual.isQObject()) {
     775                } else if (QScriptEnginePrivate::isQObject(actual)) {
    763776                    switch (tid) {
    764777                    case QMetaType::QObjectStar:
     
    842855//        engine->notifyFunctionEntry(context);
    843856//#endif
     857        QString funName = QString::fromLatin1(methodName(initialMethodSignature, nameLength));
    844858        if (!conversionFailed.isEmpty()) {
    845859            QString message = QString::fromLatin1("incompatible type of argument(s) in call to %0(); candidates were\n")
    846                               .arg(QLatin1String(funName));
     860                              .arg(funName);
    847861            for (int i = 0; i < conversionFailed.size(); ++i) {
    848862                if (i > 0)
     
    859873            QString unresolvedTypeName = QString::fromLatin1(unresolvedType.name());
    860874            QString message = QString::fromLatin1("cannot call %0(): ")
    861                               .arg(QString::fromLatin1(funName));
     875                              .arg(funName);
    862876            if (unresolvedIndex > 0) {
    863877                message.append(QString::fromLatin1("argument %0 has unknown type `%1'").
     
    871885        } else {
    872886            QString message = QString::fromLatin1("too few arguments in call to %0(); candidates are\n")
    873                               .arg(QLatin1String(funName));
     887                              .arg(funName);
    874888            for (int i = 0; i < tooFewArgs.size(); ++i) {
    875889                if (i > 0)
     
    887901                && (metaArgs.matchDistance == candidates.at(1).matchDistance)) {
    888902                // ambiguous call
     903                QByteArray funName = methodName(initialMethodSignature, nameLength);
    889904                QString message = QString::fromLatin1("ambiguous call of overloaded function %0(); candidates were\n")
    890905                                  .arg(QLatin1String(funName));
     
    954969                QScriptMetaType retType = chosenMethod.returnType();
    955970                if (retType.isVariant()) {
    956                     result = engine->jscValueFromVariant(*(QVariant *)params[0]);
     971                    result = QScriptEnginePrivate::jscValueFromVariant(exec, *(QVariant *)params[0]);
    957972                } else if (retType.typeId() != 0) {
    958                     result = engine->scriptValueToJSCValue(engine->create(retType.typeId(), params[0]));
    959                     if (!result) {
    960                         QScriptValue sv = QScriptEnginePrivate::get(engine)->newVariant(QVariant(retType.typeId(), params[0]));
    961                         result = engine->scriptValueToJSCValue(sv);
    962                     }
     973                    result = QScriptEnginePrivate::create(exec, retType.typeId(), params[0]);
     974                    if (!result)
     975                        result = engine->newVariant(QVariant(retType.typeId(), params[0]));
    963976                } else {
    964977                    result = JSC::jsUndefined();
     
    10501063        return throwError(exec, JSC::TypeError, "callee is not a QtPropertyFunction object");
    10511064    QtPropertyFunction *qfun =  static_cast<QtPropertyFunction*>(callee);
    1052     QScriptEnginePrivate *eng_p = scriptEngineFromExec(exec);
    1053     JSC::ExecState *previousFrame = eng_p->currentFrame;
    1054     eng_p->currentFrame = exec;
    1055     eng_p->pushContext(exec, thisValue, args, callee);
    1056     JSC::JSValue result = qfun->execute(eng_p->currentFrame, thisValue, args);
    1057     eng_p->popContext();
    1058     eng_p->currentFrame = previousFrame;
    1059     return result;
     1065    return qfun->execute(exec, thisValue, args);
    10601066}
    10611067
     
    10661072    JSC::JSValue result = JSC::jsUndefined();
    10671073
    1068     // ### don't go via QScriptValue
    10691074    QScriptEnginePrivate *engine = scriptEngineFromExec(exec);
    1070     thisValue = engine->toUsableValue(thisValue);
    1071     QScriptValue object = engine->scriptValueFromJSCValue(thisValue);
    1072     QObject *qobject = object.toQObject();
     1075    JSC::ExecState *previousFrame = engine->currentFrame;
     1076    engine->currentFrame = exec;
     1077
     1078    JSC::JSValue qobjectValue = engine->toUsableValue(thisValue);
     1079    QObject *qobject = QScriptEnginePrivate::toQObject(exec, qobjectValue);
    10731080    while ((!qobject || (qobject->metaObject() != data->meta))
    1074            && object.prototype().isObject()) {
    1075         object = object.prototype();
    1076         qobject = object.toQObject();
     1081        && JSC::asObject(qobjectValue)->prototype().isObject()) {
     1082        qobjectValue = JSC::asObject(qobjectValue)->prototype();
     1083        qobject = QScriptEnginePrivate::toQObject(exec, qobjectValue);
    10771084    }
    10781085    Q_ASSERT_X(qobject, Q_FUNC_INFO, "this-object must be a QObject");
     
    10861093            QScriptEngine *oldEngine = 0;
    10871094            if (scriptable) {
     1095                engine->pushContext(exec, thisValue, args, this);
    10881096                oldEngine = QScriptablePrivate::get(scriptable)->engine;
    10891097                QScriptablePrivate::get(scriptable)->engine = QScriptEnginePrivate::get(engine);
     
    10921100            QVariant v = prop.read(qobject);
    10931101
    1094             if (scriptable)
     1102            if (scriptable) {
    10951103                QScriptablePrivate::get(scriptable)->engine = oldEngine;
    1096 
    1097             result = engine->jscValueFromVariant(v);
     1104                engine->popContext();
     1105            }
     1106
     1107            result = QScriptEnginePrivate::jscValueFromVariant(exec, v);
    10981108        }
    10991109    } else {
     
    11071117            v = (QString)arg.toString(exec);
    11081118        } else {
    1109             // ### don't go via QScriptValue
    1110             QScriptValue tmp = engine->scriptValueFromJSCValue(arg);
    1111             v = variantFromValue(engine, prop.userType(), tmp);
     1119            v = variantFromValue(exec, prop.userType(), arg);
    11121120        }
    11131121
     
    11151123        QScriptEngine *oldEngine = 0;
    11161124        if (scriptable) {
     1125            engine->pushContext(exec, thisValue, args, this);
    11171126            oldEngine = QScriptablePrivate::get(scriptable)->engine;
    11181127            QScriptablePrivate::get(scriptable)->engine = QScriptEnginePrivate::get(engine);
     
    11211130        prop.write(qobject, v);
    11221131
    1123         if (scriptable)
     1132        if (scriptable) {
    11241133            QScriptablePrivate::get(scriptable)->engine = oldEngine;
     1134            engine->popContext();
     1135        }
    11251136
    11261137        result = arg;
    11271138    }
     1139    engine->currentFrame = previousFrame;
    11281140    return result;
    11291141}
     
    11771189    //Note: this has to be kept in sync with getOwnPropertyDescriptor
    11781190#ifndef QT_NO_PROPERTIES
    1179     QByteArray name = QString(propertyName.ustring()).toLatin1();
     1191    QByteArray name = convertToLatin1(propertyName.ustring());
    11801192    QObject *qobject = data->value;
    11811193    if (!qobject) {
     
    12381250                        val = JSC::jsUndefined();
    12391251                    else
    1240                         val = eng->jscValueFromVariant(prop.read(qobject));
     1252                        val = QScriptEnginePrivate::jscValueFromVariant(exec, prop.read(qobject));
    12411253                    slot.setValue(val);
    12421254                }
     
    12481260    index = qobject->dynamicPropertyNames().indexOf(name);
    12491261    if (index != -1) {
    1250         JSC::JSValue val = eng->jscValueFromVariant(qobject->property(name));
     1262        JSC::JSValue val = QScriptEnginePrivate::jscValueFromVariant(exec, qobject->property(name));
    12511263        slot.setValue(val);
    12521264        return true;
     
    12581270        QMetaMethod method = meta->method(index);
    12591271        if (hasMethodAccess(method, index, opt)
    1260             && (methodName(method) == name)) {
     1272            && methodNameEquals(method, name.constData(), name.length())) {
    12611273            QtFunction *fun = new (exec)QtFunction(
    12621274                object, index, /*maybeOverloaded=*/true,
     
    12751287            if (child->objectName() == QString(propertyName.ustring())) {
    12761288                QScriptEngine::QObjectWrapOptions opt = QScriptEngine::PreferExistingWrapperObject;
    1277                 QScriptValue tmp = QScriptEnginePrivate::get(eng)->newQObject(child, QScriptEngine::QtOwnership, opt);
    1278                 slot.setValue(eng->scriptValueToJSCValue(tmp));
     1289                slot.setValue(eng->newQObject(child, QScriptEngine::QtOwnership, opt));
    12791290                return true;
    12801291            }
     
    12931304                                         JSC::PropertyDescriptor &descriptor)
    12941305{
    1295     //Note: this has to be kept in sync with getOwnPropertySlot abd getPropertyAttributes
     1306    //Note: this has to be kept in sync with getOwnPropertySlot
    12961307#ifndef QT_NO_PROPERTIES
    1297     QByteArray name = QString(propertyName.ustring()).toLatin1();
     1308    QByteArray name = convertToLatin1(propertyName.ustring());
    12981309    QObject *qobject = data->value;
    12991310    if (!qobject) {
     
    13711382                        val = JSC::jsUndefined();
    13721383                    else
    1373                         val = eng->jscValueFromVariant(prop.read(qobject));
     1384                        val = QScriptEnginePrivate::jscValueFromVariant(exec, prop.read(qobject));
    13741385                    descriptor.setDescriptor(val, attributes);
    13751386                }
     
    13811392    index = qobject->dynamicPropertyNames().indexOf(name);
    13821393    if (index != -1) {
    1383         JSC::JSValue val = eng->jscValueFromVariant(qobject->property(name));
     1394        JSC::JSValue val = QScriptEnginePrivate::jscValueFromVariant(exec, qobject->property(name));
    13841395        descriptor.setDescriptor(val, QObjectMemberAttribute);
    13851396        return true;
     
    13911402        QMetaMethod method = meta->method(index);
    13921403        if (hasMethodAccess(method, index, opt)
    1393             && (methodName(method) == name)) {
     1404            && methodNameEquals(method, name.constData(), name.length())) {
    13941405            QtFunction *fun = new (exec)QtFunction(
    13951406                object, index, /*maybeOverloaded=*/true,
     
    14111422            if (child->objectName() == QString(propertyName.ustring())) {
    14121423                QScriptEngine::QObjectWrapOptions opt = QScriptEngine::PreferExistingWrapperObject;
    1413                 QScriptValue tmp = QScriptEnginePrivate::get(eng)->newQObject(child, QScriptEngine::QtOwnership, opt);
    1414                 descriptor.setDescriptor(eng->scriptValueToJSCValue(tmp), JSC::ReadOnly | JSC::DontDelete | JSC::DontEnum);
     1424                descriptor.setDescriptor(eng->newQObject(child, QScriptEngine::QtOwnership, opt),
     1425                                        JSC::ReadOnly | JSC::DontDelete | JSC::DontEnum);
    14151426                return true;
    14161427            }
     
    14291440{
    14301441#ifndef QT_NO_PROPERTIES
    1431     QByteArray name = ((QString)propertyName.ustring()).toLatin1();
     1442    QByteArray name = convertToLatin1(propertyName.ustring());
    14321443    QObject *qobject = data->value;
    14331444    if (!qobject) {
     
    14911502                        v = (QString)value.toString(exec);
    14921503                    } else {
    1493                         v = eng->jscValueToVariant(value, prop.userType());
     1504                        v = QScriptEnginePrivate::jscValueToVariant(exec, value, prop.userType());
    14941505                    }
    14951506                    (void)prop.write(qobject, v);
     
    15051516        QMetaMethod method = meta->method(index);
    15061517        if (hasMethodAccess(method, index, opt)
    1507             && (methodName(method) == name)) {
     1518            && methodNameEquals(method, name.constData(), name.length())) {
    15081519            data->cachedMembers.insert(name, value);
    15091520            return;
     
    15131524    index = qobject->dynamicPropertyNames().indexOf(name);
    15141525    if ((index != -1) || (opt & QScriptEngine::AutoCreateDynamicProperties)) {
    1515         QVariant v = eng->scriptValueFromJSCValue(value).toVariant();
     1526        QVariant v = QScriptEnginePrivate::toVariant(exec, value);
    15161527        (void)qobject->setProperty(name, v);
    15171528        return;
     
    15231534
    15241535bool QObjectDelegate::deleteProperty(QScriptObject *object, JSC::ExecState *exec,
    1525                                      const JSC::Identifier& propertyName,
    1526                                      bool checkDontDelete)
     1536                                     const JSC::Identifier& propertyName)
    15271537{
    15281538#ifndef QT_NO_PROPERTIES
    1529     QByteArray name = ((QString)propertyName.ustring()).toLatin1();
     1539    QByteArray name = convertToLatin1(propertyName.ustring());
    15301540    QObject *qobject = data->value;
    15311541    if (!qobject) {
     
    15641574    }
    15651575
    1566     return QScriptObjectDelegate::deleteProperty(object, exec, propertyName, checkDontDelete);
     1576    return QScriptObjectDelegate::deleteProperty(object, exec, propertyName);
    15671577#else //QT_NO_PROPERTIES
    15681578    return false;
     
    15701580}
    15711581
    1572 bool QObjectDelegate::getPropertyAttributes(const QScriptObject *object,
    1573                                             JSC::ExecState *exec,
    1574                                             const JSC::Identifier &propertyName,
    1575                                             unsigned &attributes) const
    1576 {
    1577 #ifndef QT_NO_PROPERTIES
    1578     //Note: this has to be kept in sync with getOwnPropertyDescriptor and getOwnPropertySlot
    1579     QByteArray name = ((QString)propertyName.ustring()).toLatin1();
    1580     QObject *qobject = data->value;
    1581     if (!qobject)
    1582         return false;
    1583 
    1584     const QScriptEngine::QObjectWrapOptions &opt = data->options;
    1585     const QMetaObject *meta = qobject->metaObject();
    1586     int index = -1;
    1587     if (name.contains('(')) {
    1588         QByteArray normalized = QMetaObject::normalizedSignature(name);
    1589         if (-1 != (index = meta->indexOfMethod(normalized))) {
    1590             QMetaMethod method = meta->method(index);
    1591             if (hasMethodAccess(method, index, opt)) {
    1592                 if (!(opt & QScriptEngine::ExcludeSuperClassMethods)
    1593                     || (index >= meta->methodOffset())) {
    1594                     attributes = QObjectMemberAttribute;
    1595                     if (opt & QScriptEngine::SkipMethodsInEnumeration)
    1596                         attributes |= JSC::DontEnum;
    1597                     return true;
    1598                 }
    1599             }
    1600         }
    1601     }
    1602 
    1603     index = meta->indexOfProperty(name);
    1604     if (index != -1) {
    1605         QMetaProperty prop = meta->property(index);
    1606         if (prop.isScriptable()) {
    1607             if (!(opt & QScriptEngine::ExcludeSuperClassProperties)
    1608                 || (index >= meta->propertyOffset())) {
    1609                 attributes = flagsForMetaProperty(prop);
    1610                 return true;
    1611             }
    1612         }
    1613     }
    1614 
    1615     index = qobject->dynamicPropertyNames().indexOf(name);
    1616     if (index != -1) {
    1617         attributes = QObjectMemberAttribute;
    1618         return true;
    1619     }
    1620 
    1621     const int offset = (opt & QScriptEngine::ExcludeSuperClassMethods)
    1622                        ? meta->methodOffset() : 0;
    1623     for (index = meta->methodCount() - 1; index >= offset; --index) {
    1624         QMetaMethod method = meta->method(index);
    1625         if (hasMethodAccess(method, index, opt)
    1626             && (methodName(method) == name)) {
    1627             attributes = QObjectMemberAttribute;
    1628             if (opt & QScriptEngine::SkipMethodsInEnumeration)
    1629                 attributes |= JSC::DontEnum;
    1630             return true;
    1631         }
    1632     }
    1633 
    1634     if (!(opt & QScriptEngine::ExcludeChildObjects)) {
    1635         QList<QObject*> children = qobject->children();
    1636         for (index = 0; index < children.count(); ++index) {
    1637             QObject *child = children.at(index);
    1638             if (child->objectName() == (QString)(propertyName.ustring())) {
    1639                 attributes = JSC::ReadOnly | JSC::DontDelete | JSC::DontEnum;
    1640                 return true;
    1641             }
    1642         }
    1643     }
    1644 
    1645     return QScriptObjectDelegate::getPropertyAttributes(object, exec, propertyName, attributes);
    1646 #else //QT_NO_PROPERTIES
    1647     return false;
    1648 #endif //QT_NO_PROPERTIES
    1649 }
    1650 
    16511582void QObjectDelegate::getOwnPropertyNames(QScriptObject *object, JSC::ExecState *exec,
    16521583                                          JSC::PropertyNameArray &propertyNames,
    1653                                           bool includeNonEnumerable)
     1584                                          JSC::EnumerationMode mode)
    16541585{
    16551586#ifndef QT_NO_PROPERTIES
     
    16961627    }
    16971628
    1698     QScriptObjectDelegate::getOwnPropertyNames(object, exec, propertyNames, includeNonEnumerable);
     1629    QScriptObjectDelegate::getOwnPropertyNames(object, exec, propertyNames, mode);
    16991630#endif //QT_NO_PROPERTIES
    17001631}
     
    18241755                                    | QScriptEngine::ExcludeChildObjects));
    18251756
    1826     putDirectFunction(exec, new (exec) JSC::PrototypeFunction(exec, prototypeFunctionStructure, /*length=*/0, exec->propertyNames().toString, qobjectProtoFuncToString), JSC::DontEnum);
    1827     putDirectFunction(exec, new (exec) JSC::PrototypeFunction(exec, prototypeFunctionStructure, /*length=*/1, JSC::Identifier(exec, "findChild"), qobjectProtoFuncFindChild), JSC::DontEnum);
    1828     putDirectFunction(exec, new (exec) JSC::PrototypeFunction(exec, prototypeFunctionStructure, /*length=*/1, JSC::Identifier(exec, "findChildren"), qobjectProtoFuncFindChildren), JSC::DontEnum);
     1757    putDirectFunction(exec, new (exec) JSC::NativeFunctionWrapper(exec, prototypeFunctionStructure, /*length=*/0, exec->propertyNames().toString, qobjectProtoFuncToString), JSC::DontEnum);
     1758    putDirectFunction(exec, new (exec) JSC::NativeFunctionWrapper(exec, prototypeFunctionStructure, /*length=*/1, JSC::Identifier(exec, "findChild"), qobjectProtoFuncFindChild), JSC::DontEnum);
     1759    putDirectFunction(exec, new (exec) JSC::NativeFunctionWrapper(exec, prototypeFunctionStructure, /*length=*/1, JSC::Identifier(exec, "findChildren"), qobjectProtoFuncFindChildren), JSC::DontEnum);
    18291760    this->structure()->setHasGetterSetterProperties(true);
    18301761}
     
    18631794    }
    18641795
    1865     QByteArray name = QString(propertyName.ustring()).toLatin1();
     1796    QByteArray name = convertToLatin1(propertyName.ustring());
    18661797
    18671798    for (int i = 0; i < meta->enumeratorCount(); ++i) {
     
    18791810}
    18801811
     1812bool QMetaObjectWrapperObject::getOwnPropertyDescriptor(
     1813    JSC::ExecState* exec, const JSC::Identifier& propertyName,
     1814    JSC::PropertyDescriptor& descriptor)
     1815{
     1816    const QMetaObject *meta = data->value;
     1817    if (!meta)
     1818        return false;
     1819
     1820    if (propertyName == exec->propertyNames().prototype) {
     1821        descriptor.setDescriptor(data->ctor
     1822                                 ? data->ctor.get(exec, propertyName)
     1823                                 : data->prototype,
     1824                                 JSC::DontDelete | JSC::DontEnum);
     1825        return true;
     1826    }
     1827
     1828    QByteArray name = QString(propertyName.ustring()).toLatin1();
     1829
     1830    for (int i = 0; i < meta->enumeratorCount(); ++i) {
     1831        QMetaEnum e = meta->enumerator(i);
     1832        for (int j = 0; j < e.keyCount(); ++j) {
     1833            const char *key = e.key(j);
     1834            if (!qstrcmp(key, name.constData())) {
     1835                descriptor.setDescriptor(JSC::JSValue(exec, e.value(j)),
     1836                                         JSC::ReadOnly | JSC::DontDelete);
     1837                return true;
     1838            }
     1839        }
     1840    }
     1841
     1842    return JSC::JSObject::getOwnPropertyDescriptor(exec, propertyName, descriptor);
     1843}
     1844
    18811845void QMetaObjectWrapperObject::put(JSC::ExecState* exec, const JSC::Identifier& propertyName,
    18821846                                   JSC::JSValue value, JSC::PutPropertySlot &slot)
     
    18911855    const QMetaObject *meta = data->value;
    18921856    if (meta) {
    1893         QByteArray name = QString(propertyName.ustring()).toLatin1();
     1857        QByteArray name = convertToLatin1(propertyName.ustring());
    18941858        for (int i = 0; i < meta->enumeratorCount(); ++i) {
    18951859            QMetaEnum e = meta->enumerator(i);
     
    19041868
    19051869bool QMetaObjectWrapperObject::deleteProperty(
    1906     JSC::ExecState *exec, const JSC::Identifier& propertyName,
    1907     bool checkDontDelete)
     1870    JSC::ExecState *exec, const JSC::Identifier& propertyName)
    19081871{
    19091872    if (propertyName == exec->propertyNames().prototype)
     
    19111874    const QMetaObject *meta = data->value;
    19121875    if (meta) {
    1913         QByteArray name = QString(propertyName.ustring()).toLatin1();
     1876        QByteArray name = convertToLatin1(propertyName.ustring());
    19141877        for (int i = 0; i < meta->enumeratorCount(); ++i) {
    19151878            QMetaEnum e = meta->enumerator(i);
     
    19201883        }
    19211884    }
    1922     return JSC::JSObject::deleteProperty(exec, propertyName, checkDontDelete);
    1923 }
    1924 
    1925 bool QMetaObjectWrapperObject::getPropertyAttributes(JSC::ExecState *exec,
    1926                                                      const JSC::Identifier &propertyName,
    1927                                                      unsigned &attributes) const
    1928 {
    1929     if (propertyName == exec->propertyNames().prototype) {
    1930         attributes = JSC::DontDelete;
    1931         return true;
    1932     }
    1933     const QMetaObject *meta = data->value;
    1934     if (meta) {
    1935         QByteArray name = QString(propertyName.ustring()).toLatin1();
    1936         for (int i = 0; i < meta->enumeratorCount(); ++i) {
    1937             QMetaEnum e = meta->enumerator(i);
    1938             for (int j = 0; j < e.keyCount(); ++j) {
    1939                 if (!qstrcmp(e.key(j), name.constData())) {
    1940                     attributes = JSC::ReadOnly | JSC::DontDelete;
    1941                     return true;
    1942                 }
    1943             }
    1944         }
    1945     }
    1946     return JSC::JSObject::getPropertyAttributes(exec, propertyName, attributes);
     1885    return JSC::JSObject::deleteProperty(exec, propertyName);
    19471886}
    19481887
    19491888void QMetaObjectWrapperObject::getOwnPropertyNames(JSC::ExecState *exec,
    19501889                                                   JSC::PropertyNameArray &propertyNames,
    1951                                                    bool includeNonEnumerable)
     1890                                                   JSC::EnumerationMode mode)
    19521891{
    19531892    const QMetaObject *meta = data->value;
     
    19591898            propertyNames.add(JSC::Identifier(exec, e.key(j)));
    19601899    }
    1961     JSC::JSObject::getOwnPropertyNames(exec, propertyNames, includeNonEnumerable);
     1900    JSC::JSObject::getOwnPropertyNames(exec, propertyNames, mode);
    19621901}
    19631902
     
    20782017    : QMetaObjectWrapperObject(exec, StaticQtMetaObject::get(), /*ctor=*/JSC::JSValue(), structure)
    20792018{
    2080     putDirectFunction(exec, new (exec) JSC::PrototypeFunction(exec, prototypeFunctionStructure, /*length=*/0, JSC::Identifier(exec, "className"), qmetaobjectProtoFuncClassName), JSC::DontEnum);
     2019    putDirectFunction(exec, new (exec) JSC::NativeFunctionWrapper(exec, prototypeFunctionStructure, /*length=*/0, JSC::Identifier(exec, "className"), qmetaobjectProtoFuncClassName), JSC::DontEnum);
    20812020}
    20822021
     
    21372076    JSC::JSValue senderWrapper;
    21382077    int signalIndex = -1;
     2078    QScript::APIShim shim(engine);
    21392079    for (int i = 0; i < connections.size(); ++i) {
    21402080        const QVector<QObjectConnection> &cs = connections.at(i);
     
    21792119    QVarLengthArray<JSC::JSValue, 8> argsVector(argc);
    21802120    for (int i = 0; i < argc; ++i) {
    2181         // ### optimize -- no need to convert via QScriptValue
    2182         QScriptValue actual;
     2121        JSC::JSValue actual;
    21832122        void *arg = argv[i + 1];
    21842123        QByteArray typeName = parameterTypes.at(i);
    21852124        int argType = QMetaType::type(parameterTypes.at(i));
    21862125        if (!argType) {
    2187             if (typeName == "QVariant") {
    2188                 actual = engine->scriptValueFromVariant(*reinterpret_cast<QVariant*>(arg));
    2189             } else {
    2190                 qWarning("QScriptEngine: Unable to handle unregistered datatype '%s' "
    2191                          "when invoking handler of signal %s::%s",
    2192                          typeName.constData(), meta->className(), method.signature());
    2193                 actual = QScriptValue(QScriptValue::UndefinedValue);
    2194             }
     2126            qWarning("QScriptEngine: Unable to handle unregistered datatype '%s' "
     2127                        "when invoking handler of signal %s::%s",
     2128                        typeName.constData(), meta->className(), method.signature());
     2129            actual = JSC::jsUndefined();
     2130        } else if (argType == QMetaType::QVariant) {
     2131            actual = QScriptEnginePrivate::jscValueFromVariant(exec, *reinterpret_cast<QVariant*>(arg));
    21952132        } else {
    2196             actual = engine->create(argType, arg);
    2197         }
    2198         argsVector[i] = engine->scriptValueToJSCValue(actual);
     2133            actual = QScriptEnginePrivate::create(exec, argType, arg);
     2134        }
     2135        argsVector[i] = actual;
    21992136    }
    22002137    JSC::ArgList jscArgs(argsVector.data(), argsVector.size());
  • trunk/src/script/bridge/qscriptqobject_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)
     
    8787                     JSC::JSValue, JSC::PutPropertySlot&);
    8888    virtual bool deleteProperty(QScriptObject*, JSC::ExecState*,
    89                                 const JSC::Identifier& propertyName,
    90                                 bool checkDontDelete = true);
    91     virtual bool getPropertyAttributes(const QScriptObject*, JSC::ExecState*,
    92                                        const JSC::Identifier&,
    93                                        unsigned&) const;
     89                                const JSC::Identifier& propertyName);
    9490    virtual void getOwnPropertyNames(QScriptObject*, JSC::ExecState*,
    9591                                     JSC::PropertyNameArray&,
    96                                      bool includeNonEnumerable = false);
     92                                     JSC::EnumerationMode mode = JSC::ExcludeDontEnumProperties);
    9793    virtual void markChildren(QScriptObject*, JSC::MarkStack& markStack);
    9894    virtual bool compareToObject(QScriptObject*, JSC::ExecState*, JSC::JSObject*);
     
    213209    int mostGeneralMethod(QMetaMethod *out = 0) const;
    214210    QList<int> overloadedIndexes() const;
    215     QString functionName() const;
    216211
    217212private:
     
    277272                                    const JSC::Identifier& propertyName,
    278273                                    JSC::PropertySlot&);
     274    virtual bool getOwnPropertyDescriptor(JSC::ExecState*,
     275                                          const JSC::Identifier& propertyName,
     276                                          JSC::PropertyDescriptor&);
    279277    virtual void put(JSC::ExecState* exec, const JSC::Identifier& propertyName,
    280278                     JSC::JSValue, JSC::PutPropertySlot&);
    281279    virtual bool deleteProperty(JSC::ExecState*,
    282                                 const JSC::Identifier& propertyName,
    283                                 bool checkDontDelete = true);
    284     virtual bool getPropertyAttributes(JSC::ExecState*, const JSC::Identifier&,
    285                                        unsigned&) const;
     280                                const JSC::Identifier& propertyName);
    286281    virtual void getOwnPropertyNames(JSC::ExecState*, JSC::PropertyNameArray&,
    287                                      bool includeNonEnumerable = false);
     282                                     JSC::EnumerationMode mode = JSC::ExcludeDontEnumProperties);
    288283    virtual void markChildren(JSC::MarkStack& markStack);
    289284
     
    305300    static WTF::PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
    306301    {
    307         return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::ImplementsHasInstance));
     302        return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
    308303    }
    309304
    310305protected:
     306    static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | JSC::OverridesMarkChildren | JSC::OverridesGetPropertyNames | JSC::ImplementsHasInstance | JSObject::StructureFlags;
     307
    311308    Data *data;
    312309};
  • trunk/src/script/bridge/qscriptvariant.cpp

    r651 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)
     
    3030#include "Error.h"
    3131#include "PrototypeFunction.h"
     32#include "JSFunction.h"
     33#include "NativeFunctionWrapper.h"
    3234#include "JSString.h"
    3335
     
    120122    if (value.isObject()) {
    121123        result = v.toString();
    122         if (result.isEmpty() && !v.canConvert(QVariant::String)) {
    123             result = "QVariant(";
    124             result += v.typeName();
    125             result += ")";
    126         }
     124        if (result.isEmpty() && !v.canConvert(QVariant::String))
     125            result = QString::fromLatin1("QVariant(%0)").arg(QString::fromLatin1(v.typeName()));
    127126    } else {
    128127        result = value.toString(exec);
     
    134133{
    135134    const QVariant &variant1 = value();
    136     return variant1 == scriptEngineFromExec(exec)->scriptValueFromJSCValue(o2).toVariant();
     135    return variant1 == QScriptEnginePrivate::toVariant(exec, o2);
    137136}
    138137
     
    143142    setDelegate(new QVariantDelegate(QVariant()));
    144143
    145     putDirectFunction(exec, new (exec) JSC::PrototypeFunction(exec, prototypeFunctionStructure, 0, exec->propertyNames().toString, variantProtoFuncToString), JSC::DontEnum);
    146     putDirectFunction(exec, new (exec) JSC::PrototypeFunction(exec, prototypeFunctionStructure, 0, exec->propertyNames().valueOf, variantProtoFuncValueOf), JSC::DontEnum);
     144    putDirectFunction(exec, new (exec) JSC::NativeFunctionWrapper(exec, prototypeFunctionStructure, 0, exec->propertyNames().toString, variantProtoFuncToString), JSC::DontEnum);
     145    putDirectFunction(exec, new (exec) JSC::NativeFunctionWrapper(exec, prototypeFunctionStructure, 0, exec->propertyNames().valueOf, variantProtoFuncValueOf), JSC::DontEnum);
    147146}
    148147
  • trunk/src/script/bridge/qscriptvariant_p.h

    r651 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)
Note: See TracChangeset for help on using the changeset viewer.