diff options
author | Peter Varga <pvarga@inf.u-szeged.hu> | 2011-06-21 18:06:28 +0200 |
---|---|---|
committer | Jedrzej Nowacki <jedrzej.nowacki@nokia.com> | 2011-06-22 10:41:21 +0200 |
commit | 10e75892de93e49af5b4a45bffc557aa98c7375b (patch) | |
tree | 231d9a4da02263a6781d1d8f3e6a012330687327 | |
parent | 76d56a9fe409a345e446b2113c634fb6c57d267c (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.cpp | 2 | ||||
-rw-r--r-- | src/script/api/qscriptengine.cpp | 6 | ||||
-rw-r--r-- | src/script/api/qscriptengine_impl_p.h | 25 | ||||
-rw-r--r-- | src/script/api/qscriptengine_p.h | 6 | ||||
-rw-r--r-- | src/script/api/qscriptoriginalglobalobject_p.h | 13 | ||||
-rw-r--r-- | src/script/api/qscriptvalue_impl_p.h | 2 |
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); |