summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPeter Varga <pvarga@inf.u-szeged.hu>2011-06-21 18:06:28 +0200
committerJedrzej Nowacki <jedrzej.nowacki@nokia.com>2011-06-22 10:41:21 +0200
commit10e75892de93e49af5b4a45bffc557aa98c7375b (patch)
tree231d9a4da02263a6781d1d8f3e6a012330687327
parent76d56a9fe409a345e446b2113c634fb6c57d267c (diff)
Replace QSOGO::getOwnProperty by QSEP::hasOwnProperty
QSEP::hasOwnProperty uses the proper V8 API call to check the existence of an own property: Object::HasOwnProperty. Merge-request: 5 Reviewed-by: Jedrzej Nowacki <jedrzej.nowacki@nokia.com>
-rw-r--r--src/script/api/qscriptclass.cpp2
-rw-r--r--src/script/api/qscriptengine.cpp6
-rw-r--r--src/script/api/qscriptengine_impl_p.h25
-rw-r--r--src/script/api/qscriptengine_p.h6
-rw-r--r--src/script/api/qscriptoriginalglobalobject_p.h13
-rw-r--r--src/script/api/qscriptvalue_impl_p.h2
6 files changed, 23 insertions, 31 deletions
diff --git a/src/script/api/qscriptclass.cpp b/src/script/api/qscriptclass.cpp
index e8d858c..184df41 100644
--- a/src/script/api/qscriptclass.cpp
+++ b/src/script/api/qscriptclass.cpp
@@ -75,7 +75,7 @@ v8::Handle<v8::Value> QScriptClassObject::property(v8::Handle<v8::String> proper
v8::Handle<v8::String> toStringProp = v8::String::New("toString");
if (property->Equals(toStringProp)) {
v8::Handle<v8::Object> proto = v8::Handle<v8::Object>::Cast(engine->currentContext()->thisObject()->GetPrototype());
- if (engine->getOwnProperty(proto, toStringProp).IsEmpty()) {
+ if (!engine->hasOwnProperty(proto, toStringProp)) {
return handleScope.Close(engine->scriptClassToStringTemplate()->GetFunction());
}
}
diff --git a/src/script/api/qscriptengine.cpp b/src/script/api/qscriptengine.cpp
index aaa6136..e06c068 100644
--- a/src/script/api/qscriptengine.cpp
+++ b/src/script/api/qscriptengine.cpp
@@ -2617,11 +2617,11 @@ void QScriptEnginePrivate::emitSignalHandlerException()
/*!
\internal
- This method was created only because it couldn't be inlined in getOwnProperty.
+ This method was created only because it couldn't be inlined in hasOwnProperty.
It shouldn't be used in other places.
\note that it assume that object has a QScriptClassObject instance associated.
*/
-v8::Local<v8::Value> QScriptEnginePrivate::getOwnPropertyFromScriptClassInstance(v8::Handle<v8::Object> object, v8::Handle<v8::Value> propertyName) const
+bool QScriptEnginePrivate::hasOwnPropertyInScriptClassInstance(v8::Handle<v8::Object> object, v8::Handle<v8::Value> propertyName) const
{
#ifndef QT_NO_DEBUG
Q_ASSERT(object->InternalFieldCount() == 1);
@@ -2630,7 +2630,7 @@ v8::Local<v8::Value> QScriptEnginePrivate::getOwnPropertyFromScriptClassInstance
delete ptr;
#endif
QScriptClassObject *data = QScriptClassObject::get(object);
- return m_originalGlobalObject.getOwnProperty(data->original(), propertyName);
+ return data->original()->HasOwnProperty(propertyName->ToString());
}
/*!
diff --git a/src/script/api/qscriptengine_impl_p.h b/src/script/api/qscriptengine_impl_p.h
index d3dc599..ffc16cd 100644
--- a/src/script/api/qscriptengine_impl_p.h
+++ b/src/script/api/qscriptengine_impl_p.h
@@ -79,21 +79,26 @@ inline QScriptValue::PropertyFlags QScriptEnginePrivate::getPropertyFlags(v8::Ha
}
return flags;
}
-inline v8::Local<v8::Value> QScriptEnginePrivate::getOwnProperty(v8::Handle<v8::Object> object, v8::Handle<v8::Value> propertyName) const
+inline bool QScriptEnginePrivate::hasOwnProperty(v8::Handle<v8::Object> object, v8::Handle<v8::Value> propertyName) const
{
- v8::Local<v8::Value> property = m_originalGlobalObject.getOwnProperty(object, propertyName);
- if (property.IsEmpty()) {
- // Check if the object is not an instance of a script class.
- if (hasInstance(scriptClassTemplate, object)) {
- property = getOwnPropertyFromScriptClassInstance(object, propertyName);
- }
+ Q_ASSERT(object->IsObject());
+ Q_ASSERT(!propertyName.IsEmpty());
+
+ if (object->HasOwnProperty(propertyName->ToString())) {
+ return true;
}
- return property;
+
+ // Check if the object is not an instance of a script class.
+ if (hasInstance(scriptClassTemplate, object)) {
+ return hasOwnPropertyInScriptClassInstance(object, propertyName);
+ }
+
+ return false;
}
-inline v8::Local<v8::Value> QScriptEnginePrivate::getOwnProperty(v8::Handle<v8::Object> object, uint32_t index) const
+inline bool QScriptEnginePrivate::hasOwnProperty(v8::Handle<v8::Object> object, uint32_t index) const
{
- return getOwnProperty(object, v8::Integer::New(index));
+ return hasOwnProperty(object, v8::Integer::New(index));
}
inline v8::Persistent<v8::Context> QScriptEnginePrivate::getCurrentV8Context()
diff --git a/src/script/api/qscriptengine_p.h b/src/script/api/qscriptengine_p.h
index 5e006b4..a4f8a23 100644
--- a/src/script/api/qscriptengine_p.h
+++ b/src/script/api/qscriptengine_p.h
@@ -149,8 +149,8 @@ public:
inline v8::Handle<v8::Value> makeJSValue(QScriptValue::SpecialValue value);
inline v8::Handle<v8::Value> makeJSValue(const QString& value);
inline QScriptValue::PropertyFlags getPropertyFlags(v8::Handle<v8::Object> object, v8::Handle<v8::Value> property, const QScriptValue::ResolveFlags& mode);
- inline v8::Local<v8::Value> getOwnProperty(v8::Handle<v8::Object> object, v8::Handle<v8::Value> property) const;
- inline v8::Local<v8::Value> getOwnProperty(v8::Handle<v8::Object> object, uint32_t index) const;
+ inline bool hasOwnProperty(v8::Handle<v8::Object> object, v8::Handle<v8::Value> property) const;
+ inline bool hasOwnProperty(v8::Handle<v8::Object> object, uint32_t index) const;
inline v8::Persistent<v8::Context> getCurrentV8Context();
QDateTime qtDateTimeFromJS(v8::Handle<v8::Date> jsDate);
@@ -292,7 +292,7 @@ public:
};
private:
Q_DISABLE_COPY(QScriptEnginePrivate)
- v8::Local<v8::Value> getOwnPropertyFromScriptClassInstance(v8::Handle<v8::Object> object, v8::Handle<v8::Value> property) const;
+ bool hasOwnPropertyInScriptClassInstance(v8::Handle<v8::Object> object, v8::Handle<v8::Value> property) const;
QScriptValue::PropertyFlags getPropertyFlagsFromScriptClassInstance(v8::Handle<v8::Object> object, v8::Handle<v8::Value> property, const QScriptValue::ResolveFlags& mode);
v8::Handle<v8::FunctionTemplate> createMetaObjectTemplate();
v8::Handle<v8::FunctionTemplate> createVariantTemplate();
diff --git a/src/script/api/qscriptoriginalglobalobject_p.h b/src/script/api/qscriptoriginalglobalobject_p.h
index 9ab2aa1..dbd0be5 100644
--- a/src/script/api/qscriptoriginalglobalobject_p.h
+++ b/src/script/api/qscriptoriginalglobalobject_p.h
@@ -52,7 +52,6 @@ public:
inline void destroy();
inline QScriptValue::PropertyFlags getPropertyFlags(v8::Handle<v8::Object> object, v8::Handle<v8::Value> property, const QScriptValue::ResolveFlags& mode);
- inline v8::Local<v8::Value> getOwnProperty(v8::Handle<v8::Object> object, v8::Handle<v8::Value> property) const;
inline void installArgFunctionOnOrgStringPrototype(v8::Handle<v8::Function> arg);
inline void defineGetterOrSetter(v8::Handle< v8::Object > recv, v8::Handle< v8::String > prototypeName, v8::Handle< v8::Value > value, uint attribs) const;
inline v8::Local<v8::Object> getOwnPropertyDescriptor(v8::Handle<v8::Object> object, v8::Handle<v8::Value> property) const;
@@ -193,18 +192,6 @@ inline QScriptValue::PropertyFlags QScriptOriginalGlobalObject::getPropertyFlags
return QScriptValue::PropertyFlag(flags);
}
-inline v8::Local<v8::Value> QScriptOriginalGlobalObject::getOwnProperty(v8::Handle<v8::Object> object, v8::Handle<v8::Value> property) const
-{
- Q_ASSERT(object->IsObject());
- Q_ASSERT(!property.IsEmpty());
-
- // FIXME potentially it is slow, as we need to create property descriptor just to check if a property exists.
- v8::Local<v8::Object> descriptor = getOwnPropertyDescriptor(object, property);
- if (descriptor.IsEmpty())
- return descriptor;
- return object->Get(property);
-}
-
inline void QScriptOriginalGlobalObject::installArgFunctionOnOrgStringPrototype(v8::Handle<v8::Function> arg)
{
v8::Object::Cast(*m_stringPrototype)->Set(v8::String::New("arg"), arg);
diff --git a/src/script/api/qscriptvalue_impl_p.h b/src/script/api/qscriptvalue_impl_p.h
index 8f32d6c..64290f7 100644
--- a/src/script/api/qscriptvalue_impl_p.h
+++ b/src/script/api/qscriptvalue_impl_p.h
@@ -910,7 +910,7 @@ inline QScriptPassPointer<QScriptValuePrivate> QScriptValuePrivate::property(T n
// and a property that doesn't exist; in the latter case, we should return an invalid value.
return InvalidValue();
}
- if (!(mode & QScriptValue::ResolvePrototype) && engine()->getOwnProperty(self, name).IsEmpty())
+ if (!(mode & QScriptValue::ResolvePrototype) && !engine()->hasOwnProperty(self, name))
return InvalidValue();
return new QScriptValuePrivate(engine(), result);