CVarRef Globals::getRefByIdx(ssize_t pos, Variant& k) { if (pos < -1) { ArrayData *arr = Array::get(); pos = wrapIter(pos); k = arr->getKey(pos); return arr->getValueRef(pos); } ASSERT(false); throw FatalErrorException("bad code generation"); }
ALWAYS_INLINE typename std::enable_if< std::is_base_of<BaseMap, TMap>::value, Object>::type BaseMap::FromArray(const Class*, const Variant& arr) { if (!arr.isArray()) { SystemLib::throwInvalidArgumentExceptionObject( "Parameter arr must be an array"); } auto map = req::make<TMap>(); ArrayData* ad = arr.getArrayData(); map->reserve(ad->size()); for (ssize_t pos = ad->iter_begin(), limit = ad->iter_end(); pos != limit; pos = ad->iter_advance(pos)) { Variant k = ad->getKey(pos); auto* tv = ad->getValueRef(pos).asCell(); if (k.isInteger()) { map->setRaw(k.toInt64(), tv); } else { assert(k.isString()); map->setRaw(k.getStringData(), tv); } } return Object(std::move(map)); }