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

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

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk

  • trunk/src/script/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
Note: See TracChangeset for help on using the changeset viewer.