Changeset 846 for trunk/src/script/bridge
- Timestamp:
- May 5, 2011, 5:36:53 AM (14 years ago)
- Location:
- trunk
- Files:
-
- 20 edited
- 2 copied
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/bridge.pri
r561 r846 7 7 $$PWD/qscriptglobalobject.cpp \ 8 8 $$PWD/qscriptactivationobject.cpp \ 9 $$PWD/qscriptstaticscopeobject.cpp \ 9 10 $$PWD/qscriptdeclarativeobject.cpp \ 10 11 $$PWD/qscriptdeclarativeclass.cpp … … 18 19 $$PWD/qscriptglobalobject_p.h \ 19 20 $$PWD/qscriptactivationobject_p.h \ 21 $$PWD/qscriptstaticscopeobject_p.h \ 20 22 $$PWD/qscriptdeclarativeobject_p.h \ 21 23 $$PWD/qscriptdeclarativeclass_p.h -
trunk/src/script/bridge/qscriptactivationobject.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) … … 54 54 QScriptActivationObject::~QScriptActivationObject() 55 55 { 56 delete d ;56 delete d_ptr(); 57 57 } 58 58 … … 64 64 } 65 65 66 bool QScriptActivationObject::get PropertyAttributes(JSC::ExecState* exec, const JSC::Identifier& propertyName, unsigned& attributes) const66 bool QScriptActivationObject::getOwnPropertyDescriptor(JSC::ExecState* exec, const JSC::Identifier& propertyName, JSC::PropertyDescriptor& descriptor) 67 67 { 68 68 if (d_ptr()->delegate != 0) 69 return d_ptr()->delegate->get PropertyAttributes(exec, propertyName, attributes);70 return JSC::JSVariableObject::get PropertyAttributes(exec, propertyName, attributes);69 return d_ptr()->delegate->getOwnPropertyDescriptor(exec, propertyName, descriptor); 70 return JSC::JSVariableObject::getOwnPropertyDescriptor(exec, propertyName, descriptor); 71 71 } 72 72 73 void QScriptActivationObject::getOwnPropertyNames(JSC::ExecState* exec, JSC::PropertyNameArray& propertyNames, bool includeNonEnumerable)73 void QScriptActivationObject::getOwnPropertyNames(JSC::ExecState* exec, JSC::PropertyNameArray& propertyNames, JSC::EnumerationMode mode) 74 74 { 75 75 if (d_ptr()->delegate != 0) { 76 d_ptr()->delegate->getOwnPropertyNames(exec, propertyNames, includeNonEnumerable);76 d_ptr()->delegate->getOwnPropertyNames(exec, propertyNames, mode); 77 77 return; 78 78 } 79 return JSC::JSVariableObject::getOwnPropertyNames(exec, propertyNames, includeNonEnumerable);79 return JSC::JSVariableObject::getOwnPropertyNames(exec, propertyNames, mode); 80 80 } 81 81 … … 112 112 } 113 113 114 bool QScriptActivationObject::deleteProperty(JSC::ExecState* exec, const JSC::Identifier& propertyName , bool checkDontDelete)114 bool QScriptActivationObject::deleteProperty(JSC::ExecState* exec, const JSC::Identifier& propertyName) 115 115 { 116 116 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); 119 119 } 120 120 -
trunk/src/script/bridge/qscriptactivationobject_p.h
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) … … 52 52 53 53 virtual bool getOwnPropertySlot(JSC::ExecState*, const JSC::Identifier& propertyName, JSC::PropertySlot&); 54 virtual bool get PropertyAttributes(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); 56 56 57 57 virtual void putWithAttributes(JSC::ExecState *exec, const JSC::Identifier &propertyName, JSC::JSValue value, unsigned attributes); … … 59 59 virtual void put(JSC::ExecState*, unsigned propertyName, JSC::JSValue value); 60 60 61 virtual bool deleteProperty(JSC::ExecState*, const JSC::Identifier& propertyName , bool checkDontDelete = true);61 virtual bool deleteProperty(JSC::ExecState*, const JSC::Identifier& propertyName); 62 62 63 63 virtual void defineGetter(JSC::ExecState*, const JSC::Identifier& propertyName, JSC::JSObject* getterFunction); -
trunk/src/script/bridge/qscriptclassobject.cpp
r769 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) … … 79 79 if (flags & QScriptClass::HandlesReadAccess) { 80 80 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 } 81 87 slot.setValue(engine->scriptValueToJSCValue(value)); 88 return true; 89 } 90 return false; 91 } 92 93 bool 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); 82 135 return true; 83 136 } … … 106 159 107 160 bool ClassObjectDelegate::deleteProperty(QScriptObject* object, JSC::ExecState *exec, 108 const JSC::Identifier &propertyName, 109 bool checkDontDelete) 161 const JSC::Identifier &propertyName) 110 162 { 111 163 // ### avoid duplication of put() … … 125 177 return true; 126 178 } 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); 160 180 } 161 181 162 182 void ClassObjectDelegate::getOwnPropertyNames(QScriptObject* object, JSC::ExecState *exec, 163 183 JSC::PropertyNameArray &propertyNames, 164 bool includeNonEnumerable)184 JSC::EnumerationMode mode) 165 185 { 166 186 QScriptEnginePrivate *engine = scriptEngineFromExec(exec); … … 176 196 delete it; 177 197 } 178 QScriptObjectDelegate::getOwnPropertyNames(object, exec, propertyNames, includeNonEnumerable);198 QScriptObjectDelegate::getOwnPropertyNames(object, exec, propertyNames, mode); 179 199 } 180 200 … … 207 227 eng_p->popContext(); 208 228 eng_p->currentFrame = oldFrame; 209 return eng_p->jscValueFromVariant(result);229 return QScriptEnginePrivate::jscValueFromVariant(exec, result); 210 230 } 211 231 -
trunk/src/script/bridge/qscriptclassobject_p.h
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) … … 61 61 const JSC::Identifier& propertyName, 62 62 JSC::PropertySlot&); 63 virtual bool getOwnPropertyDescriptor(QScriptObject*, JSC::ExecState*, 64 const JSC::Identifier& propertyName, 65 JSC::PropertyDescriptor&); 63 66 virtual void put(QScriptObject*, JSC::ExecState* exec, 64 67 const JSC::Identifier& propertyName, 65 68 JSC::JSValue, JSC::PutPropertySlot&); 66 69 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); 72 71 virtual void getOwnPropertyNames(QScriptObject*, JSC::ExecState*, 73 72 JSC::PropertyNameArray&, 74 bool includeNonEnumerable = false);73 JSC::EnumerationMode mode = JSC::ExcludeDontEnumProperties); 75 74 76 75 virtual JSC::CallType getCallData(QScriptObject*, JSC::CallData&); -
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 -
trunk/src/script/bridge/qscriptdeclarativeclass_p.h
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) … … 48 48 { 49 49 public: 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 50 78 typedef void* Identifier; 51 79 … … 53 81 54 82 static QScriptValue newObject(QScriptEngine *, QScriptDeclarativeClass *, Object *); 83 static Value newObjectValue(QScriptEngine *, QScriptDeclarativeClass *, Object *); 55 84 static QScriptDeclarativeClass *scriptClass(const QScriptValue &); 56 85 static Object *object(const QScriptValue &); … … 58 87 static QScriptValue function(const QScriptValue &, const Identifier &); 59 88 static QScriptValue property(const QScriptValue &, const Identifier &); 89 static Value functionValue(const QScriptValue &, const Identifier &); 90 static Value propertyValue(const QScriptValue &, const Identifier &); 60 91 61 92 static QScriptValue scopeChainValue(QScriptContext *, int index); 62 93 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 *); 63 99 64 100 class Q_SCRIPT_EXPORT PersistentIdentifier … … 74 110 private: 75 111 friend class QScriptDeclarativeClass; 76 PersistentIdentifier(bool) : identifier(0), d(0) {} 112 PersistentIdentifier(QScriptEnginePrivate *e) : identifier(0), engine(e), d(0) {} 113 QScriptEnginePrivate *engine; 77 114 void *d; 78 115 }; … … 82 119 83 120 QScriptEngine *engine() const; 121 122 bool supportsCall() const; 123 void setSupportsCall(bool); 84 124 85 125 PersistentIdentifier createPersistentIdentifier(const QString &); … … 92 132 QScriptClass::QueryFlags flags); 93 133 94 virtual QScriptValue property(Object *, const Identifier &);134 virtual Value property(Object *, const Identifier &); 95 135 virtual void setProperty(Object *, const Identifier &name, const QScriptValue &); 96 136 virtual QScriptValue::PropertyFlags propertyFlags(Object *, const Identifier &); 137 virtual Value call(Object *, QScriptContext *); 138 virtual bool compare(Object *, Object *); 97 139 98 140 virtual QStringList propertyNames(Object *); -
trunk/src/script/bridge/qscriptdeclarativeobject.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) … … 67 67 JSC::PropertySlot &slot) 68 68 { 69 QScriptEnginePrivate *engine = scriptEngineFromExec(exec);70 69 QScriptDeclarativeClass::Identifier identifier = (void *)propertyName.ustring().rep(); 71 70 … … 75 74 m_class->queryProperty(m_object, identifier, QScriptClass::HandlesReadAccess); 76 75 if (flags & QScriptClass::HandlesReadAccess) { 77 QScript Value value= m_class->property(m_object, identifier);76 QScriptDeclarativeClass::Value val = m_class->property(m_object, identifier); 78 77 p->context = 0; 79 slot.setValue( engine->scriptValueToJSCValue(value));78 slot.setValue((const JSC::JSValue &)val); 80 79 return true; 81 80 } … … 90 89 { 91 90 QScriptEnginePrivate *engine = scriptEngineFromExec(exec); 91 QScript::SaveFrameHelper saveFrame(engine, exec); 92 92 QScriptDeclarativeClass::Identifier identifier = (void *)propertyName.ustring().rep(); 93 93 … … 107 107 108 108 bool DeclarativeObjectDelegate::deleteProperty(QScriptObject* object, JSC::ExecState *exec, 109 const JSC::Identifier &propertyName, 110 bool checkDontDelete) 109 const JSC::Identifier &propertyName) 111 110 { 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); 141 112 } 142 113 143 114 void DeclarativeObjectDelegate::getOwnPropertyNames(QScriptObject* object, JSC::ExecState *exec, 144 115 JSC::PropertyNameArray &propertyNames, 145 bool includeNonEnumerable)116 JSC::EnumerationMode mode) 146 117 { 147 118 QStringList properties = m_class->propertyNames(m_object); … … 151 122 } 152 123 153 QScriptObjectDelegate::getOwnPropertyNames(object, exec, propertyNames, includeNonEnumerable);124 QScriptObjectDelegate::getOwnPropertyNames(object, exec, propertyNames, mode); 154 125 } 155 126 156 127 JSC::CallType DeclarativeObjectDelegate::getCallData(QScriptObject *object, JSC::CallData &callData) 157 128 { 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 135 JSC::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); 159 158 } 160 159 … … 170 169 } 171 170 171 bool 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 172 188 } // namespace QScript 173 189 -
trunk/src/script/bridge/qscriptdeclarativeobject_p.h
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) … … 49 49 { 50 50 public: 51 QScriptDeclarativeClassPrivate() : engine(0), q_ptr(0), context(0) {}51 QScriptDeclarativeClassPrivate() : engine(0), q_ptr(0), context(0), supportsCall(false) {} 52 52 53 53 QScriptEngine *engine; 54 54 QScriptDeclarativeClass *q_ptr; 55 55 QScriptContext *context; 56 bool supportsCall:1; 56 57 57 58 static QScriptDeclarativeClassPrivate *get(QScriptDeclarativeClass *c) { … … 81 82 JSC::JSValue, JSC::PutPropertySlot&); 82 83 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); 88 85 virtual void getOwnPropertyNames(QScriptObject*, JSC::ExecState*, 89 86 JSC::PropertyNameArray&, 90 bool includeNonEnumerable = false);87 JSC::EnumerationMode mode = JSC::ExcludeDontEnumProperties); 91 88 92 89 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 93 93 virtual JSC::ConstructType getConstructData(QScriptObject*, JSC::ConstructData&); 94 94 95 95 virtual bool hasInstance(QScriptObject*, JSC::ExecState*, 96 96 JSC::JSValue value, JSC::JSValue proto); 97 98 bool compareToObject(QScriptObject *, JSC::ExecState *, JSC::JSObject *); 97 99 98 100 private: -
trunk/src/script/bridge/qscriptfunction.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) -
trunk/src/script/bridge/qscriptfunction_p.h
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) -
trunk/src/script/bridge/qscriptglobalobject.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) … … 73 73 } 74 74 75 bool 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 75 92 void GlobalObject::put(JSC::ExecState* exec, const JSC::Identifier& propertyName, 76 93 JSC::JSValue value, JSC::PutPropertySlot& slot) … … 91 108 } 92 109 93 bool GlobalObject::deleteProperty(JSC::ExecState* exec, 94 const JSC::Identifier& propertyName, bool checkDontDelete) 110 bool GlobalObject::deleteProperty(JSC::ExecState* exec, const JSC::Identifier& propertyName) 95 111 { 96 112 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); 107 115 } 108 116 109 117 void GlobalObject::getOwnPropertyNames(JSC::ExecState* exec, JSC::PropertyNameArray& propertyNames, 110 bool includeNonEnumerable)118 JSC::EnumerationMode mode) 111 119 { 112 120 if (customGlobalObject) 113 customGlobalObject->getOwnPropertyNames(exec, propertyNames, includeNonEnumerable);121 customGlobalObject->getOwnPropertyNames(exec, propertyNames, mode); 114 122 else 115 JSC::JSGlobalObject::getOwnPropertyNames(exec, propertyNames, includeNonEnumerable);123 JSC::JSGlobalObject::getOwnPropertyNames(exec, propertyNames, mode); 116 124 } 117 125 -
trunk/src/script/bridge/qscriptglobalobject_p.h
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) … … 55 55 const JSC::Identifier& propertyName, 56 56 JSC::PropertySlot&); 57 virtual bool getOwnPropertyDescriptor(JSC::ExecState*, 58 const JSC::Identifier& propertyName, 59 JSC::PropertyDescriptor&); 57 60 virtual void put(JSC::ExecState* exec, const JSC::Identifier& propertyName, 58 61 JSC::JSValue, JSC::PutPropertySlot&); … … 60 63 JSC::JSValue value, unsigned attributes); 61 64 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); 66 66 virtual void getOwnPropertyNames(JSC::ExecState*, JSC::PropertyNameArray&, 67 bool includeNonEnumerable = false);67 JSC::EnumerationMode mode = JSC::ExcludeDontEnumProperties); 68 68 virtual void defineGetter(JSC::ExecState*, const JSC::Identifier& propertyName, JSC::JSObject* getterFunction, unsigned attributes = 0); 69 69 virtual void defineSetter(JSC::ExecState*, const JSC::Identifier& propertyName, JSC::JSObject* setterFunction, unsigned attributes = 0); … … 95 95 JSC::PropertySlot& slot) 96 96 { 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); } 97 101 virtual void put(JSC::ExecState* exec, const JSC::Identifier& propertyName, 98 102 JSC::JSValue value, JSC::PutPropertySlot& slot) … … 101 105 { originalGlobalObject->JSC::JSGlobalObject::putWithAttributes(exec, propertyName, value, attributes); } 102 106 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); } 110 111 virtual void defineGetter(JSC::ExecState* exec, const JSC::Identifier& propertyName, JSC::JSObject* getterFunction, unsigned attributes) 111 112 { originalGlobalObject->JSC::JSGlobalObject::defineGetter(exec, propertyName, getterFunction, attributes); } -
trunk/src/script/bridge/qscriptobject.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) … … 82 82 83 83 bool 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); 98 89 } 99 90 100 91 void 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); 108 99 } 109 100 … … 190 181 191 182 bool 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); 204 186 } 205 187 206 188 void QScriptObjectDelegate::getOwnPropertyNames(QScriptObject* object, JSC::ExecState* exec, 207 189 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); 211 193 } 212 194 -
trunk/src/script/bridge/qscriptobject_p.h
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) … … 68 68 JSC::JSValue, JSC::PutPropertySlot&); 69 69 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); 74 71 virtual void getOwnPropertyNames(JSC::ExecState*, JSC::PropertyNameArray&, 75 bool includeNonEnumerable = false);72 JSC::EnumerationMode mode = JSC::ExcludeDontEnumProperties); 76 73 virtual void markChildren(JSC::MarkStack& markStack); 77 74 virtual JSC::CallType getCallData(JSC::CallData&); … … 85 82 static WTF::PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype) 86 83 { 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)); 88 85 } 89 86 … … 95 92 96 93 protected: 94 static const unsigned StructureFlags = JSC::ImplementsHasInstance | JSC::OverridesHasInstance | JSC::OverridesGetOwnPropertySlot | JSC::OverridesMarkChildren | JSC::OverridesGetPropertyNames | JSObject::StructureFlags; 95 97 96 Data *d; 98 97 }; … … 129 128 JSC::JSValue, JSC::PutPropertySlot&); 130 129 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); 135 131 virtual void getOwnPropertyNames(QScriptObject*, JSC::ExecState*, JSC::PropertyNameArray&, 136 bool includeNonEnumerable = false);132 JSC::EnumerationMode mode = JSC::ExcludeDontEnumProperties); 137 133 virtual void markChildren(QScriptObject*, JSC::MarkStack& markStack); 138 134 virtual JSC::CallType getCallData(QScriptObject*, JSC::CallData&); -
trunk/src/script/bridge/qscriptqobject.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) … … 36 36 #include "Error.h" 37 37 #include "PrototypeFunction.h" 38 #include "NativeFunctionWrapper.h" 38 39 #include "PropertyNameArray.h" 39 40 #include "JSFunction.h" … … 152 153 { 153 154 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)); 155 157 } 156 158 … … 164 166 } 165 167 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 */ 172 static 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 */ 185 static 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 */ 196 static 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 204 static QVariant variantFromValue(JSC::ExecState *exec, int targetType, JSC::JSValue value) 174 205 { 175 206 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())) 178 208 return v; 179 209 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); 183 213 if (v.canConvert(QVariant::Type(targetType))) { 184 214 v.convert(QVariant::Type(targetType)); … … 313 343 return QList<int>(); 314 344 QList<int> result; 315 QString name = functionName();316 345 const QMetaObject *meta = metaObject(); 346 QMetaMethod method = meta->method(initialIndex()); 347 int nameLength = methodNameLength(method); 317 348 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)) 320 350 result.append(index); 321 351 } 322 352 return result; 323 }324 325 QString QtFunction::functionName() const326 {327 const QMetaObject *meta = metaObject();328 if (!meta)329 return QString();330 QMetaMethod method = meta->method(initialIndex());331 return QLatin1String(methodName(method));332 353 } 333 354 … … 418 439 inline QScriptMetaMethod() 419 440 { } 420 inline QScriptMetaMethod(const Q ByteArray &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) 422 443 { 423 444 QVector<QScriptMetaType>::const_iterator it; … … 432 453 { return !m_types.isEmpty(); } 433 454 434 QByteArray name() const435 { return m_name; }436 437 455 inline QScriptMetaType returnType() const 438 456 { return m_types.at(0); } … … 463 481 464 482 private: 465 QByteArray m_name;466 483 QVector<QScriptMetaType> m_types; 467 484 int m_firstUnresolvedIndex; … … 500 517 bool maybeOverloaded) 501 518 { 502 QByteArray funName;503 519 QScriptMetaMethod chosenMethod; 504 520 int chosenIndex = -1; … … 509 525 QVector<int> conversionFailed; 510 526 int index; 527 int nameLength = 0; 528 const char *initialMethodSignature = 0; 511 529 exec->clearException(); 512 530 QScriptEnginePrivate *engine = QScript::scriptEngineFromExec(exec); … … 514 532 QMetaMethod method = metaMethod(meta, callType, index); 515 533 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)) 520 539 continue; 521 540 } 522 541 542 QList<QByteArray> parameterTypeNames = method.parameterTypes(); 543 523 544 QVector<QScriptMetaType> types; 545 types.resize(1 + parameterTypeNames.size()); 546 QScriptMetaType *typesData = types.data(); 524 547 // resolve return type 525 548 QByteArray returnTypeName = method.typeName(); 526 549 int rtype = QMetaType::type(returnTypeName); 527 550 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); 537 556 } else { 538 557 if (callType == QMetaMethod::Constructor) 539 types .append(QScriptMetaType::metaType(QMetaType::QObjectStar, "QObject*"));540 else if (r eturnTypeName == "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(); 542 561 else 543 types .append(QScriptMetaType::metaType(rtype, returnTypeName));562 typesData[0] = QScriptMetaType::metaType(rtype, returnTypeName); 544 563 } 545 564 546 565 // resolve argument types 547 QList<QByteArray> parameterTypeNames = method.parameterTypes();548 566 for (int i = 0; i < parameterTypeNames.count(); ++i) { 549 567 QByteArray argTypeName = parameterTypeNames.at(i); 550 568 int atype = QMetaType::type(argTypeName); 551 569 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(); 561 577 } 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); 570 583 571 584 if (int(scriptArgs.size()) < mtd.argumentCount()) { … … 592 605 int matchDistance = 0; 593 606 for (int i = 0; converted && i < mtd.argumentCount(); ++i) { 594 QScriptValue actual;607 JSC::JSValue actual; 595 608 if (i < (int)scriptArgs.size()) 596 actual = engine->scriptValueFromJSCValue(scriptArgs.at(i));609 actual = scriptArgs.at(i); 597 610 else 598 actual = QScriptValue(QScriptValue::UndefinedValue);611 actual = JSC::jsUndefined(); 599 612 QScriptMetaType argType = mtd.argumentType(i); 600 613 int tid = -1; … … 602 615 if (argType.isUnresolved()) { 603 616 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())); 606 619 } else if (argType.isVariant()) { 607 if ( actual.isVariant()) {608 v = actual.toVariant();620 if (QScriptEnginePrivate::isVariant(actual)) { 621 v = QScriptEnginePrivate::variantValue(actual); 609 622 } else { 610 v = actual.toVariant();623 v = QScriptEnginePrivate::toVariant(exec, actual); 611 624 converted = v.isValid() || actual.isUndefined() || actual.isNull(); 612 625 } … … 614 627 tid = argType.typeId(); 615 628 v = QVariant(tid, (void *)0); 616 converted = QScriptEnginePrivate::convert (actual, tid, v.data(), engine);629 converted = QScriptEnginePrivate::convertValue(exec, actual, tid, v.data()); 617 630 if (exec->hadException()) 618 631 return exec->exception(); … … 620 633 621 634 if (!converted) { 622 if ( actual.isVariant()) {635 if (QScriptEnginePrivate::isVariant(actual)) { 623 636 if (tid == -1) 624 637 tid = argType.typeId(); 625 QVariant vv = actual.toVariant();638 QVariant vv = QScriptEnginePrivate::variantValue(actual); 626 639 if (vv.canConvert(QVariant::Type(tid))) { 627 640 v = vv; … … 650 663 if (m.isValid()) { 651 664 if (actual.isNumber()) { 652 int ival = actual.toInt32();665 int ival = QScriptEnginePrivate::toInt32(exec, actual); 653 666 if (m.valueToKey(ival) != 0) { 654 667 qVariantSetValue(v, ival); … … 657 670 } 658 671 } 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)); 661 674 if (ival != -1) { 662 675 qVariantSetValue(v, ival); … … 719 732 break; 720 733 } 721 } else if ( actual.isDate()) {734 } else if (QScriptEnginePrivate::isDate(actual)) { 722 735 switch (tid) { 723 736 case QMetaType::QDateTime: … … 734 747 break; 735 748 } 736 } else if ( actual.isRegExp()) {749 } else if (QScriptEnginePrivate::isRegExp(actual)) { 737 750 switch (tid) { 738 751 case QMetaType::QRegExp: … … 743 756 break; 744 757 } 745 } else if ( actual.isVariant()) {758 } else if (QScriptEnginePrivate::isVariant(actual)) { 746 759 if (argType.isVariant() 747 || ( actual.toVariant().userType() == tid)) {760 || (QScriptEnginePrivate::toVariant(exec, actual).userType() == tid)) { 748 761 // perfect 749 762 } else { 750 763 matchDistance += 10; 751 764 } 752 } else if ( actual.isArray()) {765 } else if (QScriptEnginePrivate::isArray(actual)) { 753 766 switch (tid) { 754 767 case QMetaType::QStringList: … … 760 773 break; 761 774 } 762 } else if ( actual.isQObject()) {775 } else if (QScriptEnginePrivate::isQObject(actual)) { 763 776 switch (tid) { 764 777 case QMetaType::QObjectStar: … … 842 855 // engine->notifyFunctionEntry(context); 843 856 //#endif 857 QString funName = QString::fromLatin1(methodName(initialMethodSignature, nameLength)); 844 858 if (!conversionFailed.isEmpty()) { 845 859 QString message = QString::fromLatin1("incompatible type of argument(s) in call to %0(); candidates were\n") 846 .arg( QLatin1String(funName));860 .arg(funName); 847 861 for (int i = 0; i < conversionFailed.size(); ++i) { 848 862 if (i > 0) … … 859 873 QString unresolvedTypeName = QString::fromLatin1(unresolvedType.name()); 860 874 QString message = QString::fromLatin1("cannot call %0(): ") 861 .arg( QString::fromLatin1(funName));875 .arg(funName); 862 876 if (unresolvedIndex > 0) { 863 877 message.append(QString::fromLatin1("argument %0 has unknown type `%1'"). … … 871 885 } else { 872 886 QString message = QString::fromLatin1("too few arguments in call to %0(); candidates are\n") 873 .arg( QLatin1String(funName));887 .arg(funName); 874 888 for (int i = 0; i < tooFewArgs.size(); ++i) { 875 889 if (i > 0) … … 887 901 && (metaArgs.matchDistance == candidates.at(1).matchDistance)) { 888 902 // ambiguous call 903 QByteArray funName = methodName(initialMethodSignature, nameLength); 889 904 QString message = QString::fromLatin1("ambiguous call of overloaded function %0(); candidates were\n") 890 905 .arg(QLatin1String(funName)); … … 954 969 QScriptMetaType retType = chosenMethod.returnType(); 955 970 if (retType.isVariant()) { 956 result = engine->jscValueFromVariant(*(QVariant *)params[0]);971 result = QScriptEnginePrivate::jscValueFromVariant(exec, *(QVariant *)params[0]); 957 972 } 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])); 963 976 } else { 964 977 result = JSC::jsUndefined(); … … 1050 1063 return throwError(exec, JSC::TypeError, "callee is not a QtPropertyFunction object"); 1051 1064 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); 1060 1066 } 1061 1067 … … 1066 1072 JSC::JSValue result = JSC::jsUndefined(); 1067 1073 1068 // ### don't go via QScriptValue1069 1074 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); 1073 1080 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); 1077 1084 } 1078 1085 Q_ASSERT_X(qobject, Q_FUNC_INFO, "this-object must be a QObject"); … … 1086 1093 QScriptEngine *oldEngine = 0; 1087 1094 if (scriptable) { 1095 engine->pushContext(exec, thisValue, args, this); 1088 1096 oldEngine = QScriptablePrivate::get(scriptable)->engine; 1089 1097 QScriptablePrivate::get(scriptable)->engine = QScriptEnginePrivate::get(engine); … … 1092 1100 QVariant v = prop.read(qobject); 1093 1101 1094 if (scriptable) 1102 if (scriptable) { 1095 1103 QScriptablePrivate::get(scriptable)->engine = oldEngine; 1096 1097 result = engine->jscValueFromVariant(v); 1104 engine->popContext(); 1105 } 1106 1107 result = QScriptEnginePrivate::jscValueFromVariant(exec, v); 1098 1108 } 1099 1109 } else { … … 1107 1117 v = (QString)arg.toString(exec); 1108 1118 } 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); 1112 1120 } 1113 1121 … … 1115 1123 QScriptEngine *oldEngine = 0; 1116 1124 if (scriptable) { 1125 engine->pushContext(exec, thisValue, args, this); 1117 1126 oldEngine = QScriptablePrivate::get(scriptable)->engine; 1118 1127 QScriptablePrivate::get(scriptable)->engine = QScriptEnginePrivate::get(engine); … … 1121 1130 prop.write(qobject, v); 1122 1131 1123 if (scriptable) 1132 if (scriptable) { 1124 1133 QScriptablePrivate::get(scriptable)->engine = oldEngine; 1134 engine->popContext(); 1135 } 1125 1136 1126 1137 result = arg; 1127 1138 } 1139 engine->currentFrame = previousFrame; 1128 1140 return result; 1129 1141 } … … 1177 1189 //Note: this has to be kept in sync with getOwnPropertyDescriptor 1178 1190 #ifndef QT_NO_PROPERTIES 1179 QByteArray name = QString(propertyName.ustring()).toLatin1();1191 QByteArray name = convertToLatin1(propertyName.ustring()); 1180 1192 QObject *qobject = data->value; 1181 1193 if (!qobject) { … … 1238 1250 val = JSC::jsUndefined(); 1239 1251 else 1240 val = eng->jscValueFromVariant(prop.read(qobject));1252 val = QScriptEnginePrivate::jscValueFromVariant(exec, prop.read(qobject)); 1241 1253 slot.setValue(val); 1242 1254 } … … 1248 1260 index = qobject->dynamicPropertyNames().indexOf(name); 1249 1261 if (index != -1) { 1250 JSC::JSValue val = eng->jscValueFromVariant(qobject->property(name));1262 JSC::JSValue val = QScriptEnginePrivate::jscValueFromVariant(exec, qobject->property(name)); 1251 1263 slot.setValue(val); 1252 1264 return true; … … 1258 1270 QMetaMethod method = meta->method(index); 1259 1271 if (hasMethodAccess(method, index, opt) 1260 && (methodName(method) == name)) {1272 && methodNameEquals(method, name.constData(), name.length())) { 1261 1273 QtFunction *fun = new (exec)QtFunction( 1262 1274 object, index, /*maybeOverloaded=*/true, … … 1275 1287 if (child->objectName() == QString(propertyName.ustring())) { 1276 1288 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)); 1279 1290 return true; 1280 1291 } … … 1293 1304 JSC::PropertyDescriptor &descriptor) 1294 1305 { 1295 //Note: this has to be kept in sync with getOwnPropertySlot abd getPropertyAttributes1306 //Note: this has to be kept in sync with getOwnPropertySlot 1296 1307 #ifndef QT_NO_PROPERTIES 1297 QByteArray name = QString(propertyName.ustring()).toLatin1();1308 QByteArray name = convertToLatin1(propertyName.ustring()); 1298 1309 QObject *qobject = data->value; 1299 1310 if (!qobject) { … … 1371 1382 val = JSC::jsUndefined(); 1372 1383 else 1373 val = eng->jscValueFromVariant(prop.read(qobject));1384 val = QScriptEnginePrivate::jscValueFromVariant(exec, prop.read(qobject)); 1374 1385 descriptor.setDescriptor(val, attributes); 1375 1386 } … … 1381 1392 index = qobject->dynamicPropertyNames().indexOf(name); 1382 1393 if (index != -1) { 1383 JSC::JSValue val = eng->jscValueFromVariant(qobject->property(name));1394 JSC::JSValue val = QScriptEnginePrivate::jscValueFromVariant(exec, qobject->property(name)); 1384 1395 descriptor.setDescriptor(val, QObjectMemberAttribute); 1385 1396 return true; … … 1391 1402 QMetaMethod method = meta->method(index); 1392 1403 if (hasMethodAccess(method, index, opt) 1393 && (methodName(method) == name)) {1404 && methodNameEquals(method, name.constData(), name.length())) { 1394 1405 QtFunction *fun = new (exec)QtFunction( 1395 1406 object, index, /*maybeOverloaded=*/true, … … 1411 1422 if (child->objectName() == QString(propertyName.ustring())) { 1412 1423 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); 1415 1426 return true; 1416 1427 } … … 1429 1440 { 1430 1441 #ifndef QT_NO_PROPERTIES 1431 QByteArray name = ((QString)propertyName.ustring()).toLatin1();1442 QByteArray name = convertToLatin1(propertyName.ustring()); 1432 1443 QObject *qobject = data->value; 1433 1444 if (!qobject) { … … 1491 1502 v = (QString)value.toString(exec); 1492 1503 } else { 1493 v = eng->jscValueToVariant(value, prop.userType());1504 v = QScriptEnginePrivate::jscValueToVariant(exec, value, prop.userType()); 1494 1505 } 1495 1506 (void)prop.write(qobject, v); … … 1505 1516 QMetaMethod method = meta->method(index); 1506 1517 if (hasMethodAccess(method, index, opt) 1507 && (methodName(method) == name)) {1518 && methodNameEquals(method, name.constData(), name.length())) { 1508 1519 data->cachedMembers.insert(name, value); 1509 1520 return; … … 1513 1524 index = qobject->dynamicPropertyNames().indexOf(name); 1514 1525 if ((index != -1) || (opt & QScriptEngine::AutoCreateDynamicProperties)) { 1515 QVariant v = eng->scriptValueFromJSCValue(value).toVariant();1526 QVariant v = QScriptEnginePrivate::toVariant(exec, value); 1516 1527 (void)qobject->setProperty(name, v); 1517 1528 return; … … 1523 1534 1524 1535 bool QObjectDelegate::deleteProperty(QScriptObject *object, JSC::ExecState *exec, 1525 const JSC::Identifier& propertyName, 1526 bool checkDontDelete) 1536 const JSC::Identifier& propertyName) 1527 1537 { 1528 1538 #ifndef QT_NO_PROPERTIES 1529 QByteArray name = ((QString)propertyName.ustring()).toLatin1();1539 QByteArray name = convertToLatin1(propertyName.ustring()); 1530 1540 QObject *qobject = data->value; 1531 1541 if (!qobject) { … … 1564 1574 } 1565 1575 1566 return QScriptObjectDelegate::deleteProperty(object, exec, propertyName , checkDontDelete);1576 return QScriptObjectDelegate::deleteProperty(object, exec, propertyName); 1567 1577 #else //QT_NO_PROPERTIES 1568 1578 return false; … … 1570 1580 } 1571 1581 1572 bool QObjectDelegate::getPropertyAttributes(const QScriptObject *object,1573 JSC::ExecState *exec,1574 const JSC::Identifier &propertyName,1575 unsigned &attributes) const1576 {1577 #ifndef QT_NO_PROPERTIES1578 //Note: this has to be kept in sync with getOwnPropertyDescriptor and getOwnPropertySlot1579 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_PROPERTIES1647 return false;1648 #endif //QT_NO_PROPERTIES1649 }1650 1651 1582 void QObjectDelegate::getOwnPropertyNames(QScriptObject *object, JSC::ExecState *exec, 1652 1583 JSC::PropertyNameArray &propertyNames, 1653 bool includeNonEnumerable)1584 JSC::EnumerationMode mode) 1654 1585 { 1655 1586 #ifndef QT_NO_PROPERTIES … … 1696 1627 } 1697 1628 1698 QScriptObjectDelegate::getOwnPropertyNames(object, exec, propertyNames, includeNonEnumerable);1629 QScriptObjectDelegate::getOwnPropertyNames(object, exec, propertyNames, mode); 1699 1630 #endif //QT_NO_PROPERTIES 1700 1631 } … … 1824 1755 | QScriptEngine::ExcludeChildObjects)); 1825 1756 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); 1829 1760 this->structure()->setHasGetterSetterProperties(true); 1830 1761 } … … 1863 1794 } 1864 1795 1865 QByteArray name = QString(propertyName.ustring()).toLatin1();1796 QByteArray name = convertToLatin1(propertyName.ustring()); 1866 1797 1867 1798 for (int i = 0; i < meta->enumeratorCount(); ++i) { … … 1879 1810 } 1880 1811 1812 bool 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 1881 1845 void QMetaObjectWrapperObject::put(JSC::ExecState* exec, const JSC::Identifier& propertyName, 1882 1846 JSC::JSValue value, JSC::PutPropertySlot &slot) … … 1891 1855 const QMetaObject *meta = data->value; 1892 1856 if (meta) { 1893 QByteArray name = QString(propertyName.ustring()).toLatin1();1857 QByteArray name = convertToLatin1(propertyName.ustring()); 1894 1858 for (int i = 0; i < meta->enumeratorCount(); ++i) { 1895 1859 QMetaEnum e = meta->enumerator(i); … … 1904 1868 1905 1869 bool QMetaObjectWrapperObject::deleteProperty( 1906 JSC::ExecState *exec, const JSC::Identifier& propertyName, 1907 bool checkDontDelete) 1870 JSC::ExecState *exec, const JSC::Identifier& propertyName) 1908 1871 { 1909 1872 if (propertyName == exec->propertyNames().prototype) … … 1911 1874 const QMetaObject *meta = data->value; 1912 1875 if (meta) { 1913 QByteArray name = QString(propertyName.ustring()).toLatin1();1876 QByteArray name = convertToLatin1(propertyName.ustring()); 1914 1877 for (int i = 0; i < meta->enumeratorCount(); ++i) { 1915 1878 QMetaEnum e = meta->enumerator(i); … … 1920 1883 } 1921 1884 } 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); 1947 1886 } 1948 1887 1949 1888 void QMetaObjectWrapperObject::getOwnPropertyNames(JSC::ExecState *exec, 1950 1889 JSC::PropertyNameArray &propertyNames, 1951 bool includeNonEnumerable)1890 JSC::EnumerationMode mode) 1952 1891 { 1953 1892 const QMetaObject *meta = data->value; … … 1959 1898 propertyNames.add(JSC::Identifier(exec, e.key(j))); 1960 1899 } 1961 JSC::JSObject::getOwnPropertyNames(exec, propertyNames, includeNonEnumerable);1900 JSC::JSObject::getOwnPropertyNames(exec, propertyNames, mode); 1962 1901 } 1963 1902 … … 2078 2017 : QMetaObjectWrapperObject(exec, StaticQtMetaObject::get(), /*ctor=*/JSC::JSValue(), structure) 2079 2018 { 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); 2081 2020 } 2082 2021 … … 2137 2076 JSC::JSValue senderWrapper; 2138 2077 int signalIndex = -1; 2078 QScript::APIShim shim(engine); 2139 2079 for (int i = 0; i < connections.size(); ++i) { 2140 2080 const QVector<QObjectConnection> &cs = connections.at(i); … … 2179 2119 QVarLengthArray<JSC::JSValue, 8> argsVector(argc); 2180 2120 for (int i = 0; i < argc; ++i) { 2181 // ### optimize -- no need to convert via QScriptValue 2182 QScriptValue actual; 2121 JSC::JSValue actual; 2183 2122 void *arg = argv[i + 1]; 2184 2123 QByteArray typeName = parameterTypes.at(i); 2185 2124 int argType = QMetaType::type(parameterTypes.at(i)); 2186 2125 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)); 2195 2132 } 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; 2199 2136 } 2200 2137 JSC::ArgList jscArgs(argsVector.data(), argsVector.size()); -
trunk/src/script/bridge/qscriptqobject_p.h
r769 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) … … 87 87 JSC::JSValue, JSC::PutPropertySlot&); 88 88 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); 94 90 virtual void getOwnPropertyNames(QScriptObject*, JSC::ExecState*, 95 91 JSC::PropertyNameArray&, 96 bool includeNonEnumerable = false);92 JSC::EnumerationMode mode = JSC::ExcludeDontEnumProperties); 97 93 virtual void markChildren(QScriptObject*, JSC::MarkStack& markStack); 98 94 virtual bool compareToObject(QScriptObject*, JSC::ExecState*, JSC::JSObject*); … … 213 209 int mostGeneralMethod(QMetaMethod *out = 0) const; 214 210 QList<int> overloadedIndexes() const; 215 QString functionName() const;216 211 217 212 private: … … 277 272 const JSC::Identifier& propertyName, 278 273 JSC::PropertySlot&); 274 virtual bool getOwnPropertyDescriptor(JSC::ExecState*, 275 const JSC::Identifier& propertyName, 276 JSC::PropertyDescriptor&); 279 277 virtual void put(JSC::ExecState* exec, const JSC::Identifier& propertyName, 280 278 JSC::JSValue, JSC::PutPropertySlot&); 281 279 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); 286 281 virtual void getOwnPropertyNames(JSC::ExecState*, JSC::PropertyNameArray&, 287 bool includeNonEnumerable = false);282 JSC::EnumerationMode mode = JSC::ExcludeDontEnumProperties); 288 283 virtual void markChildren(JSC::MarkStack& markStack); 289 284 … … 305 300 static WTF::PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype) 306 301 { 307 return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::ImplementsHasInstance));302 return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags)); 308 303 } 309 304 310 305 protected: 306 static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | JSC::OverridesMarkChildren | JSC::OverridesGetPropertyNames | JSC::ImplementsHasInstance | JSObject::StructureFlags; 307 311 308 Data *data; 312 309 }; -
trunk/src/script/bridge/qscriptvariant.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) … … 30 30 #include "Error.h" 31 31 #include "PrototypeFunction.h" 32 #include "JSFunction.h" 33 #include "NativeFunctionWrapper.h" 32 34 #include "JSString.h" 33 35 … … 120 122 if (value.isObject()) { 121 123 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())); 127 126 } else { 128 127 result = value.toString(exec); … … 134 133 { 135 134 const QVariant &variant1 = value(); 136 return variant1 == scriptEngineFromExec(exec)->scriptValueFromJSCValue(o2).toVariant();135 return variant1 == QScriptEnginePrivate::toVariant(exec, o2); 137 136 } 138 137 … … 143 142 setDelegate(new QVariantDelegate(QVariant())); 144 143 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); 147 146 } 148 147 -
trunk/src/script/bridge/qscriptvariant_p.h
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)
Note:
See TracChangeset
for help on using the changeset viewer.