src/script/bridge/qscriptdeclarativeobject.cpp
changeset 30 5dc02b23752f
parent 18 2f34d5167611
child 37 758a864f9613
equal deleted inserted replaced
29:b72c6db6890b 30:5dc02b23752f
    64 bool DeclarativeObjectDelegate::getOwnPropertySlot(QScriptObject* object,
    64 bool DeclarativeObjectDelegate::getOwnPropertySlot(QScriptObject* object,
    65                                                    JSC::ExecState *exec,
    65                                                    JSC::ExecState *exec,
    66                                                    const JSC::Identifier &propertyName,
    66                                                    const JSC::Identifier &propertyName,
    67                                                    JSC::PropertySlot &slot)
    67                                                    JSC::PropertySlot &slot)
    68 {
    68 {
    69     QScriptEnginePrivate *engine = scriptEngineFromExec(exec);
       
    70     QScriptDeclarativeClass::Identifier identifier = (void *)propertyName.ustring().rep();
    69     QScriptDeclarativeClass::Identifier identifier = (void *)propertyName.ustring().rep();
    71 
    70 
    72     QScriptDeclarativeClassPrivate *p = QScriptDeclarativeClassPrivate::get(m_class);
    71     QScriptDeclarativeClassPrivate *p = QScriptDeclarativeClassPrivate::get(m_class);
    73     p->context = reinterpret_cast<QScriptContext *>(exec);
    72     p->context = reinterpret_cast<QScriptContext *>(exec);
    74     QScriptClass::QueryFlags flags = 
    73     QScriptClass::QueryFlags flags = 
    75         m_class->queryProperty(m_object, identifier, QScriptClass::HandlesReadAccess);
    74         m_class->queryProperty(m_object, identifier, QScriptClass::HandlesReadAccess);
    76     if (flags & QScriptClass::HandlesReadAccess) {
    75     if (flags & QScriptClass::HandlesReadAccess) {
    77         QScriptValue value = m_class->property(m_object, identifier);
    76         QScriptDeclarativeClass::Value val = m_class->property(m_object, identifier);
    78         p->context = 0;
    77         p->context = 0;
    79         slot.setValue(engine->scriptValueToJSCValue(value));
    78         slot.setValue((const JSC::JSValue &)val);
    80         return true;
    79         return true;
    81     }
    80     }
    82     p->context = 0;
    81     p->context = 0;
    83 
    82 
    84     return QScriptObjectDelegate::getOwnPropertySlot(object, exec, propertyName, slot);
    83     return QScriptObjectDelegate::getOwnPropertySlot(object, exec, propertyName, slot);
   104 
   103 
   105     QScriptObjectDelegate::put(object, exec, propertyName, value, slot);
   104     QScriptObjectDelegate::put(object, exec, propertyName, value, slot);
   106 }
   105 }
   107 
   106 
   108 bool DeclarativeObjectDelegate::deleteProperty(QScriptObject* object, JSC::ExecState *exec,
   107 bool DeclarativeObjectDelegate::deleteProperty(QScriptObject* object, JSC::ExecState *exec,
   109                                                const JSC::Identifier &propertyName,
   108                                                const JSC::Identifier &propertyName)
   110                                                bool checkDontDelete)
       
   111 {
   109 {
   112     return QScriptObjectDelegate::deleteProperty(object, exec, propertyName, checkDontDelete);
   110     return QScriptObjectDelegate::deleteProperty(object, exec, propertyName);
   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);
       
   141 }
   111 }
   142 
   112 
   143 void DeclarativeObjectDelegate::getOwnPropertyNames(QScriptObject* object, JSC::ExecState *exec,
   113 void DeclarativeObjectDelegate::getOwnPropertyNames(QScriptObject* object, JSC::ExecState *exec,
   144                                                     JSC::PropertyNameArray &propertyNames,
   114                                                     JSC::PropertyNameArray &propertyNames,
   145                                                     bool includeNonEnumerable)
   115                                                     JSC::EnumerationMode mode)
   146 {
   116 {
   147     QStringList properties = m_class->propertyNames(m_object);
   117     QStringList properties = m_class->propertyNames(m_object);
   148     for (int ii = 0; ii < properties.count(); ++ii) {
   118     for (int ii = 0; ii < properties.count(); ++ii) {
   149         const QString &name = properties.at(ii);
   119         const QString &name = properties.at(ii);
   150         propertyNames.add(JSC::Identifier(exec, name));
   120         propertyNames.add(JSC::Identifier(exec, name));
   151     }
   121     }
   152 
   122 
   153     QScriptObjectDelegate::getOwnPropertyNames(object, exec, propertyNames, includeNonEnumerable);
   123     QScriptObjectDelegate::getOwnPropertyNames(object, exec, propertyNames, mode);
   154 }
   124 }
   155 
   125 
   156 JSC::CallType DeclarativeObjectDelegate::getCallData(QScriptObject *object, JSC::CallData &callData)
   126 JSC::CallType DeclarativeObjectDelegate::getCallData(QScriptObject *object, JSC::CallData &callData)
   157 {
   127 {
   158     return QScriptObjectDelegate::getCallData(object, callData);
   128     if (!QScriptDeclarativeClassPrivate::get(m_class)->supportsCall) 
       
   129         return JSC::CallTypeNone;
       
   130     callData.native.function = call;
       
   131     return JSC::CallTypeHost;
       
   132 }
       
   133 
       
   134 JSC::JSValue DeclarativeObjectDelegate::call(JSC::ExecState *exec, JSC::JSObject *callee,
       
   135                                              JSC::JSValue thisValue, const JSC::ArgList &args)
       
   136 {
       
   137     if (!callee->inherits(&QScriptObject::info))
       
   138         return JSC::throwError(exec, JSC::TypeError, "callee is not a DeclarativeObject object");
       
   139     QScriptObject *obj = static_cast<QScriptObject*>(callee);
       
   140     QScriptObjectDelegate *delegate = obj->delegate();
       
   141     if (!delegate || (delegate->type() != QScriptObjectDelegate::DeclarativeClassObject))
       
   142         return JSC::throwError(exec, JSC::TypeError, "callee is not a DeclarativeObject object");
       
   143 
       
   144     QScriptDeclarativeClass *scriptClass = static_cast<DeclarativeObjectDelegate*>(delegate)->m_class;
       
   145     QScriptEnginePrivate *eng_p = scriptEngineFromExec(exec);
       
   146 
       
   147     JSC::ExecState *oldFrame = eng_p->currentFrame;
       
   148     eng_p->pushContext(exec, thisValue, args, callee);
       
   149     QScriptContext *ctxt = eng_p->contextForFrame(eng_p->currentFrame);
       
   150 
       
   151     QScriptValue scriptObject = eng_p->scriptValueFromJSCValue(obj);
       
   152     QScriptDeclarativeClass::Value result = 
       
   153         scriptClass->call(static_cast<DeclarativeObjectDelegate*>(delegate)->m_object, ctxt);
       
   154 
       
   155     eng_p->popContext();
       
   156     eng_p->currentFrame = oldFrame;
       
   157     return (JSC::JSValue &)(result);
   159 }
   158 }
   160 
   159 
   161 JSC::ConstructType DeclarativeObjectDelegate::getConstructData(QScriptObject* object, JSC::ConstructData &constructData)
   160 JSC::ConstructType DeclarativeObjectDelegate::getConstructData(QScriptObject* object, JSC::ConstructData &constructData)
   162 {
   161 {
   163     return QScriptObjectDelegate::getConstructData(object, constructData);
   162     return QScriptObjectDelegate::getConstructData(object, constructData);
   167                                             JSC::JSValue value, JSC::JSValue proto)
   166                                             JSC::JSValue value, JSC::JSValue proto)
   168 {
   167 {
   169     return QScriptObjectDelegate::hasInstance(object, exec, value, proto);
   168     return QScriptObjectDelegate::hasInstance(object, exec, value, proto);
   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 } // namespace QScript
   188 } // namespace QScript
   173 
   189 
   174 QT_END_NAMESPACE
   190 QT_END_NAMESPACE