Skip to content
Browse files
Remove unused fields from ArrayIter
Shrink ArrayIter to 24 bytes by removing unused fields.

The Iter slot still remains at 32 bytes due to alignment. Kill the union in it
and delete its ctor/dtor to make it obvious that it's not constructible.

Reviewed By: ricklavoie

Differential Revision: D13740721

fbshipit-source-id: 0c924ec97f150097969bb6e2b953e917123bad8f
  • Loading branch information
jano authored and hhvm-bot committed Jan 22, 2019
1 parent 12a645b commit b9ab7e60d86d0ab60125152b74ca49dadcfb4bc0
Showing with 6 additions and 16 deletions.
  1. +6 −16 hphp/runtime/base/array-iterator.h
@@ -299,14 +299,8 @@ struct ArrayIter {
const ArrayData* m_data;
ObjectData* m_obj;
// m_pos is used by the array implementation to track the current position
// in the array. Beware that when m_data is null, m_pos is uninitialized.
// Current position. Beware that when m_data is null, m_pos is uninitialized.
ssize_t m_pos;
// to be removed in the next diff
MaybeCountable* m_unused;
UNUSED int m_alsoUnused;
// This is unioned so new_iter_array can initialize it more
// efficiently.
union {
@@ -316,26 +310,22 @@ struct ArrayIter {
uint32_t m_itypeAndNextHelperIdx;

friend struct Iter;


struct alignas(16) Iter {
const ArrayIter& arr() const { return m_u.aiter; }
ArrayIter& arr() { return m_u.aiter; }

Iter() = delete;
~Iter() = delete;
const ArrayIter& arr() const { return m_iter; }
ArrayIter& arr() { return m_iter; }
template <bool Local> bool init(TypedValue* c1);
bool next();
bool nextLocal(const ArrayData*);
void free();

union Data {
Data() {}
ArrayIter aiter;
} m_u;
ArrayIter m_iter;


0 comments on commit b9ab7e6

Please sign in to comment.