diff options
author | Michael Brasser <michael.brasser@nokia.com> | 2011-10-25 08:52:01 +1000 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2011-10-26 02:11:24 +0200 |
commit | 4e931c4a436ea3dcf6e1921488771aa1e79eda13 (patch) | |
tree | 42ca55bb58cfc827a291e1bca122a901670d8ad0 /src | |
parent | 2413cc1e87c051760210028979b4db8e4c13eca0 (diff) |
Fix "for (... in ...)" loops for list properties.
Task-number: QTBUG-22276
Change-Id: Ibe5a1180044d8e4a6ca6458e8170dd027885ad10
Reviewed-by: Chris Adams <christopher.adams@nokia.com>
Reviewed-by: Kent Hansen <kent.hansen@nokia.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/declarative/qml/v8/qv8listwrapper.cpp | 20 | ||||
-rw-r--r-- | src/declarative/qml/v8/qv8listwrapper_p.h | 1 |
2 files changed, 19 insertions, 2 deletions
diff --git a/src/declarative/qml/v8/qv8listwrapper.cpp b/src/declarative/qml/v8/qv8listwrapper.cpp index 777ce78686..9c1e3205af 100644 --- a/src/declarative/qml/v8/qv8listwrapper.cpp +++ b/src/declarative/qml/v8/qv8listwrapper.cpp @@ -69,11 +69,11 @@ void QV8ListWrapper::init(QV8Engine *engine) { m_engine = engine; v8::Local<v8::FunctionTemplate> ft = v8::FunctionTemplate::New(); - ft->InstanceTemplate()->SetFallbackPropertyHandler(Getter, Setter); + ft->InstanceTemplate()->SetFallbackPropertyHandler(Getter, Setter, 0, 0, Enumerator); ft->InstanceTemplate()->SetIndexedPropertyHandler(IndexedGetter); ft->InstanceTemplate()->SetAccessor(v8::String::New("length"), LengthGetter, 0, v8::Handle<v8::Value>(), v8::DEFAULT, - v8::PropertyAttribute(v8::ReadOnly | v8::DontDelete)); + v8::PropertyAttribute(v8::ReadOnly | v8::DontDelete | v8::DontEnum)); ft->InstanceTemplate()->SetHasExternalResource(true); m_constructor = qPersistentNew<v8::Function>(ft->GetFunction()); } @@ -175,4 +175,20 @@ v8::Handle<v8::Value> QV8ListWrapper::LengthGetter(v8::Local<v8::String> propert return v8::Integer::NewFromUnsigned(count); } +v8::Handle<v8::Array> QV8ListWrapper::Enumerator(const v8::AccessorInfo &info) +{ + QV8ListResource *resource = v8_resource_cast<QV8ListResource>(info.This()); + + if (!resource || resource->object.isNull()) return v8::Array::New(); + + quint32 count = resource->property.count?resource->property.count(&resource->property):0; + + v8::Local<v8::Array> rv = v8::Array::New(count); + + for (int ii = 0; ii < count; ++ii) + rv->Set(ii, v8::Number::New(ii)); + + return rv; +} + QT_END_NAMESPACE diff --git a/src/declarative/qml/v8/qv8listwrapper_p.h b/src/declarative/qml/v8/qv8listwrapper_p.h index 8cbc7db0b8..e18d1eef21 100644 --- a/src/declarative/qml/v8/qv8listwrapper_p.h +++ b/src/declarative/qml/v8/qv8listwrapper_p.h @@ -85,6 +85,7 @@ private: const v8::AccessorInfo &info); static v8::Handle<v8::Value> LengthGetter(v8::Local<v8::String> property, const v8::AccessorInfo &info); + static v8::Handle<v8::Array> Enumerator(const v8::AccessorInfo &info); QV8Engine *m_engine; v8::Persistent<v8::Function> m_constructor; |