Change iter_value() to return TypedValue*

Make internal iterator API return a TypedValue* instead of Variant. This
makes it possible to use the same API to update the value in-place
(except for Set, which returns const TypedValue*) and provide optimized
iterator that avoids unnecessary ref counts.
Esse commit está contido em:
Jan Oravec
2013-05-22 20:07:30 -07:00
commit de sgolemon
commit 817d94ebe1
3 arquivos alterados com 18 adições e 18 exclusões
+6 -6
Ver Arquivo
@@ -274,21 +274,21 @@ Variant ArrayIter::second() {
if (UNLIKELY(m_version != mp->getVersion())) {
throw_collection_modified();
}
return mp->iter_value(m_pos);
return tvAsCVarRef(mp->iter_value(m_pos));
}
case Collection::StableMapType: {
c_StableMap* smp = getStableMap();
if (UNLIKELY(m_version != smp->getVersion())) {
throw_collection_modified();
}
return smp->iter_value(m_pos);
return tvAsCVarRef(smp->iter_value(m_pos));
}
case Collection::SetType: {
c_Set* st = getSet();
if (UNLIKELY(m_version != st->getVersion())) {
throw_collection_modified();
}
return st->iter_value(m_pos);
return tvAsCVarRef(st->iter_value(m_pos));
}
case Collection::PairType: {
return tvAsCVarRef(getPair()->at(m_pos));
@@ -315,7 +315,7 @@ void ArrayIter::secondHelper(Variant& v) {
if (UNLIKELY(m_version != mp->getVersion())) {
throw_collection_modified();
}
v = mp->iter_value(m_pos);
v = tvAsCVarRef(mp->iter_value(m_pos));
break;
}
case Collection::StableMapType: {
@@ -323,7 +323,7 @@ void ArrayIter::secondHelper(Variant& v) {
if (UNLIKELY(m_version != smp->getVersion())) {
throw_collection_modified();
}
v = smp->iter_value(m_pos);
v = tvAsCVarRef(smp->iter_value(m_pos));
break;
}
case Collection::SetType: {
@@ -331,7 +331,7 @@ void ArrayIter::secondHelper(Variant& v) {
if (UNLIKELY(m_version != st->getVersion())) {
throw_collection_modified();
}
v = st->iter_value(m_pos);
v = tvAsCVarRef(st->iter_value(m_pos));
break;
}
case Collection::PairType: {
+9 -9
Ver Arquivo
@@ -1915,10 +1915,10 @@ Variant c_Map::iter_key(ssize_t pos) const {
return (int64_t)p->ikey;
}
Variant c_Map::iter_value(ssize_t pos) const {
TypedValue* c_Map::iter_value(ssize_t pos) const {
assert(pos);
Bucket* p = reinterpret_cast<Bucket*>(pos);
return tvAsCVarRef(&p->data);
return &p->data;
}
void c_Map::throwBadKeyType() {
@@ -2105,7 +2105,7 @@ Variant c_MapIterator::t_current() {
if (!m_pos) {
throw_iterator_not_valid();
}
return mp->iter_value(m_pos);
return tvAsCVarRef(mp->iter_value(m_pos));
}
Variant c_MapIterator::t_key() {
@@ -3011,10 +3011,10 @@ Variant c_StableMap::iter_key(ssize_t pos) const {
return (int64_t)p->ikey;
}
Variant c_StableMap::iter_value(ssize_t pos) const {
TypedValue* c_StableMap::iter_value(ssize_t pos) const {
assert(pos);
Bucket* p = reinterpret_cast<Bucket*>(pos);
return tvAsCVarRef(&p->data);
return &p->data;
}
struct StableMapKeyAccessor {
@@ -3386,7 +3386,7 @@ Variant c_StableMapIterator::t_current() {
if (!m_pos) {
throw_iterator_not_valid();
}
return smp->iter_value(m_pos);
return tvAsCVarRef(smp->iter_value(m_pos));
}
Variant c_StableMapIterator::t_key() {
@@ -4060,10 +4060,10 @@ ssize_t c_Set::iter_prev(ssize_t pos) const {
return 0;
}
Variant c_Set::iter_value(ssize_t pos) const {
const TypedValue* c_Set::iter_value(ssize_t pos) const {
assert(pos);
Bucket* p = reinterpret_cast<Bucket*>(pos);
return tvAsCVarRef(&p->data);
return &p->data;
}
void c_Set::throwBadValueType() {
@@ -4185,7 +4185,7 @@ Variant c_SetIterator::t_current() {
if (!m_pos) {
throw_iterator_not_valid();
}
return st->iter_value(m_pos);
return tvAsCVarRef(st->iter_value(m_pos));
}
Variant c_SetIterator::t_key() {
+3 -3
Ver Arquivo
@@ -472,7 +472,7 @@ class c_Map : public ExtObjectDataFlags<ObjectData::MapAttrInit|
ssize_t iter_next(ssize_t prev) const;
ssize_t iter_prev(ssize_t prev) const;
Variant iter_key(ssize_t pos) const;
Variant iter_value(ssize_t pos) const;
TypedValue* iter_value(ssize_t pos) const;
static void throwBadKeyType() ATTRIBUTE_COLD ATTRIBUTE_NORETURN;
@@ -734,7 +734,7 @@ class c_StableMap : public ExtObjectDataFlags<ObjectData::StableMapAttrInit|
ssize_t iter_next(ssize_t prev) const;
ssize_t iter_prev(ssize_t prev) const;
Variant iter_key(ssize_t pos) const;
Variant iter_value(ssize_t pos) const;
TypedValue* iter_value(ssize_t pos) const;
static void throwBadKeyType() ATTRIBUTE_COLD ATTRIBUTE_NORETURN;
@@ -956,7 +956,7 @@ class c_Set : public ExtObjectDataFlags<ObjectData::SetAttrInit|
ssize_t iter_begin() const;
ssize_t iter_next(ssize_t prev) const;
ssize_t iter_prev(ssize_t prev) const;
Variant iter_value(ssize_t pos) const;
const TypedValue* iter_value(ssize_t pos) const;
static void throwBadValueType() ATTRIBUTE_COLD ATTRIBUTE_NORETURN;