diff --git a/hphp/runtime/base/array/array_init.h b/hphp/runtime/base/array/array_init.h index 188b3f62b..0b24e1fbd 100644 --- a/hphp/runtime/base/array/array_init.h +++ b/hphp/runtime/base/array/array_init.h @@ -69,15 +69,27 @@ class ArrayInit { public: enum VectorInit { vectorInit }; enum MapInit { mapInit }; + explicit ArrayInit(ssize_t n); + ArrayInit(ssize_t n, VectorInit) { m_data = CreateVector(n); } + ArrayInit(ssize_t n, MapInit) { m_data = CreateMap(n); } + + ArrayInit(ArrayInit&& other) : m_data(other.m_data) { + other.m_data = nullptr; + } + + ArrayInit(const ArrayInit&) = delete; + ArrayInit& operator=(const ArrayInit&) = delete; + static ArrayData *CreateVector(ssize_t n); static ArrayData *CreateMap(ssize_t n); + ~ArrayInit() { // In case an exception interrupts the initialization. if (m_data) m_data->release(); @@ -269,11 +281,9 @@ public: m_data = nullptr; return ret; } - operator ArrayData *() { return create(); } + static ArrayData *CreateParams(int count, ...); - // this consructor should never be called directly, it is only called from - // generated code. - ArrayInit (ArrayData *data) : m_data(data) {} + private: ArrayData *m_data; }; diff --git a/hphp/runtime/base/shared/shared_variant.cpp b/hphp/runtime/base/shared/shared_variant.cpp index cbde8b2d3..07e55efb7 100644 --- a/hphp/runtime/base/shared/shared_variant.cpp +++ b/hphp/runtime/base/shared/shared_variant.cpp @@ -277,9 +277,12 @@ ArrayData* SharedVariant::loadElems(const SharedMap &sharedMap, assert(is(KindOfArray)); uint count = arrSize(); bool isVector = getIsVector(); - ArrayInit ai = mapInit ? ArrayInit(count, ArrayInit::mapInit) : - isVector ? ArrayInit(count, ArrayInit::vectorInit) : - ArrayInit(count); + + auto ai = + mapInit ? ArrayInit(count, ArrayInit::mapInit) : + isVector ? ArrayInit(count, ArrayInit::vectorInit) : + ArrayInit(count); + if (isVector) { for (uint i = 0; i < count; i++) { ai.set(sharedMap.getValueRef(i));