#include "MArray.inline.h"
namespace MapleRuntime {
void MArray::ForEachRefFieldInRange(const RefFieldVisitor& visitor, MAddress fieldStart, MIndex fieldEnd) const
{
TypeInfo* componentTi = GetComponentTypeInfo();
MIndex size = fieldEnd - fieldStart;
if (componentTi->IsStructType()) {
GCTib gcTib = componentTi->GetGCTib();
size_t elementSize = GetElementSize();
CHECK(elementSize != 0);
MIndex limit = size / elementSize;
for (MIndex i = 0; i < limit; ++i) {
gcTib.ForEachBitmapWord(fieldStart, visitor);
fieldStart += elementSize;
}
} else if (componentTi->IsObjectType() || componentTi->IsArrayType() || componentTi->IsInterface()) {
RefField<false>* arrayContent = reinterpret_cast<RefField<false>*>(fieldStart);
MIndex upLimit = size / sizeof(RefField<>);
for (MIndex i = 0; i < upLimit; ++i) {
visitor(arrayContent[i]);
}
} else {
LOG(RTLOG_FATAL, "array object %p has wrong component type", this);
}
}
}