Add and use a method for querying whether a property is revisioned.
authorMichael Brasser <michael.brasser@nokia.com>
Tue, 28 Feb 2012 03:03:30 +0000 (13:03 +1000)
committerQt by Nokia <qt-info@nokia.com>
Wed, 29 Feb 2012 00:24:11 +0000 (01:24 +0100)
Accessor data and the revision are now unioned, so querying
the value directly can give incorrect results.

Change-Id: I0ba6c53d8bd6b012507bfb32d33dc414348379b0
Reviewed-by: Chris Adams <christopher.adams@nokia.com>
src/declarative/qml/qdeclarativepropertycache_p.h
src/declarative/qml/v4/qv4irbuilder.cpp
src/declarative/qml/v8/qv8qobjectwrapper.cpp

index d5d7095..301f70b 100644 (file)
@@ -149,6 +149,7 @@ public:
     bool hasOverride() const { return !(flags & IsValueTypeVirtual) &&
                                       !(flags & HasAccessors) &&
                                       overrideIndex >= 0; }
+    bool hasRevision() const { return !(flags & HasAccessors) && revision != 0; }
 
     // Returns -1 if not a value type virtual property
     inline int getValueTypeCoreIndex() const;
index 604eeaa..522bc01 100644 (file)
@@ -437,7 +437,7 @@ bool QV4IRBuilder::visit(AST::IdentifierExpression *ast)
 
                 QDeclarativePropertyData *data = cache->property(name);
 
-                if (data && data->revision != 0) {
+                if (data && data->hasRevision()) {
                     if (qmlVerboseCompiler()) 
                         qWarning() << "*** versioned symbol:" << name;
                     discard();
@@ -458,7 +458,7 @@ bool QV4IRBuilder::visit(AST::IdentifierExpression *ast)
 
                 QDeclarativePropertyData *data = cache->property(name);
 
-                if (data && data->revision != 0) {
+                if (data && data->hasRevision()) {
                     if (qmlVerboseCompiler()) 
                         qWarning() << "*** versioned symbol:" << name;
                     discard();
@@ -609,7 +609,7 @@ bool QV4IRBuilder::visit(AST::FieldMemberExpression *ast)
                 if (!data || data->isFunction())
                     return false; // Don't support methods (or non-existing properties ;)
 
-                if (data->revision != 0) {
+                if (data->hasRevision()) {
                     if (qmlVerboseCompiler()) 
                         qWarning() << "*** versioned symbol:" << name;
                     discard();
index 11733be..9c4e07a 100644 (file)
@@ -513,7 +513,7 @@ v8::Handle<v8::Value> QV8QObjectWrapper::GetProperty(QV8Engine *engine, QObject
     if (!result)
         return v8::Handle<v8::Value>();
 
-    if (revisionMode == QV8QObjectWrapper::CheckRevision && result->revision != 0) {
+    if (revisionMode == QV8QObjectWrapper::CheckRevision && result->hasRevision()) {
         QDeclarativeData *ddata = QDeclarativeData::get(object);
         if (ddata && ddata->propertyCache && !ddata->propertyCache->isAllowedInRevision(result))
             return v8::Handle<v8::Value>();
@@ -673,7 +673,7 @@ bool QV8QObjectWrapper::SetProperty(QV8Engine *engine, QObject *object, const QH
     if (!result)
         return false;
 
-    if (revisionMode == QV8QObjectWrapper::CheckRevision && result->revision != 0) {
+    if (revisionMode == QV8QObjectWrapper::CheckRevision && result->hasRevision()) {
         QDeclarativeData *ddata = QDeclarativeData::get(object);
         if (ddata && ddata->propertyCache && !ddata->propertyCache->isAllowedInRevision(result))
             return false;