} else if (Object *object = values.asObject()) {
ObjectIterator it(object, ObjectIterator::WithProtoChain|ObjectIterator::EnumerableOnly);
while (1) {
- String *name;
- uint index;
- PropertyAttributes attrs;
- Property *p = it.next(&name, &index, &attrs);
- if (!p)
+ Value value;
+ Value key = it.nextPropertyName(&value);
+ if (key.isNull())
break;
- QVariant v = engine->toVariant(object->getValue(ctx, p, attrs), -1);
- if (name)
- query.bindValue(name->toQString(), v);
- else
- query.bindValue(index, v);
+ QVariant v = engine->toVariant(value, -1);
+ if (key.isString()) {
+ query.bindValue(key.stringValue()->toQString(), v);
+ } else {
+ assert(key.isInteger());
+ query.bindValue(key.integerValue(), v);
+ }
}
} else {
query.bindValue(0, engine->toVariant(values, -1));
struct Value;
struct Function;
struct Object;
-struct ObjectIterator;
struct BooleanObject;
struct NumberObject;
struct StringObject;
ObjectIterator it(o, ObjectIterator::EnumerableOnly);
while (1) {
- String *name;
- uint index;
- PropertyAttributes attrs;
- Property *pd = it.next(&name, &index, &attrs);
- if (!pd)
+ Value v;
+ Value name = it.nextPropertyNameAsString(&v);
+ if (name.isNull())
break;
- Value v = o->getValue(ctx, pd, attrs);
- QString key;
- if (name)
- key = name->toQString();
- else
- key = QString::number(index);
+ QString key = name.toQString();
QString member = makeMember(key, v);
if (!member.isEmpty())
partial += member;
ObjectIterator it(o, ObjectIterator::EnumerableOnly);
while (1) {
- PropertyAttributes attributes;
- String *name;
- uint idx;
- Property *p = it.next(&name, &idx, &attributes);
- if (!p)
+ Value v;
+ Value name = it.nextPropertyNameAsString(&v);
+ if (name.isNull())
break;
- Value v = o->getValue(o->engine()->current, p, attributes);
- QString key = name ? name->toQString() : QString::number(idx);
+ QString key = name.toQString();
result.insert(key, toJsonValue(v, visitedObjects));
}
return 0;
}
-Value ObjectIterator::nextPropertyName()
+Value ObjectIterator::nextPropertyName(Value *value)
{
+ PropertyAttributes attrs;
uint index;
String *name;
- next(&name, &index);
+ Property *p = next(&name, &index, &attrs);
+ if (!p)
+ return Value::nullValue();
+
+ if (value)
+ *value = object->getValue(object->engine()->current, p, attrs);
+
if (name)
return Value::fromString(name);
- if (index < UINT_MAX)
- return Value::fromDouble(index);
- return Value::nullValue();
+ assert(index < UINT_MAX);
+ return Value::fromDouble(index);
}
-Value ObjectIterator::nextPropertyNameAsString()
+Value ObjectIterator::nextPropertyNameAsString(Value *value)
{
+ PropertyAttributes attrs;
uint index;
String *name;
- next(&name, &index);
+ Property *p = next(&name, &index, &attrs);
+ if (!p)
+ return Value::nullValue();
+
+ if (value)
+ *value = object->getValue(object->engine()->current, p, attrs);
+
if (name)
return Value::fromString(name);
- if (index < UINT_MAX)
- return __qmljs_to_string(Value::fromDouble(index), object->internalClass->engine->current);
- return Value::nullValue();
+ assert(index < UINT_MAX);
+ return Value::fromString(object->engine()->newString(QString::number(index)));
}
ObjectIterator(Object *o, uint flags);
Property *next(String **name, uint *index, PropertyAttributes *attributes = 0);
- Value nextPropertyName();
- Value nextPropertyNameAsString();
+ Value nextPropertyName(Value *value = 0);
+ Value nextPropertyNameAsString(Value *value = 0);
};
}
ObjectIterator it(o, ObjectIterator::EnumerableOnly);
while (1) {
- uint index;
- String *name;
- Property *pd = it.next(&name, &index);
- if (!pd)
+ Value name = it.nextPropertyNameAsString();
+ if (name.isNull())
break;
- Value key;
- if (name) {
- key = Value::fromString(name);
- } else {
- key = Value::fromDouble(index);
- key = __qmljs_to_string(key, ctx);
- }
- a->push_back(key);
+ a->push_back(name);
}
return Value::fromObject(a);
ObjectIterator it(O, ObjectIterator::NoFlags);
while (1) {
- Value v = it.nextPropertyNameAsString();
- if (v.isNull())
+ Value name = it.nextPropertyNameAsString();
+ if (name.isNull())
break;
- array->push_back(v);
+ array->push_back(name);
}
return array;
}
QV4::ArrayObject *array = currentEngine()->newArrayObject();
ObjectIterator it(o, ObjectIterator::WithProtoChain|ObjectIterator::EnumerableOnly);
while (1) {
- QV4::Value v = it.nextPropertyNameAsString();
- if (v.isNull())
+ QV4::Value name = it.nextPropertyNameAsString();
+ if (name.isNull())
break;
- array->push_back(v);
+ array->push_back(name);
}
return QV4::Value::fromObject(array);
}
ArrayObject *array = currentEngine()->newArrayObject();
ObjectIterator it(o, ObjectIterator::EnumerableOnly);
while (1) {
- QV4::Value v = it.nextPropertyNameAsString();
- if (v.isNull())
+ QV4::Value name = it.nextPropertyNameAsString();
+ if (name.isNull())
break;
- array->push_back(v);
+ array->push_back(name);
}
return QV4::Value::fromObject(array);
}
QV4::ObjectIterator it(o, QV4::ObjectIterator::EnumerableOnly);
while (1) {
- QV4::PropertyAttributes attributes;
- QV4::String *name;
- uint idx;
- QV4::Property *p = it.next(&name, &idx, &attributes);
- if (!p)
+ QV4::Value v;
+ QV4::Value name = it.nextPropertyNameAsString(&v);
+ if (name.isNull())
break;
- QV4::Value v = o->getValue(m_v4Engine->current, p, attributes);
- QString key = name ? name->toQString() : QString::number(idx);
+ QString key = name.toQString();
result.insert(key, variantFromJS(v, visitedObjects));
}
QV4::ExecutionEngine *v4 = object->engine();
QV4::ObjectIterator it(object, QV4::ObjectIterator::WithProtoChain|QV4::ObjectIterator::EnumerableOnly);
while (1) {
- QV4::String *name;
- uint index;
- QV4::PropertyAttributes attrs;
- QV4::Property *p = it.next(&name, &index, &attrs);
- if (!p)
+ QV4::Value propertyValue;
+ QV4::Value propertyName = it.nextPropertyNameAsString(&propertyValue);
+ if (propertyName.isNull())
break;
- QV4::Value propertyName = QV4::Value::fromString(name ? name : v4->newString(QString::number(index)));
- QV4::Value propertyValue = object->getValue(v4->current, p, attrs);
-
// Check if this key exists yet
int roleIndex = -1;
QV4::ExecutionEngine *v4 = object->engine();
QV4::ObjectIterator it(object, QV4::ObjectIterator::WithProtoChain|QV4::ObjectIterator::EnumerableOnly);
while (1) {
- QV4::String *name;
- uint index;
- QV4::PropertyAttributes attrs;
- QV4::Property *p = it.next(&name, &index, &attrs);
- if (!p)
+ QV4::Value propertyValue;
+ QV4::Value propertyName = it.nextPropertyNameAsString(&propertyValue);
+ if (propertyName.isNull())
break;
- QV4::Value propertyName = QV4::Value::fromString(name ? name : v4->newString(QString::number(index)));
- QV4::Value propertyValue = object->getValue(v4->current, p, attrs);
-
// Add the value now
if (QV4::String *s = propertyValue.asString()) {
const ListLayout::Role &r = m_layout->getRoleOrCreate(propertyName, ListLayout::Role::String);