Changeset 846 for trunk/src/script/bridge/qscriptdeclarativeclass.cpp
- Timestamp:
- May 5, 2011, 5:36:53 AM (14 years ago)
- Location:
- trunk
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk
- Property svn:mergeinfo changed
/branches/vendor/nokia/qt/4.7.2 (added) merged: 845 /branches/vendor/nokia/qt/current merged: 844 /branches/vendor/nokia/qt/4.6.3 removed
- Property svn:mergeinfo changed
-
trunk/src/script/bridge/qscriptdeclarativeclass.cpp
r651 r846 1 1 /**************************************************************************** 2 2 ** 3 ** Copyright (C) 201 0Nokia Corporation and/or its subsidiary(-ies).3 ** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). 4 4 ** All rights reserved. 5 5 ** Contact: Nokia Corporation (qt-info@nokia.com) … … 25 25 #include "qscriptdeclarativeobject_p.h" 26 26 #include "qscriptobject_p.h" 27 #include "qscriptstaticscopeobject_p.h" 27 28 #include <QtScript/qscriptstring.h> 28 29 #include <QtScript/qscriptengine.h> … … 36 37 QT_BEGIN_NAMESPACE 37 38 39 /*! 40 \class QScriptDeclarativeClass::Value 41 \internal 42 \brief The QScriptDeclarativeClass::Value class acts as a container for JavaScript data types. 43 44 QScriptDeclarativeClass::Value class is similar to QScriptValue, but it is slightly faster. 45 Unlike QScriptValue, however, Value instances cannot be stored as they may not survive garbage 46 collection. If you need to store a Value, convert it to a QScriptValue and store that. 47 */ 48 49 QScriptDeclarativeClass::Value::Value() 50 { 51 new (this) JSC::JSValue(JSC::jsUndefined()); 52 } 53 54 QScriptDeclarativeClass::Value::Value(const Value &other) 55 { 56 new (this) JSC::JSValue((JSC::JSValue &)other); 57 } 58 59 static QScriptDeclarativeClass::Value jscToValue(const JSC::JSValue &val) 60 { 61 return QScriptDeclarativeClass::Value((QScriptDeclarativeClass::Value &)val); 62 } 63 64 QScriptDeclarativeClass::Value::Value(QScriptContext *ctxt, int value) 65 { 66 new (this) JSC::JSValue(QScriptEnginePrivate::frameForContext(ctxt), value); 67 } 68 69 QScriptDeclarativeClass::Value::Value(QScriptContext *ctxt, uint value) 70 { 71 new (this) JSC::JSValue(QScriptEnginePrivate::frameForContext(ctxt), value); 72 } 73 74 QScriptDeclarativeClass::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 82 QScriptDeclarativeClass::Value::Value(QScriptContext *ctxt, double value) 83 { 84 new (this) JSC::JSValue(QScriptEnginePrivate::frameForContext(ctxt), value); 85 } 86 87 QScriptDeclarativeClass::Value::Value(QScriptContext *ctxt, float value) 88 { 89 new (this) JSC::JSValue(QScriptEnginePrivate::frameForContext(ctxt), value); 90 } 91 92 QScriptDeclarativeClass::Value::Value(QScriptContext *ctxt, const QString &value) 93 { 94 new (this) JSC::JSValue(JSC::jsString(QScriptEnginePrivate::frameForContext(ctxt), value)); 95 } 96 97 QScriptDeclarativeClass::Value::Value(QScriptContext *ctxt, const QScriptValue &value) 98 { 99 new (this) JSC::JSValue(QScriptEnginePrivate::get(ctxt->engine())->scriptValueToJSCValue(value)); 100 } 101 102 QScriptDeclarativeClass::Value::Value(QScriptEngine *eng, int value) 103 { 104 new (this) JSC::JSValue(QScriptEnginePrivate::get(eng)->currentFrame, value); 105 } 106 107 QScriptDeclarativeClass::Value::Value(QScriptEngine *eng, uint value) 108 { 109 new (this) JSC::JSValue(QScriptEnginePrivate::get(eng)->currentFrame, value); 110 } 111 112 QScriptDeclarativeClass::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 120 QScriptDeclarativeClass::Value::Value(QScriptEngine *eng, double value) 121 { 122 new (this) JSC::JSValue(QScriptEnginePrivate::get(eng)->currentFrame, value); 123 } 124 125 QScriptDeclarativeClass::Value::Value(QScriptEngine *eng, float value) 126 { 127 new (this) JSC::JSValue(QScriptEnginePrivate::get(eng)->currentFrame, value); 128 } 129 130 QScriptDeclarativeClass::Value::Value(QScriptEngine *eng, const QString &value) 131 { 132 new (this) JSC::JSValue(JSC::jsString(QScriptEnginePrivate::get(eng)->currentFrame, value)); 133 } 134 135 QScriptDeclarativeClass::Value::Value(QScriptEngine *eng, const QScriptValue &value) 136 { 137 new (this) JSC::JSValue(QScriptEnginePrivate::get(eng)->scriptValueToJSCValue(value)); 138 } 139 140 QScriptDeclarativeClass::Value::~Value() 141 { 142 ((JSC::JSValue *)(this))->~JSValue(); 143 } 144 145 QScriptValue QScriptDeclarativeClass::Value::toScriptValue(QScriptEngine *engine) const 146 { 147 return QScriptEnginePrivate::get(engine)->scriptValueFromJSCValue((JSC::JSValue &)*this); 148 } 149 38 150 QScriptDeclarativeClass::PersistentIdentifier::PersistentIdentifier() 151 : identifier(0), engine(0) 39 152 { 40 153 new (&d) JSC::Identifier(); … … 43 156 QScriptDeclarativeClass::PersistentIdentifier::~PersistentIdentifier() 44 157 { 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 } 46 164 } 47 165 … … 49 167 { 50 168 identifier = other.identifier; 169 engine = other.engine; 51 170 new (&d) JSC::Identifier((JSC::Identifier &)(other.d)); 52 171 } … … 56 175 { 57 176 identifier = other.identifier; 177 engine = other.engine; 58 178 ((JSC::Identifier &)d) = (JSC::Identifier &)(other.d); 59 179 return *this; … … 75 195 Q_ASSERT(scriptClass); 76 196 77 QScriptEnginePrivate *p = static_cast<QScriptEnginePrivate *>(QObjectPrivate::get(engine)); 197 QScriptEnginePrivate *p = static_cast<QScriptEnginePrivate *>(QObjectPrivate::get(engine)); 198 QScript::APIShim shim(p); 78 199 79 200 JSC::ExecState* exec = p->currentFrame; … … 83 204 } 84 205 206 QScriptDeclarativeClass::Value 207 QScriptDeclarativeClass::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 85 223 QScriptDeclarativeClass *QScriptDeclarativeClass::scriptClass(const QScriptValue &v) 86 224 { 87 225 QScriptValuePrivate *d = QScriptValuePrivate::get(v); 88 if (!d || !d->isJSC() || !d->jscValue.inherits(&QScriptObject::info))226 if (!d || !d->isJSC()) 89 227 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 231 QScriptDeclarativeClass::Object *QScriptDeclarativeClass::object(const QScriptValue &v) 232 { 233 QScriptValuePrivate *d = QScriptValuePrivate::get(v); 234 if (!d || !d->isJSC()) 93 235 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); 107 237 } 108 238 … … 114 244 return QScriptValue(); 115 245 246 QScript::APIShim shim(d->engine); 116 247 JSC::ExecState *exec = d->engine->currentFrame; 117 248 JSC::JSObject *object = d->jscValue.getObject(); … … 137 268 return QScriptValue(); 138 269 270 QScript::APIShim shim(d->engine); 139 271 JSC::ExecState *exec = d->engine->currentFrame; 140 272 JSC::JSObject *object = d->jscValue.getObject(); … … 150 282 151 283 return QScriptValue(); 284 } 285 286 QScriptDeclarativeClass::Value 287 QScriptDeclarativeClass::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 311 QScriptDeclarativeClass::Value 312 QScriptDeclarativeClass::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(); 152 333 } 153 334 … … 162 343 const JSC::CallFrame *frame = QScriptEnginePrivate::frameForContext(context); 163 344 QScriptEnginePrivate *engine = QScript::scriptEngineFromExec(frame); 345 QScript::APIShim shim(engine); 164 346 165 347 JSC::ScopeChainNode *node = frame->scopeChain(); … … 222 404 223 405 QScriptEnginePrivate *d = QScriptEnginePrivate::get(engine); 406 QScript::APIShim shim(d); 224 407 225 408 JSC::CallFrame* newFrame = d->pushContext(d->currentFrame, … … 242 425 } 243 426 427 bool QScriptDeclarativeClass::supportsCall() const 428 { 429 return d_ptr->supportsCall; 430 } 431 432 void QScriptDeclarativeClass::setSupportsCall(bool c) 433 { 434 d_ptr->supportsCall = c; 435 } 436 244 437 QScriptDeclarativeClass::PersistentIdentifier 245 438 QScriptDeclarativeClass::createPersistentIdentifier(const QString &str) … … 247 440 QScriptEnginePrivate *p = 248 441 static_cast<QScriptEnginePrivate *>(QObjectPrivate::get(d_ptr->engine)); 442 QScript::APIShim shim(p); 249 443 JSC::ExecState* exec = p->currentFrame; 250 444 251 PersistentIdentifier rv( true);445 PersistentIdentifier rv(p); 252 446 new (&rv.d) JSC::Identifier(exec, (UChar *)str.constData(), str.size()); 253 447 rv.identifier = (void *)((JSC::Identifier &)rv.d).ustring().rep(); … … 260 454 QScriptEnginePrivate *p = 261 455 static_cast<QScriptEnginePrivate *>(QObjectPrivate::get(d_ptr->engine)); 456 QScript::APIShim shim(p); 262 457 JSC::ExecState* exec = p->currentFrame; 263 458 264 PersistentIdentifier rv( true);459 PersistentIdentifier rv(p); 265 460 new (&rv.d) JSC::Identifier(exec, (JSC::UString::Rep *)id); 266 461 rv.identifier = (void *)((JSC::Identifier &)rv.d).ustring().rep(); … … 291 486 } 292 487 293 QScriptValue QScriptDeclarativeClass::property(Object *object, const Identifier &name) 488 QScriptDeclarativeClass::Value 489 QScriptDeclarativeClass::property(Object *object, const Identifier &name) 294 490 { 295 491 Q_UNUSED(object); 296 492 Q_UNUSED(name); 297 return QScriptValue();493 return Value(); 298 494 } 299 495 … … 314 510 } 315 511 512 QScriptDeclarativeClass::Value QScriptDeclarativeClass::call(Object *object, 513 QScriptContext *ctxt) 514 { 515 Q_UNUSED(object); 516 Q_UNUSED(ctxt); 517 return Value(); 518 } 519 520 bool QScriptDeclarativeClass::compare(Object *o, Object *o2) 521 { 522 return o == o2; 523 } 524 316 525 QStringList QScriptDeclarativeClass::propertyNames(Object *object) 317 526 { … … 342 551 } 343 552 553 /*! 554 Creates a scope object with a fixed set of undeletable properties. 555 */ 556 QScriptValue 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 */ 581 QScriptValue 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 344 588 QT_END_NAMESPACE
Note:
See TracChangeset
for help on using the changeset viewer.