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); |