82 return true; |
82 return true; |
83 } |
83 } |
84 return false; |
84 return false; |
85 } |
85 } |
86 |
86 |
|
87 bool ClassObjectDelegate::getOwnPropertyDescriptor(QScriptObject *object, |
|
88 JSC::ExecState *exec, |
|
89 const JSC::Identifier &propertyName, |
|
90 JSC::PropertyDescriptor &descriptor) |
|
91 { |
|
92 QScriptEnginePrivate *engine = scriptEngineFromExec(exec); |
|
93 QScript::SaveFrameHelper saveFrame(engine, exec); |
|
94 // for compatibility with the old back-end, normal JS properties |
|
95 // are queried first. |
|
96 if (QScriptObjectDelegate::getOwnPropertyDescriptor(object, exec, propertyName, descriptor)) |
|
97 return true; |
|
98 |
|
99 QScriptValue scriptObject = engine->scriptValueFromJSCValue(object); |
|
100 QScriptString scriptName; |
|
101 QScriptStringPrivate scriptName_d(engine, propertyName, QScriptStringPrivate::StackAllocated); |
|
102 QScriptStringPrivate::init(scriptName, &scriptName_d); |
|
103 uint id = 0; |
|
104 QScriptClass::QueryFlags qflags = m_scriptClass->queryProperty( |
|
105 scriptObject, scriptName, QScriptClass::HandlesReadAccess, &id); |
|
106 if (qflags & QScriptClass::HandlesReadAccess) { |
|
107 QScriptValue::PropertyFlags pflags = m_scriptClass->propertyFlags(scriptObject, scriptName, id); |
|
108 unsigned attribs = 0; |
|
109 if (pflags & QScriptValue::ReadOnly) |
|
110 attribs |= JSC::ReadOnly; |
|
111 if (pflags & QScriptValue::SkipInEnumeration) |
|
112 attribs |= JSC::DontEnum; |
|
113 if (pflags & QScriptValue::Undeletable) |
|
114 attribs |= JSC::DontDelete; |
|
115 if (pflags & QScriptValue::PropertyGetter) |
|
116 attribs |= JSC::Getter; |
|
117 if (pflags & QScriptValue::PropertySetter) |
|
118 attribs |= JSC::Setter; |
|
119 attribs |= pflags & QScriptValue::UserRange; |
|
120 // Rather than calling the getter, we could return an access descriptor here. |
|
121 QScriptValue value = m_scriptClass->property(scriptObject, scriptName, id); |
|
122 descriptor.setDescriptor(engine->scriptValueToJSCValue(value), attribs); |
|
123 return true; |
|
124 } |
|
125 return false; |
|
126 } |
|
127 |
87 void ClassObjectDelegate::put(QScriptObject* object, JSC::ExecState *exec, |
128 void ClassObjectDelegate::put(QScriptObject* object, JSC::ExecState *exec, |
88 const JSC::Identifier &propertyName, |
129 const JSC::Identifier &propertyName, |
89 JSC::JSValue value, JSC::PutPropertySlot &slot) |
130 JSC::JSValue value, JSC::PutPropertySlot &slot) |
90 { |
131 { |
91 QScriptEnginePrivate *engine = scriptEngineFromExec(exec); |
132 QScriptEnginePrivate *engine = scriptEngineFromExec(exec); |
103 } |
144 } |
104 QScriptObjectDelegate::put(object, exec, propertyName, value, slot); |
145 QScriptObjectDelegate::put(object, exec, propertyName, value, slot); |
105 } |
146 } |
106 |
147 |
107 bool ClassObjectDelegate::deleteProperty(QScriptObject* object, JSC::ExecState *exec, |
148 bool ClassObjectDelegate::deleteProperty(QScriptObject* object, JSC::ExecState *exec, |
108 const JSC::Identifier &propertyName, |
149 const JSC::Identifier &propertyName) |
109 bool checkDontDelete) |
|
110 { |
150 { |
111 // ### avoid duplication of put() |
151 // ### avoid duplication of put() |
112 QScriptEnginePrivate *engine = scriptEngineFromExec(exec); |
152 QScriptEnginePrivate *engine = scriptEngineFromExec(exec); |
113 QScript::SaveFrameHelper saveFrame(engine, exec); |
153 QScript::SaveFrameHelper saveFrame(engine, exec); |
114 QScriptValue scriptObject = engine->scriptValueFromJSCValue(object); |
154 QScriptValue scriptObject = engine->scriptValueFromJSCValue(object); |
122 if (m_scriptClass->propertyFlags(scriptObject, scriptName, id) & QScriptValue::Undeletable) |
162 if (m_scriptClass->propertyFlags(scriptObject, scriptName, id) & QScriptValue::Undeletable) |
123 return false; |
163 return false; |
124 m_scriptClass->setProperty(scriptObject, scriptName, id, QScriptValue()); |
164 m_scriptClass->setProperty(scriptObject, scriptName, id, QScriptValue()); |
125 return true; |
165 return true; |
126 } |
166 } |
127 return QScriptObjectDelegate::deleteProperty(object, exec, propertyName, checkDontDelete); |
167 return QScriptObjectDelegate::deleteProperty(object, exec, propertyName); |
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); |
|
160 } |
168 } |
161 |
169 |
162 void ClassObjectDelegate::getOwnPropertyNames(QScriptObject* object, JSC::ExecState *exec, |
170 void ClassObjectDelegate::getOwnPropertyNames(QScriptObject* object, JSC::ExecState *exec, |
163 JSC::PropertyNameArray &propertyNames, |
171 JSC::PropertyNameArray &propertyNames, |
164 bool includeNonEnumerable) |
172 JSC::EnumerationMode mode) |
165 { |
173 { |
166 QScriptEnginePrivate *engine = scriptEngineFromExec(exec); |
174 QScriptEnginePrivate *engine = scriptEngineFromExec(exec); |
167 QScript::SaveFrameHelper saveFrame(engine, exec); |
175 QScript::SaveFrameHelper saveFrame(engine, exec); |
168 QScriptValue scriptObject = engine->scriptValueFromJSCValue(object); |
176 QScriptValue scriptObject = engine->scriptValueFromJSCValue(object); |
169 QScriptClassPropertyIterator *it = m_scriptClass->newIterator(scriptObject); |
177 QScriptClassPropertyIterator *it = m_scriptClass->newIterator(scriptObject); |
173 QString name = it->name().toString(); |
181 QString name = it->name().toString(); |
174 propertyNames.add(JSC::Identifier(exec, name)); |
182 propertyNames.add(JSC::Identifier(exec, name)); |
175 } |
183 } |
176 delete it; |
184 delete it; |
177 } |
185 } |
178 QScriptObjectDelegate::getOwnPropertyNames(object, exec, propertyNames, includeNonEnumerable); |
186 QScriptObjectDelegate::getOwnPropertyNames(object, exec, propertyNames, mode); |
179 } |
187 } |
180 |
188 |
181 JSC::CallType ClassObjectDelegate::getCallData(QScriptObject*, JSC::CallData &callData) |
189 JSC::CallType ClassObjectDelegate::getCallData(QScriptObject*, JSC::CallData &callData) |
182 { |
190 { |
183 if (!m_scriptClass->supportsExtension(QScriptClass::Callable)) |
191 if (!m_scriptClass->supportsExtension(QScriptClass::Callable)) |
204 QScriptContext *ctx = eng_p->contextForFrame(eng_p->currentFrame); |
212 QScriptContext *ctx = eng_p->contextForFrame(eng_p->currentFrame); |
205 QScriptValue scriptObject = eng_p->scriptValueFromJSCValue(obj); |
213 QScriptValue scriptObject = eng_p->scriptValueFromJSCValue(obj); |
206 QVariant result = scriptClass->extension(QScriptClass::Callable, qVariantFromValue(ctx)); |
214 QVariant result = scriptClass->extension(QScriptClass::Callable, qVariantFromValue(ctx)); |
207 eng_p->popContext(); |
215 eng_p->popContext(); |
208 eng_p->currentFrame = oldFrame; |
216 eng_p->currentFrame = oldFrame; |
209 return eng_p->jscValueFromVariant(result); |
217 return QScriptEnginePrivate::jscValueFromVariant(exec, result); |
210 } |
218 } |
211 |
219 |
212 JSC::ConstructType ClassObjectDelegate::getConstructData(QScriptObject*, JSC::ConstructData &constructData) |
220 JSC::ConstructType ClassObjectDelegate::getConstructData(QScriptObject*, JSC::ConstructData &constructData) |
213 { |
221 { |
214 if (!m_scriptClass->supportsExtension(QScriptClass::Callable)) |
222 if (!m_scriptClass->supportsExtension(QScriptClass::Callable)) |