src/script/bridge/qscriptdeclarativeobject.cpp
changeset 30 5dc02b23752f
parent 18 2f34d5167611
child 37 758a864f9613
--- a/src/script/bridge/qscriptdeclarativeobject.cpp	Wed Jun 23 19:07:03 2010 +0300
+++ b/src/script/bridge/qscriptdeclarativeobject.cpp	Tue Jul 06 15:10:48 2010 +0300
@@ -66,7 +66,6 @@
                                                    const JSC::Identifier &propertyName,
                                                    JSC::PropertySlot &slot)
 {
-    QScriptEnginePrivate *engine = scriptEngineFromExec(exec);
     QScriptDeclarativeClass::Identifier identifier = (void *)propertyName.ustring().rep();
 
     QScriptDeclarativeClassPrivate *p = QScriptDeclarativeClassPrivate::get(m_class);
@@ -74,9 +73,9 @@
     QScriptClass::QueryFlags flags = 
         m_class->queryProperty(m_object, identifier, QScriptClass::HandlesReadAccess);
     if (flags & QScriptClass::HandlesReadAccess) {
-        QScriptValue value = m_class->property(m_object, identifier);
+        QScriptDeclarativeClass::Value val = m_class->property(m_object, identifier);
         p->context = 0;
-        slot.setValue(engine->scriptValueToJSCValue(value));
+        slot.setValue((const JSC::JSValue &)val);
         return true;
     }
     p->context = 0;
@@ -106,43 +105,14 @@
 }
 
 bool DeclarativeObjectDelegate::deleteProperty(QScriptObject* object, JSC::ExecState *exec,
-                                               const JSC::Identifier &propertyName,
-                                               bool checkDontDelete)
-{
-    return QScriptObjectDelegate::deleteProperty(object, exec, propertyName, checkDontDelete);
-}
-
-bool DeclarativeObjectDelegate::getPropertyAttributes(const QScriptObject* object, 
-                                                      JSC::ExecState *exec,
-                                                      const JSC::Identifier &propertyName,
-                                                      unsigned &attribs) const
+                                               const JSC::Identifier &propertyName)
 {
-    QScriptDeclarativeClass::Identifier identifier = (void *)propertyName.ustring().rep();
-
-    QScriptClass::QueryFlags flags = 
-        m_class->queryProperty(m_object, identifier, QScriptClass::HandlesReadAccess);
-    if (flags & QScriptClass::HandlesReadAccess) {
-        QScriptValue::PropertyFlags flags = m_class->propertyFlags(m_object, identifier);
-        attribs = 0;
-        if (flags & QScriptValue::ReadOnly)
-            attribs |= JSC::ReadOnly;
-        if (flags & QScriptValue::SkipInEnumeration)
-            attribs |= JSC::DontEnum;
-        if (flags & QScriptValue::Undeletable)
-            attribs |= JSC::DontDelete;
-        if (flags & QScriptValue::PropertyGetter)
-            attribs |= JSC::Getter;
-        if (flags & QScriptValue::PropertySetter)
-            attribs |= JSC::Setter;
-        attribs |= flags & QScriptValue::UserRange;
-        return true;
-    }
-    return QScriptObjectDelegate::getPropertyAttributes(object, exec, propertyName, attribs);
+    return QScriptObjectDelegate::deleteProperty(object, exec, propertyName);
 }
 
 void DeclarativeObjectDelegate::getOwnPropertyNames(QScriptObject* object, JSC::ExecState *exec,
                                                     JSC::PropertyNameArray &propertyNames,
-                                                    bool includeNonEnumerable)
+                                                    JSC::EnumerationMode mode)
 {
     QStringList properties = m_class->propertyNames(m_object);
     for (int ii = 0; ii < properties.count(); ++ii) {
@@ -150,12 +120,41 @@
         propertyNames.add(JSC::Identifier(exec, name));
     }
 
-    QScriptObjectDelegate::getOwnPropertyNames(object, exec, propertyNames, includeNonEnumerable);
+    QScriptObjectDelegate::getOwnPropertyNames(object, exec, propertyNames, mode);
 }
 
 JSC::CallType DeclarativeObjectDelegate::getCallData(QScriptObject *object, JSC::CallData &callData)
 {
-    return QScriptObjectDelegate::getCallData(object, callData);
+    if (!QScriptDeclarativeClassPrivate::get(m_class)->supportsCall) 
+        return JSC::CallTypeNone;
+    callData.native.function = call;
+    return JSC::CallTypeHost;
+}
+
+JSC::JSValue DeclarativeObjectDelegate::call(JSC::ExecState *exec, JSC::JSObject *callee,
+                                             JSC::JSValue thisValue, const JSC::ArgList &args)
+{
+    if (!callee->inherits(&QScriptObject::info))
+        return JSC::throwError(exec, JSC::TypeError, "callee is not a DeclarativeObject object");
+    QScriptObject *obj = static_cast<QScriptObject*>(callee);
+    QScriptObjectDelegate *delegate = obj->delegate();
+    if (!delegate || (delegate->type() != QScriptObjectDelegate::DeclarativeClassObject))
+        return JSC::throwError(exec, JSC::TypeError, "callee is not a DeclarativeObject object");
+
+    QScriptDeclarativeClass *scriptClass = static_cast<DeclarativeObjectDelegate*>(delegate)->m_class;
+    QScriptEnginePrivate *eng_p = scriptEngineFromExec(exec);
+
+    JSC::ExecState *oldFrame = eng_p->currentFrame;
+    eng_p->pushContext(exec, thisValue, args, callee);
+    QScriptContext *ctxt = eng_p->contextForFrame(eng_p->currentFrame);
+
+    QScriptValue scriptObject = eng_p->scriptValueFromJSCValue(obj);
+    QScriptDeclarativeClass::Value result = 
+        scriptClass->call(static_cast<DeclarativeObjectDelegate*>(delegate)->m_object, ctxt);
+
+    eng_p->popContext();
+    eng_p->currentFrame = oldFrame;
+    return (JSC::JSValue &)(result);
 }
 
 JSC::ConstructType DeclarativeObjectDelegate::getConstructData(QScriptObject* object, JSC::ConstructData &constructData)
@@ -169,6 +168,23 @@
     return QScriptObjectDelegate::hasInstance(object, exec, value, proto);
 }
 
+bool DeclarativeObjectDelegate::compareToObject(QScriptObject *o, JSC::ExecState *exec, JSC::JSObject *o2)
+{
+    if (!o2->inherits(&QScriptObject::info))
+        return false;
+    
+    QScriptObject *scriptObject = static_cast<QScriptObject*>(o2);
+    QScriptObjectDelegate *delegate = scriptObject->delegate();
+    if (!delegate || (delegate->type() != QScriptObjectDelegate::DeclarativeClassObject))
+        return false;
+
+    DeclarativeObjectDelegate *other = static_cast<DeclarativeObjectDelegate*>(delegate);
+    if (m_class != other->m_class)
+        return false;
+    else
+        return m_class->compare(m_object, other->m_object);
+}
+
 } // namespace QScript
 
 QT_END_NAMESPACE